[{"data":1,"prerenderedAt":94560},["ShallowReactive",2],{"route-doc-meta:\u002Fuc\u002Fcall\u002FCreate_a_call":3,"page-dates:\u002Fuc\u002Fcall\u002FCreate_a_call":4,"content-\u002Fsections\u002Fuc\u002Fcall\u002FCreate_a_call":3,"guides-sidebar":7},null,{"updatedAt":5,"publishedAt":5,"h":6},"2026-10-23T08:49:52.617Z","54215d83457e",[8,2464,4183,4408,4861,5773,6112,7035,7957,8405,11137,16203,16812,17867,18688,19312,19856,20332,20574,20665,20812,21372,22370,22673,23018,23252,23987,24064,24662,27181,27838,31316,32458,33403,34054,36173,36391,37074,37144,37757,39212,40602,41444,42677,43485,44332,44608,45129,45488,45784,46561,47183,47394,47605,48190,48334,48484,48614,48705,48842,48976,49038,49130,49253,49355,49431,49776,49900,50009,50162,50235,50537,51030,51317,51394,51535,51604,51731,51807,51909,52220,52440,52709,53092,53597,53764,53824,53896,53974,54135,54447,54606,54720,54845,55211,56585,56679,56895,57210,57525,57829,57964,58202,58343,58458,58599,58729,58999,59315,59558,59776,60072,60496,60754,61424,61803,62318,62814,63270,63479,64104,64842,64977,65063,65756,66546,66936,67548,68528,69013,69296,70177,73288,74297,74663,75598,75708,75918,77359,84726,84931,85486,86006,86497,87616,87912,88331,88580,88788,89088,89223,90266,90363,91985,92554,92892,93166,93707],{"id":9,"title":10,"body":11,"description":2451,"extension":2452,"meta":2453,"navigation":2459,"path":2460,"seo":2461,"stem":2462,"__hash__":2463},"guides\u002Fguides\u002Fadvertising_report_metrics_by_integration.md","Advertising Report Metrics by Integration",{"type":12,"value":13,"toc":2432},"minimark",[14,18,21,28,47,54,59,71,98,102,117,144,148,154,259,263,266,292,330,341,345,348,584,588,594,727,731,746,1123,1127,1137,1360,1364,1379,1577,1581,1584,1640,1644,1647,1814,1818,1821,1948,1952,1955,2317,2321,2326,2331,2336,2344,2349,2353],[15,16,10],"h1",{"id":17},"advertising-report-metrics-by-integration",[19,20],"hr",{},[22,23,24],"p",{},[25,26,27],"em",{},"June 12, 2026",[22,29,30,34,35,39,40],{},[31,32,33],"strong",{},"Endpoint:"," ",[36,37,38],"code",{},"GET \u002Fads\u002F{connection_id}\u002Freport"," — ",[41,42,46],"a",{"href":43,"rel":44},"https:\u002F\u002Fdocs.unified.to\u002Fads\u002Freport\u002FList_all_reports",[45],"nofollow","List all reports",[22,48,49,50,53],{},"This is a reference for the metrics returned by the Advertising ",[31,51,52],{},"Report"," endpoint: which metrics each supported integration populates, and how each platform's native field maps onto Unified.to's single normalized reporting model.",[55,56,58],"h2",{"id":57},"how-reports-return-metrics","How reports return metrics",[22,60,61,62,64,65,70],{},"A call to ",[36,63,38],{}," returns an array of ",[41,66,69],{"href":67,"rel":68},"https:\u002F\u002Fdocs.unified.to\u002Fads\u002Freport\u002Fmodel",[45],"Report objects",". Each report describes the performance of an advertising entity over a window, and carries its metrics in a single normalized array:",[22,72,73,74,77,78,34,81,34,86,89,90,93,94,97],{},"The value of the ",[36,75,76],{},"metrics"," array is that it is ",[31,79,80],{},"the same shape regardless of which platform",[31,82,83],{},[36,84,85],{},"connection_id",[31,87,88],{},"points to",". Whether the connection is Meta Ads or LinkedIn, a ",[36,91,92],{},"CLICKS"," metric means the same thing and is read the same way. Behind the scenes, Unified.to handles the platform-specific renaming, the nested-field extraction, and the unit conversions — and where a platform doesn't return a value directly, it computes it. If you ever need the original platform field, it remains available under ",[36,95,96],{},"raw",".",[55,99,101],{"id":100},"the-unified-metric-model","The unified metric model",[22,103,104,105,108,109,112,113,116],{},"Each ad platform reports the same fundamental ideas — a click, an impression, a dollar spent — but names and shapes them differently. A click is ",[36,106,107],{},"clicks"," in Meta, ",[36,110,111],{},"METRIC_CLICKS"," in Google DV360, and ",[36,114,115],{},"Clicks"," in Microsoft Ads. Cost arrives as raw currency in some platforms and as micro-units (millionths of a currency unit) in Google Ads, which must be divided by 1,000,000 before it means anything.",[22,118,119,124,125,128,129,132,133,136,137,140,141,143],{},[41,120,123],{"href":121,"rel":122},"https:\u002F\u002Funified.to\u002F",[45],"Unified.to"," collapses all of that into one vocabulary of ",[31,126,127],{},"92 normalized metrics"," (written in ",[36,130,131],{},"UPPER_SNAKE_CASE","). The tables below show, for each normalized metric, the native field it is sourced from on each of the five integrations mapped in this reference: ",[31,134,135],{},"Meta Ads, Google Ads, Google DV360, LinkedIn, and Microsoft Ads",". A ",[36,138,139],{},"—"," means that integration does not expose the metric, so it will not appear in the ",[36,142,76],{}," array for that connection.",[55,145,147],{"id":146},"coverage-at-a-glance","Coverage at a glance",[22,149,150,151,153],{},"The breadth of the ",[36,152,76],{}," array depends entirely on which integration the connection is for. Not all platforms expose data at the same depth:",[155,156,157,173],"table",{},[158,159,160],"thead",{},[161,162,163,167,170],"tr",{},[164,165,166],"th",{},"Integration",[164,168,169],{},"Metrics returned",[164,171,172],{},"Character of the data",[174,175,176,190,203,216,229,242],"tbody",{},[161,177,178,184,187],{},[179,180,181],"td",{},[31,182,183],{},"LinkedIn",[179,185,186],{},"57 \u002F 92",[179,188,189],{},"Deepest coverage, driven by a large set of social, lead-gen, and \"viral\" (organic amplification) metrics",[161,191,192,197,200],{},[179,193,194],{},[31,195,196],{},"Google DV360",[179,198,199],{},"45 \u002F 92",[179,201,202],{},"Strong on viewability, video engagement, and cost\u002Ffinancial breakdowns",[161,204,205,210,213],{},[179,206,207],{},[31,208,209],{},"Google Ads",[179,211,212],{},"30 \u002F 92",[179,214,215],{},"Broad core coverage plus search-specific and viewability metrics",[161,217,218,223,226],{},[179,219,220],{},[31,221,222],{},"Meta Ads",[179,224,225],{},"19 \u002F 92",[179,227,228],{},"Focused on core performance and detailed video-watch metrics",[161,230,231,236,239],{},[179,232,233],{},[31,234,235],{},"Microsoft Ads",[179,237,238],{},"14 \u002F 92",[179,240,241],{},"Core performance metrics only",[161,243,244,255,257],{},[179,245,246,247,250,251,254],{},"Coverage is highly uneven across the metric set. Of the 92 normalized metrics, ",[31,248,249],{},"60 are returned by only a single integration",", while just ",[31,252,253],{},"8 are returned by all five",". The long tail is dominated by LinkedIn's social and viral metrics and DV360's financial and viewability metrics, which have no equivalent elsewhere. Write your code defensively: check for a metric's presence rather than assuming every report contains it.",[179,256],{},[179,258],{},[55,260,262],{"id":261},"the-universal-core","The universal core",[22,264,265],{},"These eight metrics are the common denominator: every integration mapped here returns them, making them the safe foundation for any cross-connection report or comparison:",[22,267,268,270,271,270,274,270,277,270,280,270,283,270,286,270,289],{},[36,269,92],{}," · ",[36,272,273],{},"IMPRESSIONS",[36,275,276],{},"CONVERSIONS",[36,278,279],{},"COST",[36,281,282],{},"CTR",[36,284,285],{},"CPC",[36,287,288],{},"CONVERSION_VALUE",[36,290,291],{},"CPA",[22,293,294,295,297,298,301,302,305,306,309,310,312,313,316,317,319,320,322,323,325,326,329],{},"Even within this universal set, the source data differs. ",[36,296,279],{}," is ",[36,299,300],{},"spend"," in Meta but arrives in micro-units in Google Ads and as ",[36,303,304],{},"costInLocalCurrency"," in LinkedIn (all normalized to the report's ",[36,307,308],{},"currency","). ",[36,311,276],{}," is a clean field in most platforms but is pulled from Meta's nested ",[36,314,315],{},"actions[purchase]",". And ",[36,318,282],{},", ",[36,321,285],{},", and ",[36,324,291],{}," are all ",[31,327,328],{},"derived"," for LinkedIn — a reminder that \"returned\" sometimes means \"computed for you,\" not \"delivered by the platform.\"",[22,331,332,333,336,337,340],{},"Two near-universal ratios fall just short of full coverage: ",[36,334,335],{},"ROAS"," is derived everywhere it exists but is absent from DV360, and ",[36,338,339],{},"CPM"," is missing only from Google Ads.",[55,342,344],{"id":343},"core-performance-metrics","Core performance metrics",[22,346,347],{},"The headline numbers most reports are built on — volume, cost, and the efficiency ratios derived from them.",[155,349,350,367],{},[158,351,352],{},[161,353,354,357,359,361,363,365],{},[164,355,356],{},"Unified Metric",[164,358,222],{},[164,360,209],{},[164,362,196],{},[164,364,183],{},[164,366,235],{},[174,368,369,385,404,429,448,467,487,510,532,548,567],{},[161,370,371,375,377,379,381,383],{},[179,372,373],{},[36,374,92],{},[179,376,107],{},[179,378,107],{},[179,380,111],{},[179,382,107],{},[179,384,115],{},[161,386,387,391,394,396,399,401],{},[179,388,389],{},[36,390,273],{},[179,392,393],{},"impressions",[179,395,393],{},[179,397,398],{},"METRIC_IMPRESSIONS",[179,400,393],{},[179,402,403],{},"Impressions",[161,405,406,410,417,420,423,426],{},[179,407,408],{},[36,409,276],{},[179,411,412,413],{},"actions",[414,415,416],"span",{},"purchase",[179,418,419],{},"conversions",[179,421,422],{},"METRIC_TOTAL_CONVERSIONS",[179,424,425],{},"externalWebsiteConversions",[179,427,428],{},"Conversions",[161,430,431,435,437,440,443,445],{},[179,432,433],{},[36,434,279],{},[179,436,300],{},[179,438,439],{},"cost_micros (\u002F1e6)",[179,441,442],{},"METRIC_REVENUE_ADVERTISER",[179,444,304],{},[179,446,447],{},"Spend",[161,449,450,454,457,459,462,464],{},[179,451,452],{},[36,453,282],{},[179,455,456],{},"ctr",[179,458,456],{},[179,460,461],{},"METRIC_CTR",[179,463,328],{},[179,465,466],{},"Ctr",[161,468,469,473,476,479,482,484],{},[179,470,471],{},[36,472,285],{},[179,474,475],{},"cpc",[179,477,478],{},"average_cpc (\u002F1e6)",[179,480,481],{},"METRIC_REVENUE_ECPC_ADVERTISER",[179,483,328],{},[179,485,486],{},"AverageCpc",[161,488,489,493,498,501,504,507],{},[179,490,491],{},[36,492,288],{},[179,494,495,496],{},"action_values",[414,497,416],{},[179,499,500],{},"conversions_value",[179,502,503],{},"METRIC_TRUEVIEW_TOTAL_CONVERSION_VALUES_ADVERTISER",[179,505,506],{},"conversionValueInLocalCurrency",[179,508,509],{},"Revenue",[161,511,512,516,521,524,527,529],{},[179,513,514],{},[36,515,291],{},[179,517,518,519],{},"cost_per_action_type",[414,520,416],{},[179,522,523],{},"cost_per_conversion (\u002F1e6)",[179,525,526],{},"METRIC_REVENUE_ECPA_ADVERTISER",[179,528,328],{},[179,530,531],{},"CostPerConversion",[161,533,534,538,540,542,544,546],{},[179,535,536],{},[36,537,335],{},[179,539,328],{},[179,541,328],{},[179,543,139],{},[179,545,328],{},[179,547,328],{},[161,549,550,554,557,559,562,564],{},[179,551,552],{},[36,553,339],{},[179,555,556],{},"cpm",[179,558,139],{},[179,560,561],{},"METRIC_REVENUE_ECPM_ADVERTISER",[179,563,328],{},[179,565,566],{},"AverageCpm",[161,568,569,574,576,578,580,582],{},[179,570,571],{},[36,572,573],{},"ECPM",[179,575,139],{},[179,577,139],{},[179,579,561],{},[179,581,139],{},[179,583,139],{},[55,585,587],{"id":586},"conversion-detail","Conversion detail",[22,589,590,591,97],{},"Beyond the headline conversion count, platforms differ on how they attribute and segment conversions. Google Ads and Microsoft Ads add \"all conversions\" totals and their revenue counterparts; DV360 and LinkedIn distinguish post-click from view-through (post-view) conversions; and Google Ads alone exposes cross-device conversions and raw ",[36,592,593],{},"interactions",[155,595,596,612],{},[158,597,598],{},[161,599,600,602,604,606,608,610],{},[164,601,356],{},[164,603,222],{},[164,605,209],{},[164,607,196],{},[164,609,183],{},[164,611,235],{},[174,613,614,633,654,673,692,710],{},[161,615,616,621,623,625,628,631],{},[179,617,618],{},[36,619,620],{},"POST_CLICK_CONVERSIONS",[179,622,139],{},[179,624,139],{},[179,626,627],{},"METRIC_POST_CLICK_CONVERSIONS",[179,629,630],{},"externalWebsitePostClickConversions",[179,632,139],{},[161,634,635,640,642,645,648,651],{},[179,636,637],{},[36,638,639],{},"VIEW_THROUGH_CONVERSIONS",[179,641,139],{},[179,643,644],{},"view_through_conversions",[179,646,647],{},"METRIC_POST_VIEW_CONVERSIONS",[179,649,650],{},"externalWebsitePostViewConversions",[179,652,653],{},"ViewThroughConversions",[161,655,656,661,663,666,668,670],{},[179,657,658],{},[36,659,660],{},"ALL_CONVERSIONS",[179,662,139],{},[179,664,665],{},"all_conversions",[179,667,139],{},[179,669,139],{},[179,671,672],{},"AllConversions",[161,674,675,680,682,685,687,689],{},[179,676,677],{},[36,678,679],{},"ALL_CONVERSION_VALUE",[179,681,139],{},[179,683,684],{},"all_conversions_value",[179,686,139],{},[179,688,139],{},[179,690,691],{},"AllRevenue",[161,693,694,699,701,704,706,708],{},[179,695,696],{},[36,697,698],{},"CROSS_DEVICE_CONVERSIONS",[179,700,139],{},[179,702,703],{},"cross_device_conversions",[179,705,139],{},[179,707,139],{},[179,709,139],{},[161,711,712,717,719,721,723,725],{},[179,713,714],{},[36,715,716],{},"INTERACTIONS",[179,718,139],{},[179,720,593],{},[179,722,139],{},[179,724,139],{},[179,726,139],{},[55,728,730],{"id":729},"video-engagement","Video engagement",[22,732,733,734,737,738,741,742,745],{},"Video is the most fragmented category, because each platform instruments playback in its own way. Quartile completion (25\u002F50\u002F75\u002F100%) is the one widely shared concept, supported across Meta, Google Ads, DV360, and LinkedIn — though Google Ads reports quartiles as ",[25,735,736],{},"rates"," while the others report counts. From there the platforms diverge: Meta uniquely tracks ",[36,739,740],{},"VIDEO_AVG_TIME_WATCHED"," and ",[36,743,744],{},"VIDEO_THRUPLAY","; DV360 captures rich-media interaction signals like pauses, mutes, skips, and companion-banner activity; and Google Ads surfaces search-driven views.",[155,747,748,764],{},[158,749,750],{},[161,751,752,754,756,758,760,762],{},[164,753,356],{},[164,755,222],{},[164,757,209],{},[164,759,196],{},[164,761,183],{},[164,763,235],{},[174,765,766,787,807,826,847,868,889,908,925,942,960,978,996,1014,1033,1051,1069,1087,1105],{},[161,767,768,773,775,778,781,784],{},[179,769,770],{},[36,771,772],{},"VIDEO_VIEWS",[179,774,139],{},[179,776,777],{},"video_views",[179,779,780],{},"METRIC_TRUEVIEW_VIEWS",[179,782,783],{},"videoViews",[179,785,786],{},"VideoViews",[161,788,789,794,797,799,802,805],{},[179,790,791],{},[36,792,793],{},"VIDEO_PLAYS",[179,795,796],{},"video_play_actions",[179,798,139],{},[179,800,801],{},"METRIC_RICH_MEDIA_VIDEO_PLAYS",[179,803,804],{},"videoStarts",[179,806,139],{},[161,808,809,814,816,818,821,824],{},[179,810,811],{},[36,812,813],{},"VIDEO_COMPLETIONS",[179,815,139],{},[179,817,139],{},[179,819,820],{},"METRIC_RICH_MEDIA_VIDEO_COMPLETIONS",[179,822,823],{},"videoCompletions",[179,825,139],{},[161,827,828,833,836,839,842,845],{},[179,829,830],{},[36,831,832],{},"VIDEO_QUARTILE_25",[179,834,835],{},"video_p25_watched_actions",[179,837,838],{},"video_quartile_p25_rate",[179,840,841],{},"METRIC_RICH_MEDIA_VIDEO_FIRST_QUARTILE_COMPLETES",[179,843,844],{},"videoFirstQuartileCompletions",[179,846,139],{},[161,848,849,854,857,860,863,866],{},[179,850,851],{},[36,852,853],{},"VIDEO_QUARTILE_50",[179,855,856],{},"video_p50_watched_actions",[179,858,859],{},"video_quartile_p50_rate",[179,861,862],{},"METRIC_RICH_MEDIA_VIDEO_MIDPOINTS",[179,864,865],{},"videoMidpointCompletions",[179,867,139],{},[161,869,870,875,878,881,884,887],{},[179,871,872],{},[36,873,874],{},"VIDEO_QUARTILE_75",[179,876,877],{},"video_p75_watched_actions",[179,879,880],{},"video_quartile_p75_rate",[179,882,883],{},"METRIC_RICH_MEDIA_VIDEO_THIRD_QUARTILE_COMPLETES",[179,885,886],{},"videoThirdQuartileCompletions",[179,888,139],{},[161,890,891,896,899,902,904,906],{},[179,892,893],{},[36,894,895],{},"VIDEO_QUARTILE_100",[179,897,898],{},"video_p100_watched_actions",[179,900,901],{},"video_quartile_p100_rate",[179,903,820],{},[179,905,139],{},[179,907,139],{},[161,909,910,914,917,919,921,923],{},[179,911,912],{},[36,913,740],{},[179,915,916],{},"video_avg_time_watched_actions",[179,918,139],{},[179,920,139],{},[179,922,139],{},[179,924,139],{},[161,926,927,931,934,936,938,940],{},[179,928,929],{},[36,930,744],{},[179,932,933],{},"video_thruplay_watched_actions",[179,935,139],{},[179,937,139],{},[179,939,139],{},[179,941,139],{},[161,943,944,949,951,954,956,958],{},[179,945,946],{},[36,947,948],{},"AVERAGE_CPV",[179,950,139],{},[179,952,953],{},"average_cpv (\u002F1e6)",[179,955,139],{},[179,957,139],{},[179,959,139],{},[161,961,962,967,969,971,974,976],{},[179,963,964],{},[36,965,966],{},"EARNED_VIEWS",[179,968,139],{},[179,970,139],{},[179,972,973],{},"METRIC_TRUEVIEW_EARNED_VIEWS",[179,975,139],{},[179,977,139],{},[161,979,980,985,987,989,992,994],{},[179,981,982],{},[36,983,984],{},"UNIQUE_VIEWERS",[179,986,139],{},[179,988,139],{},[179,990,991],{},"METRIC_TRUEVIEW_UNIQUE_VIEWERS",[179,993,139],{},[179,995,139],{},[161,997,998,1003,1005,1008,1010,1012],{},[179,999,1000],{},[36,1001,1002],{},"VIDEO_VIEWS_FROM_SEARCH",[179,1004,139],{},[179,1006,1007],{},"video_views_from_google_search_results",[179,1009,139],{},[179,1011,139],{},[179,1013,139],{},[161,1015,1016,1021,1023,1025,1028,1031],{},[179,1017,1018],{},[36,1019,1020],{},"VIDEO_FULLSCREENS",[179,1022,139],{},[179,1024,139],{},[179,1026,1027],{},"METRIC_RICH_MEDIA_VIDEO_FULL_SCREENS",[179,1029,1030],{},"fullScreenPlays",[179,1032,139],{},[161,1034,1035,1040,1042,1044,1047,1049],{},[179,1036,1037],{},[36,1038,1039],{},"VIDEO_PAUSES",[179,1041,139],{},[179,1043,139],{},[179,1045,1046],{},"METRIC_RICH_MEDIA_VIDEO_PAUSES",[179,1048,139],{},[179,1050,139],{},[161,1052,1053,1058,1060,1062,1065,1067],{},[179,1054,1055],{},[36,1056,1057],{},"VIDEO_MUTES",[179,1059,139],{},[179,1061,139],{},[179,1063,1064],{},"METRIC_RICH_MEDIA_VIDEO_MUTES",[179,1066,139],{},[179,1068,139],{},[161,1070,1071,1076,1078,1080,1083,1085],{},[179,1072,1073],{},[36,1074,1075],{},"VIDEO_SKIPS",[179,1077,139],{},[179,1079,139],{},[179,1081,1082],{},"METRIC_RICH_MEDIA_VIDEO_SKIPS",[179,1084,139],{},[179,1086,139],{},[161,1088,1089,1094,1096,1098,1101,1103],{},[179,1090,1091],{},[36,1092,1093],{},"COMPANION_CLICKS",[179,1095,139],{},[179,1097,139],{},[179,1099,1100],{},"METRIC_RICH_MEDIA_VIDEO_COMPANION_CLICKS",[179,1102,139],{},[179,1104,139],{},[161,1106,1107,1112,1114,1116,1119,1121],{},[179,1108,1109],{},[36,1110,1111],{},"COMPANION_VIEWS",[179,1113,139],{},[179,1115,139],{},[179,1117,1118],{},"METRIC_RICH_MEDIA_VIDEO_COMPANION_VIEWS",[179,1120,139],{},[179,1122,139],{},[55,1124,1126],{"id":1125},"social-engagement","Social engagement",[22,1128,1129,1130,741,1133,1136],{},"Likes, shares, comments, and follows are native to the social-first platforms. LinkedIn reports them directly, and DV360 exposes the YouTube \"earned\" equivalents (earned likes, shares, and subscribers). Curiously, Google Ads maps ",[36,1131,1132],{},"SHARES",[36,1134,1135],{},"SAVES"," onto Gmail-specific forward and save actions — an artifact of how Gmail Ads engagement was instrumented.",[155,1138,1139,1155],{},[158,1140,1141],{},[161,1142,1143,1145,1147,1149,1151,1153],{},[164,1144,356],{},[164,1146,222],{},[164,1148,209],{},[164,1150,196],{},[164,1152,183],{},[164,1154,235],{},[174,1156,1157,1176,1195,1213,1231,1250,1269,1287,1306,1324,1342],{},[161,1158,1159,1164,1166,1168,1171,1174],{},[179,1160,1161],{},[36,1162,1163],{},"ENGAGEMENT",[179,1165,139],{},[179,1167,139],{},[179,1169,1170],{},"METRIC_ENGAGEMENT_RATE",[179,1172,1173],{},"derived (sum)",[179,1175,139],{},[161,1177,1178,1183,1185,1188,1191,1193],{},[179,1179,1180],{},[36,1181,1182],{},"ENGAGEMENTS",[179,1184,139],{},[179,1186,1187],{},"engagements",[179,1189,1190],{},"METRIC_ENGAGEMENTS",[179,1192,139],{},[179,1194,139],{},[161,1196,1197,1202,1204,1206,1208,1211],{},[179,1198,1199],{},[36,1200,1201],{},"TOTAL_ENGAGEMENTS",[179,1203,139],{},[179,1205,139],{},[179,1207,139],{},[179,1209,1210],{},"totalEngagements",[179,1212,139],{},[161,1214,1215,1220,1222,1224,1226,1229],{},[179,1216,1217],{},[36,1218,1219],{},"OTHER_ENGAGEMENTS",[179,1221,139],{},[179,1223,139],{},[179,1225,139],{},[179,1227,1228],{},"otherEngagements",[179,1230,139],{},[161,1232,1233,1238,1240,1242,1245,1248],{},[179,1234,1235],{},[36,1236,1237],{},"LIKES",[179,1239,139],{},[179,1241,139],{},[179,1243,1244],{},"METRIC_TRUEVIEW_EARNED_LIKES",[179,1246,1247],{},"likes",[179,1249,139],{},[161,1251,1252,1256,1258,1261,1264,1267],{},[179,1253,1254],{},[36,1255,1132],{},[179,1257,139],{},[179,1259,1260],{},"gmail_forwards",[179,1262,1263],{},"METRIC_TRUEVIEW_EARNED_SHARES",[179,1265,1266],{},"shares",[179,1268,139],{},[161,1270,1271,1276,1278,1280,1282,1285],{},[179,1272,1273],{},[36,1274,1275],{},"COMMENTS",[179,1277,139],{},[179,1279,139],{},[179,1281,139],{},[179,1283,1284],{},"comments",[179,1286,139],{},[161,1288,1289,1294,1296,1298,1301,1304],{},[179,1290,1291],{},[36,1292,1293],{},"FOLLOWS",[179,1295,139],{},[179,1297,139],{},[179,1299,1300],{},"METRIC_TRUEVIEW_EARNED_SUBSCRIBERS",[179,1302,1303],{},"follows",[179,1305,139],{},[161,1307,1308,1312,1314,1317,1320,1322],{},[179,1309,1310],{},[36,1311,1135],{},[179,1313,139],{},[179,1315,1316],{},"gmail_saves",[179,1318,1319],{},"METRIC_TRUEVIEW_EARNED_PLAYLIST_ADDITIONS",[179,1321,139],{},[179,1323,139],{},[161,1325,1326,1331,1333,1335,1337,1340],{},[179,1327,1328],{},[36,1329,1330],{},"COMMENT_LIKES",[179,1332,139],{},[179,1334,139],{},[179,1336,139],{},[179,1338,1339],{},"commentLikes",[179,1341,139],{},[161,1343,1344,1349,1351,1353,1355,1358],{},[179,1345,1346],{},[36,1347,1348],{},"OPENS",[179,1350,139],{},[179,1352,139],{},[179,1354,139],{},[179,1356,1357],{},"opens",[179,1359,139],{},[55,1361,1363],{"id":1362},"click-and-impression-breakdowns","Click and impression breakdowns",[22,1365,1366,1367,1370,1371,1374,1375,1378],{},"Most of these granular click types are LinkedIn-specific, reflecting its sponsored-content and document-ad formats (card clicks, company-page clicks, text-URL clicks, and so on). Meta contributes ",[36,1368,1369],{},"LANDING_PAGE_CLICKS"," (its ",[36,1372,1373],{},"inline_link_clicks",") and ",[36,1376,1377],{},"UNIQUE_CLICKS",", while LinkedIn adds an approximate unique-impression count.",[155,1380,1381,1397],{},[158,1382,1383],{},[161,1384,1385,1387,1389,1391,1393,1395],{},[164,1386,356],{},[164,1388,222],{},[164,1390,209],{},[164,1392,196],{},[164,1394,183],{},[164,1396,235],{},[174,1398,1399,1416,1434,1452,1470,1488,1506,1524,1542,1559],{},[161,1400,1401,1405,1407,1409,1411,1414],{},[179,1402,1403],{},[36,1404,1369],{},[179,1406,1373],{},[179,1408,139],{},[179,1410,139],{},[179,1412,1413],{},"landingPageClicks",[179,1415,139],{},[161,1417,1418,1423,1425,1427,1429,1432],{},[179,1419,1420],{},[36,1421,1422],{},"AD_UNIT_CLICKS",[179,1424,139],{},[179,1426,139],{},[179,1428,139],{},[179,1430,1431],{},"adUnitClicks",[179,1433,139],{},[161,1435,1436,1441,1443,1445,1447,1450],{},[179,1437,1438],{},[36,1439,1440],{},"CARD_CLICKS",[179,1442,139],{},[179,1444,139],{},[179,1446,139],{},[179,1448,1449],{},"cardClicks",[179,1451,139],{},[161,1453,1454,1459,1461,1463,1465,1468],{},[179,1455,1456],{},[36,1457,1458],{},"CARD_IMPRESSIONS",[179,1460,139],{},[179,1462,139],{},[179,1464,139],{},[179,1466,1467],{},"cardImpressions",[179,1469,139],{},[161,1471,1472,1477,1479,1481,1483,1486],{},[179,1473,1474],{},[36,1475,1476],{},"COMPANY_PAGE_CLICKS",[179,1478,139],{},[179,1480,139],{},[179,1482,139],{},[179,1484,1485],{},"companyPageClicks",[179,1487,139],{},[161,1489,1490,1495,1497,1499,1501,1504],{},[179,1491,1492],{},[36,1493,1494],{},"ACTION_CLICKS",[179,1496,139],{},[179,1498,139],{},[179,1500,139],{},[179,1502,1503],{},"actionClicks",[179,1505,139],{},[161,1507,1508,1513,1515,1517,1519,1522],{},[179,1509,1510],{},[36,1511,1512],{},"TEXT_URL_CLICKS",[179,1514,139],{},[179,1516,139],{},[179,1518,139],{},[179,1520,1521],{},"textUrlClicks",[179,1523,139],{},[161,1525,1526,1531,1533,1536,1538,1540],{},[179,1527,1528],{},[36,1529,1530],{},"GMAIL_SECONDARY_CLICKS",[179,1532,139],{},[179,1534,1535],{},"gmail_secondary_clicks",[179,1537,139],{},[179,1539,139],{},[179,1541,139],{},[161,1543,1544,1548,1551,1553,1555,1557],{},[179,1545,1546],{},[36,1547,1377],{},[179,1549,1550],{},"unique_clicks",[179,1552,139],{},[179,1554,139],{},[179,1556,139],{},[179,1558,139],{},[161,1560,1561,1566,1568,1570,1572,1575],{},[179,1562,1563],{},[36,1564,1565],{},"UNIQUE_IMPRESSIONS",[179,1567,139],{},[179,1569,139],{},[179,1571,139],{},[179,1573,1574],{},"approximateUniqueImpressions",[179,1576,139],{},[55,1578,1580],{"id":1579},"lead-generation","Lead generation",[22,1582,1583],{},"Native lead-form metrics are exclusive to LinkedIn in this mapping, tied to its one-click Lead Gen Forms.",[155,1585,1586,1602],{},[158,1587,1588],{},[161,1589,1590,1592,1594,1596,1598,1600],{},[164,1591,356],{},[164,1593,222],{},[164,1595,209],{},[164,1597,196],{},[164,1599,183],{},[164,1601,235],{},[174,1603,1604,1622],{},[161,1605,1606,1611,1613,1615,1617,1620],{},[179,1607,1608],{},[36,1609,1610],{},"LEADS",[179,1612,139],{},[179,1614,139],{},[179,1616,139],{},[179,1618,1619],{},"oneClickLeads",[179,1621,139],{},[161,1623,1624,1629,1631,1633,1635,1638],{},[179,1625,1626],{},[36,1627,1628],{},"LEAD_FORM_OPENS",[179,1630,139],{},[179,1632,139],{},[179,1634,139],{},[179,1636,1637],{},"oneClickLeadFormOpens",[179,1639,139],{},[55,1641,1643],{"id":1642},"viewability-and-measurement","Viewability and measurement",[22,1645,1646],{},"Viewability — whether an impression was actually seen — is a Google ecosystem strength. Google Ads and DV360 share the Active View family (viewable, measurable, and percent-viewable impressions), DV360 adds billable and eligible impression counts plus average viewable time, and Google Ads contributes top-of-page impression share metrics from search.",[155,1648,1649,1665],{},[158,1650,1651],{},[161,1652,1653,1655,1657,1659,1661,1663],{},[164,1654,356],{},[164,1656,222],{},[164,1658,209],{},[164,1660,196],{},[164,1662,183],{},[164,1664,235],{},[174,1666,1667,1686,1705,1724,1742,1760,1778,1796],{},[161,1668,1669,1674,1676,1679,1682,1684],{},[179,1670,1671],{},[36,1672,1673],{},"VIEWABLE_IMPRESSIONS",[179,1675,139],{},[179,1677,1678],{},"active_view_impressions",[179,1680,1681],{},"METRIC_ACTIVE_VIEW_VIEWABLE_IMPRESSIONS",[179,1683,139],{},[179,1685,139],{},[161,1687,1688,1693,1695,1698,1701,1703],{},[179,1689,1690],{},[36,1691,1692],{},"MEASURABLE_IMPRESSIONS",[179,1694,139],{},[179,1696,1697],{},"active_view_measurable_impressions",[179,1699,1700],{},"METRIC_ACTIVE_VIEW_MEASURABLE_IMPRESSIONS",[179,1702,139],{},[179,1704,139],{},[161,1706,1707,1712,1714,1717,1720,1722],{},[179,1708,1709],{},[36,1710,1711],{},"VIEWABILITY_RATE",[179,1713,139],{},[179,1715,1716],{},"active_view_viewability",[179,1718,1719],{},"METRIC_ACTIVE_VIEW_PCT_VIEWABLE_IMPRESSIONS",[179,1721,139],{},[179,1723,139],{},[161,1725,1726,1731,1733,1735,1738,1740],{},[179,1727,1728],{},[36,1729,1730],{},"BILLABLE_IMPRESSIONS",[179,1732,139],{},[179,1734,139],{},[179,1736,1737],{},"METRIC_BILLABLE_IMPRESSIONS",[179,1739,139],{},[179,1741,139],{},[161,1743,1744,1749,1751,1753,1756,1758],{},[179,1745,1746],{},[36,1747,1748],{},"ELIGIBLE_IMPRESSIONS",[179,1750,139],{},[179,1752,139],{},[179,1754,1755],{},"METRIC_ACTIVE_VIEW_ELIGIBLE_IMPRESSIONS",[179,1757,139],{},[179,1759,139],{},[161,1761,1762,1767,1769,1771,1774,1776],{},[179,1763,1764],{},[36,1765,1766],{},"ACTIVE_VIEW_AVG_TIME",[179,1768,139],{},[179,1770,139],{},[179,1772,1773],{},"METRIC_ACTIVE_VIEW_AVERAGE_VIEWABLE_TIME",[179,1775,139],{},[179,1777,139],{},[161,1779,1780,1785,1787,1790,1792,1794],{},[179,1781,1782],{},[36,1783,1784],{},"ABSOLUTE_TOP_IMPRESSION_SHARE",[179,1786,139],{},[179,1788,1789],{},"absolute_top_impression_percentage",[179,1791,139],{},[179,1793,139],{},[179,1795,139],{},[161,1797,1798,1803,1805,1808,1810,1812],{},[179,1799,1800],{},[36,1801,1802],{},"TOP_IMPRESSION_SHARE",[179,1804,139],{},[179,1806,1807],{},"top_impression_percentage",[179,1809,139],{},[179,1811,139],{},[179,1813,139],{},[55,1815,1817],{"id":1816},"cost-and-financial-breakdowns","Cost and financial breakdowns",[22,1819,1820],{},"DV360 is the only integration that decomposes cost into its component fees — media cost, data fees, platform fees — and reports advertiser-level revenue and profit. This reflects its role as a programmatic buying platform where margin transparency matters.",[155,1822,1823,1839],{},[158,1824,1825],{},[161,1826,1827,1829,1831,1833,1835,1837],{},[164,1828,356],{},[164,1830,222],{},[164,1832,209],{},[164,1834,196],{},[164,1836,183],{},[164,1838,235],{},[174,1840,1841,1858,1876,1894,1912,1930],{},[161,1842,1843,1848,1850,1852,1854,1856],{},[179,1844,1845],{},[36,1846,1847],{},"REVENUE",[179,1849,139],{},[179,1851,139],{},[179,1853,442],{},[179,1855,139],{},[179,1857,139],{},[161,1859,1860,1865,1867,1869,1872,1874],{},[179,1861,1862],{},[36,1863,1864],{},"MEDIA_COST",[179,1866,139],{},[179,1868,139],{},[179,1870,1871],{},"METRIC_MEDIA_COST_ADVERTISER",[179,1873,139],{},[179,1875,139],{},[161,1877,1878,1883,1885,1887,1890,1892],{},[179,1879,1880],{},[36,1881,1882],{},"TOTAL_MEDIA_COST",[179,1884,139],{},[179,1886,139],{},[179,1888,1889],{},"METRIC_TOTAL_MEDIA_COST_ADVERTISER",[179,1891,139],{},[179,1893,139],{},[161,1895,1896,1901,1903,1905,1908,1910],{},[179,1897,1898],{},[36,1899,1900],{},"DATA_FEES",[179,1902,139],{},[179,1904,139],{},[179,1906,1907],{},"METRIC_DATA_COST_ADVERTISER",[179,1909,139],{},[179,1911,139],{},[161,1913,1914,1919,1921,1923,1926,1928],{},[179,1915,1916],{},[36,1917,1918],{},"PLATFORM_FEES",[179,1920,139],{},[179,1922,139],{},[179,1924,1925],{},"METRIC_PLATFORM_FEE_ADVERTISER",[179,1927,139],{},[179,1929,139],{},[161,1931,1932,1937,1939,1941,1944,1946],{},[179,1933,1934],{},[36,1935,1936],{},"PROFIT",[179,1938,139],{},[179,1940,139],{},[179,1942,1943],{},"METRIC_PROFIT_ADVERTISER",[179,1945,139],{},[179,1947,139],{},[55,1949,1951],{"id":1950},"viral-organic-amplification-linkedin","Viral \u002F organic amplification (LinkedIn)",[22,1953,1954],{},"LinkedIn's \"viral\" metrics measure the organic spread of sponsored content — engagement that happens when someone's network sees an ad because a connection interacted with it. This entire 19-metric family is exclusive to LinkedIn and mirrors its standard metrics (impressions, clicks, conversions, video quartiles, leads) but for organically-amplified reach. No other integration models this concept.",[155,1956,1957,1973],{},[158,1958,1959],{},[161,1960,1961,1963,1965,1967,1969,1971],{},[164,1962,356],{},[164,1964,222],{},[164,1966,209],{},[164,1968,196],{},[164,1970,183],{},[164,1972,235],{},[174,1974,1975,1993,2011,2029,2047,2065,2083,2101,2119,2137,2155,2173,2191,2209,2227,2245,2263,2281,2299],{},[161,1976,1977,1982,1984,1986,1988,1991],{},[179,1978,1979],{},[36,1980,1981],{},"VIRAL_IMPRESSIONS",[179,1983,139],{},[179,1985,139],{},[179,1987,139],{},[179,1989,1990],{},"viralImpressions",[179,1992,139],{},[161,1994,1995,2000,2002,2004,2006,2009],{},[179,1996,1997],{},[36,1998,1999],{},"VIRAL_CLICKS",[179,2001,139],{},[179,2003,139],{},[179,2005,139],{},[179,2007,2008],{},"viralClicks",[179,2010,139],{},[161,2012,2013,2018,2020,2022,2024,2027],{},[179,2014,2015],{},[36,2016,2017],{},"VIRAL_LIKES",[179,2019,139],{},[179,2021,139],{},[179,2023,139],{},[179,2025,2026],{},"viralLikes",[179,2028,139],{},[161,2030,2031,2036,2038,2040,2042,2045],{},[179,2032,2033],{},[36,2034,2035],{},"VIRAL_COMMENTS",[179,2037,139],{},[179,2039,139],{},[179,2041,139],{},[179,2043,2044],{},"viralComments",[179,2046,139],{},[161,2048,2049,2054,2056,2058,2060,2063],{},[179,2050,2051],{},[36,2052,2053],{},"VIRAL_SHARES",[179,2055,139],{},[179,2057,139],{},[179,2059,139],{},[179,2061,2062],{},"viralShares",[179,2064,139],{},[161,2066,2067,2072,2074,2076,2078,2081],{},[179,2068,2069],{},[36,2070,2071],{},"VIRAL_FOLLOWS",[179,2073,139],{},[179,2075,139],{},[179,2077,139],{},[179,2079,2080],{},"viralFollows",[179,2082,139],{},[161,2084,2085,2090,2092,2094,2096,2099],{},[179,2086,2087],{},[36,2088,2089],{},"VIRAL_VIDEO_PLAYS",[179,2091,139],{},[179,2093,139],{},[179,2095,139],{},[179,2097,2098],{},"viralVideoStarts",[179,2100,139],{},[161,2102,2103,2108,2110,2112,2114,2117],{},[179,2104,2105],{},[36,2106,2107],{},"VIRAL_VIDEO_VIEWS",[179,2109,139],{},[179,2111,139],{},[179,2113,139],{},[179,2115,2116],{},"viralVideoViews",[179,2118,139],{},[161,2120,2121,2126,2128,2130,2132,2135],{},[179,2122,2123],{},[36,2124,2125],{},"VIRAL_VIDEO_COMPLETIONS",[179,2127,139],{},[179,2129,139],{},[179,2131,139],{},[179,2133,2134],{},"viralVideoCompletions",[179,2136,139],{},[161,2138,2139,2144,2146,2148,2150,2153],{},[179,2140,2141],{},[36,2142,2143],{},"VIRAL_VIDEO_QUARTILE_25",[179,2145,139],{},[179,2147,139],{},[179,2149,139],{},[179,2151,2152],{},"viralVideoFirstQuartileCompletions",[179,2154,139],{},[161,2156,2157,2162,2164,2166,2168,2171],{},[179,2158,2159],{},[36,2160,2161],{},"VIRAL_VIDEO_QUARTILE_50",[179,2163,139],{},[179,2165,139],{},[179,2167,139],{},[179,2169,2170],{},"viralVideoMidpointCompletions",[179,2172,139],{},[161,2174,2175,2180,2182,2184,2186,2189],{},[179,2176,2177],{},[36,2178,2179],{},"VIRAL_VIDEO_QUARTILE_75",[179,2181,139],{},[179,2183,139],{},[179,2185,139],{},[179,2187,2188],{},"viralVideoThirdQuartileCompletions",[179,2190,139],{},[161,2192,2193,2198,2200,2202,2204,2207],{},[179,2194,2195],{},[36,2196,2197],{},"VIRAL_LEADS",[179,2199,139],{},[179,2201,139],{},[179,2203,139],{},[179,2205,2206],{},"viralOneClickLeads",[179,2208,139],{},[161,2210,2211,2216,2218,2220,2222,2225],{},[179,2212,2213],{},[36,2214,2215],{},"VIRAL_LEAD_FORM_OPENS",[179,2217,139],{},[179,2219,139],{},[179,2221,139],{},[179,2223,2224],{},"viralOneClickLeadFormOpens",[179,2226,139],{},[161,2228,2229,2234,2236,2238,2240,2243],{},[179,2230,2231],{},[36,2232,2233],{},"VIRAL_LANDING_PAGE_CLICKS",[179,2235,139],{},[179,2237,139],{},[179,2239,139],{},[179,2241,2242],{},"viralLandingPageClicks",[179,2244,139],{},[161,2246,2247,2252,2254,2256,2258,2261],{},[179,2248,2249],{},[36,2250,2251],{},"VIRAL_CONVERSIONS",[179,2253,139],{},[179,2255,139],{},[179,2257,139],{},[179,2259,2260],{},"viralExternalWebsiteConversions",[179,2262,139],{},[161,2264,2265,2270,2272,2274,2276,2279],{},[179,2266,2267],{},[36,2268,2269],{},"VIRAL_POST_CLICK_CONVERSIONS",[179,2271,139],{},[179,2273,139],{},[179,2275,139],{},[179,2277,2278],{},"viralExternalWebsitePostClickConversions",[179,2280,139],{},[161,2282,2283,2288,2290,2292,2294,2297],{},[179,2284,2285],{},[36,2286,2287],{},"VIRAL_VIEW_THROUGH_CONVERSIONS",[179,2289,139],{},[179,2291,139],{},[179,2293,139],{},[179,2295,2296],{},"viralExternalWebsitePostViewConversions",[179,2298,139],{},[161,2300,2301,2306,2308,2310,2312,2315],{},[179,2302,2303],{},[36,2304,2305],{},"VIRAL_ENGAGEMENTS",[179,2307,139],{},[179,2309,139],{},[179,2311,139],{},[179,2313,2314],{},"viralTotalEngagements",[179,2316,139],{},[55,2318,2320],{"id":2319},"integration-by-integration-takeaways","Integration-by-integration takeaways",[22,2322,2323,2325],{},[31,2324,183],{}," is the deepest integration by a wide margin. Beyond solid core coverage, it owns two large metric families that exist nowhere else: native lead-form metrics and the complete \"viral\" organic-amplification set. If a report needs B2B lead data or organic-reach attribution, LinkedIn is the only source.",[22,2327,2328,2330],{},[31,2329,196],{}," is the choice for media-buying transparency. It uniquely breaks cost into media, data, and platform fees and reports profit, and it offers the richest video-interaction signals (pauses, mutes, skips, companion banners) alongside full Active View viewability.",[22,2332,2333,2335],{},[31,2334,209],{}," provides broad, dependable core coverage plus search-native metrics — impression share, cross-device conversions, and \"all conversions\" rollups. Watch for its two quirks: micro-unit cost fields that need dividing by a million, and quartile metrics expressed as rates rather than counts.",[22,2337,2338,2340,2341,2343],{},[31,2339,222],{}," concentrates on core performance and granular video-watch behavior. Its conversion and value figures come from nested action breakdowns rather than flat fields, so the ",[36,2342,416],{}," action type must be extracted explicitly.",[22,2345,2346,2348],{},[31,2347,235],{}," is the leanest integration, covering the universal core plus video views, view-through conversions, and \"all conversions\" totals — sufficient for standard performance reporting but without engagement, viewability, or social depth.",[55,2350,2352],{"id":2351},"working-with-the-response","Working with the response",[2354,2355,2356,2382,2391,2404,2416],"ul",{},[2357,2358,2359,34,2362,319,2364,319,2366,319,2368,319,2370,319,2372,319,2374,322,2376,2378,2379,2381],"li",{},[31,2360,2361],{},"Build cross-connection reports on the universal eight.",[36,2363,92],{},[36,2365,273],{},[36,2367,276],{},[36,2369,279],{},[36,2371,282],{},[36,2373,285],{},[36,2375,288],{},[36,2377,291],{}," are the only metrics guaranteed to appear in the ",[36,2380,76],{}," array for every integration mapped here.",[2357,2383,2384,2387,2388,2390],{},[31,2385,2386],{},"Check for presence, don't assume it."," With 60 of 92 metrics returned by only one integration, code that reads the ",[36,2389,76],{}," array should handle a metric being absent rather than expecting a fixed set.",[2357,2392,2393,2396,2397,2399,2400,2403],{},[31,2394,2395],{},"Read currency from the report, not the metric."," All monetary metrics are normalized into the report's ",[36,2398,308],{}," field; Google Ads micro-units (",[36,2401,2402],{},"\u002F1e6",") and per-platform conventions are already resolved for you.",[2357,2405,2406,2409,2410,2412,2413,2415],{},[31,2407,2408],{},"Some metrics are computed."," Ratios like ",[36,2411,335],{},", and several of LinkedIn's rates, are derived by Unified.to rather than supplied by the platform — they arrive in the ",[36,2414,76],{}," array all the same.",[2357,2417,2418,34,2421,34,2425,2428,2429,2431],{},[31,2419,2420],{},"Drop to",[31,2422,2423],{},[36,2424,96],{},[31,2426,2427],{},"when you need the original."," Anything platform-specific that the normalized model doesn't capture remains available on the report's ",[36,2430,96],{}," field.",{"title":2433,"searchDepth":2434,"depth":2434,"links":2435},"",2,[2436,2437,2438,2439,2440,2441,2442,2443,2444,2445,2446,2447,2448,2449,2450],{"id":57,"depth":2434,"text":58},{"id":100,"depth":2434,"text":101},{"id":146,"depth":2434,"text":147},{"id":261,"depth":2434,"text":262},{"id":343,"depth":2434,"text":344},{"id":586,"depth":2434,"text":587},{"id":729,"depth":2434,"text":730},{"id":1125,"depth":2434,"text":1126},{"id":1362,"depth":2434,"text":1363},{"id":1579,"depth":2434,"text":1580},{"id":1642,"depth":2434,"text":1643},{"id":1816,"depth":2434,"text":1817},{"id":1950,"depth":2434,"text":1951},{"id":2319,"depth":2434,"text":2320},{"id":2351,"depth":2434,"text":2352},"Endpoint, `GET \u002Fads\u002F{connection_id}\u002Freport` — List all reports","md",{"img":2454,"date":2455,"updated":2456,"tag":2457,"integrations":2458},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fadvertising_report_metrics_by_integration-icon.png","2026-06-12T14:33:00.000Z","2026-10-08T22:42:46.984Z","Guides","metaads, googleads, googledv360, linkedin, microsoftads",true,"\u002Fguides\u002Fadvertising_report_metrics_by_integration",{"title":10,"description":2451},"guides\u002Fadvertising_report_metrics_by_integration","8OwpA6PFXJUkh-MRbS4uEbbi7s6WfvdHlCaEfDJ08AE",{"id":2465,"title":2466,"body":2467,"description":4174,"extension":2452,"meta":4175,"navigation":2459,"path":4179,"seo":4180,"stem":4181,"__hash__":4182},"guides\u002Fguides\u002Fats_to_vector_db_how_to_power_talent_intelligence_with_real_time_data.md","ATS to Vector DB: How to Power Talent Intelligence with Real-Time Data",{"type":12,"value":2468,"toc":4159},[2469,2472,2474,2479,2484,2495,2502,2505,2509,2527,2537,2539,2543,2577,2579,2583,2640,2647,2681,2683,2687,2904,2906,2910,2917,2919,2923,2926,3362,3364,3368,3411,3628,3633,3640,3642,3646,3787,3789,3793,3799,3913,3915,3919,4089,4091,4095,4114,4127,4141,4155],[15,2470,2466],{"id":2471},"ats-to-vector-db-how-to-power-talent-intelligence-with-real-time-data",[19,2473],{},[22,2475,2476],{},[25,2477,2478],{},"October 14, 2025",[22,2480,2481],{},[25,2482,2483],{},"Updated October 2026",[22,2485,2486,2487,2490,2491,2494],{},"With ",[41,2488,123],{"href":121,"rel":2489},[45],", you can build candidate search on your customers' ATS data (Greenhouse, Lever, Workable and other supported ATS integrations) by integrating once with ",[41,2492,123],{"href":121,"rel":2493},[45],"'s ATS API.",[22,2496,2497,2498,2501],{},"You read candidate records through the ATS API, turn each candidate profile (title, skills, experience, education) into text, embed it with ",[41,2499,123],{"href":121,"rel":2500},[45],"'s GenAI API, and upsert the vectors into a vector database such as Pinecone for semantic search and recruiter agents. The ATS data is read at request time.",[22,2503,2504],{},"This guide shows you how to go from ATS to vector DB, step by step, using Unified.to, its GenAI API, and Pinecone.",[55,2506,2508],{"id":2507},"what-does-this-build","What does this build?",[2510,2511,2512,2515,2518,2521,2524],"ol",{},[2357,2513,2514],{},"Fetch candidate data from an ATS in one common schema.",[2357,2516,2517],{},"Turn each candidate profile into text and embed it.",[2357,2519,2520],{},"Store embeddings in a vector database.",[2357,2522,2523],{},"Retrieve the most relevant candidates at query time.",[2357,2525,2526],{},"Use the retrieved context to power recruiter search, ranking, or AI agents.",[22,2528,2529,2532,2533,2536],{},[41,2530,123],{"href":121,"rel":2531},[45]," reads and maps the candidate records from each ATS at request time; chunking, embeddings and vector storage stay in your infrastructure. ",[41,2534,123],{"href":121,"rel":2535},[45]," keeps no customer records at rest; connection credentials and operational metadata are encrypted at rest.",[19,2538],{},[55,2540,2542],{"id":2541},"prerequisites","Prerequisites",[2354,2544,2545,2548,2551,2562,2565,2571],{},[2357,2546,2547],{},"Node.js 22 or later (required by the current Pinecone TypeScript SDK, v9, as of 21 October 2026)",[2357,2549,2550],{},"A Unified.to account with an ATS integration enabled (e.g., Lever, Greenhouse)",[2357,2552,2553,2554,2557,2558,2561],{},"A ",[41,2555,123],{"href":121,"rel":2556},[45]," API key, set as the ",[36,2559,2560],{},"UNIFIED_API_KEY"," environment variable",[2357,2563,2564],{},"Your customer's ATS connection ID",[2357,2566,2553,2567,2570],{},[41,2568,123],{"href":121,"rel":2569},[45]," GenAI connection for an integration that supports embeddings, such as OpenAI (used below), Azure OpenAI, Cohere, Google Gemini or MistralAI",[2357,2572,2573,2574],{},"A Pinecone API key and an index created with dimension 1536, the default output size of ",[36,2575,2576],{},"text-embedding-3-small",[19,2578],{},[55,2580,2582],{"id":2581},"step-1-set-up-your-project","Step 1: Set up your project",[2584,2585,2589],"pre",{"className":2586,"code":2587,"language":2588,"meta":2433,"style":2433},"language-bash shiki shiki-themes github-dark github-dark github-light","mkdir ats-vector-demo\ncd ats-vector-demo\nnpm init -y\nnpm install @unified-api\u002Ftypescript-sdk dotenv @pinecone-database\u002Fpinecone\n","bash",[36,2590,2591,2603,2611,2623],{"__ignoreMap":2433},[414,2592,2595,2599],{"class":2593,"line":2594},"line",1,[414,2596,2598],{"class":2597},"s5n6i","mkdir",[414,2600,2602],{"class":2601},"s4Y1p"," ats-vector-demo\n",[414,2604,2605,2609],{"class":2593,"line":2434},[414,2606,2608],{"class":2607},"sXWYR","cd",[414,2610,2602],{"class":2601},[414,2612,2614,2617,2620],{"class":2593,"line":2613},3,[414,2615,2616],{"class":2597},"npm",[414,2618,2619],{"class":2601}," init",[414,2621,2622],{"class":2607}," -y\n",[414,2624,2626,2628,2631,2634,2637],{"class":2593,"line":2625},4,[414,2627,2616],{"class":2597},[414,2629,2630],{"class":2601}," install",[414,2632,2633],{"class":2601}," @unified-api\u002Ftypescript-sdk",[414,2635,2636],{"class":2601}," dotenv",[414,2638,2639],{"class":2601}," @pinecone-database\u002Fpinecone\n",[22,2641,2642,2643,2646],{},"Add your credentials to ",[36,2644,2645],{},".env",":",[2584,2648,2653],{"className":2649,"code":2650,"language":2651,"meta":2652,"style":2433},"language-plain shiki shiki-themes github-dark github-dark github-light","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_INDEX=your_pinecone_index\n","plain","text",[36,2654,2655,2660,2665,2670,2675],{"__ignoreMap":2433},[414,2656,2657],{"class":2593,"line":2594},[414,2658,2659],{},"UNIFIED_API_KEY=your_unified_api_key\n",[414,2661,2662],{"class":2593,"line":2434},[414,2663,2664],{},"CONNECTION_ATS=your_customer_ats_connection_id\n",[414,2666,2667],{"class":2593,"line":2613},[414,2668,2669],{},"CONNECTION_GENAI=your_genai_connection_id\n",[414,2671,2672],{"class":2593,"line":2625},[414,2673,2674],{},"PINECONE_API_KEY=your_pinecone_api_key\n",[414,2676,2678],{"class":2593,"line":2677},5,[414,2679,2680],{},"PINECONE_INDEX=your_pinecone_index\n",[19,2682],{},[55,2684,2686],{"id":2685},"step-2-initialize-the-sdks","Step 2: Initialize the SDKs",[2584,2688,2692],{"className":2689,"code":2690,"language":2691,"meta":2433,"style":2433},"language-typescript shiki shiki-themes github-dark github-dark github-light","import 'dotenv\u002Fconfig';\nimport { UnifiedTo } from '@unified-api\u002Ftypescript-sdk';\nimport { Pinecone } from '@pinecone-database\u002Fpinecone';\n\nconst {\n  UNIFIED_API_KEY,\n  CONNECTION_ATS,\n  CONNECTION_GENAI,\n  PINECONE_API_KEY,\n  PINECONE_INDEX,\n} = process.env;\n\nconst sdk = new UnifiedTo({\n  security: { jwt: UNIFIED_API_KEY! },\n});\n\nconst pinecone = new Pinecone({ apiKey: PINECONE_API_KEY! });\nconst index = pinecone.index({ name: PINECONE_INDEX! });\n","typescript",[36,2693,2694,2707,2722,2736,2741,2749,2758,2766,2774,2782,2790,2802,2807,2827,2841,2847,2852,2878],{"__ignoreMap":2433},[414,2695,2696,2700,2703],{"class":2593,"line":2594},[414,2697,2699],{"class":2698},"s6ubI","import",[414,2701,2702],{"class":2601}," 'dotenv\u002Fconfig'",[414,2704,2706],{"class":2705},"sAvwS",";\n",[414,2708,2709,2711,2714,2717,2720],{"class":2593,"line":2434},[414,2710,2699],{"class":2698},[414,2712,2713],{"class":2705}," { UnifiedTo } ",[414,2715,2716],{"class":2698},"from",[414,2718,2719],{"class":2601}," '@unified-api\u002Ftypescript-sdk'",[414,2721,2706],{"class":2705},[414,2723,2724,2726,2729,2731,2734],{"class":2593,"line":2613},[414,2725,2699],{"class":2698},[414,2727,2728],{"class":2705}," { Pinecone } ",[414,2730,2716],{"class":2698},[414,2732,2733],{"class":2601}," '@pinecone-database\u002Fpinecone'",[414,2735,2706],{"class":2705},[414,2737,2738],{"class":2593,"line":2625},[414,2739,2740],{"emptyLinePlaceholder":2459},"\n",[414,2742,2743,2746],{"class":2593,"line":2677},[414,2744,2745],{"class":2698},"const",[414,2747,2748],{"class":2705}," {\n",[414,2750,2752,2755],{"class":2593,"line":2751},6,[414,2753,2754],{"class":2607},"  UNIFIED_API_KEY",[414,2756,2757],{"class":2705},",\n",[414,2759,2761,2764],{"class":2593,"line":2760},7,[414,2762,2763],{"class":2607},"  CONNECTION_ATS",[414,2765,2757],{"class":2705},[414,2767,2769,2772],{"class":2593,"line":2768},8,[414,2770,2771],{"class":2607},"  CONNECTION_GENAI",[414,2773,2757],{"class":2705},[414,2775,2777,2780],{"class":2593,"line":2776},9,[414,2778,2779],{"class":2607},"  PINECONE_API_KEY",[414,2781,2757],{"class":2705},[414,2783,2785,2788],{"class":2593,"line":2784},10,[414,2786,2787],{"class":2607},"  PINECONE_INDEX",[414,2789,2757],{"class":2705},[414,2791,2793,2796,2799],{"class":2593,"line":2792},11,[414,2794,2795],{"class":2705},"} ",[414,2797,2798],{"class":2698},"=",[414,2800,2801],{"class":2705}," process.env;\n",[414,2803,2805],{"class":2593,"line":2804},12,[414,2806,2740],{"emptyLinePlaceholder":2459},[414,2808,2810,2812,2815,2818,2821,2824],{"class":2593,"line":2809},13,[414,2811,2745],{"class":2698},[414,2813,2814],{"class":2607}," sdk",[414,2816,2817],{"class":2698}," =",[414,2819,2820],{"class":2698}," new",[414,2822,2823],{"class":2597}," UnifiedTo",[414,2825,2826],{"class":2705},"({\n",[414,2828,2830,2833,2835,2838],{"class":2593,"line":2829},14,[414,2831,2832],{"class":2705},"  security: { jwt: ",[414,2834,2560],{"class":2607},[414,2836,2837],{"class":2698},"!",[414,2839,2840],{"class":2705}," },\n",[414,2842,2844],{"class":2593,"line":2843},15,[414,2845,2846],{"class":2705},"});\n",[414,2848,2850],{"class":2593,"line":2849},16,[414,2851,2740],{"emptyLinePlaceholder":2459},[414,2853,2855,2857,2860,2862,2864,2867,2870,2873,2875],{"class":2593,"line":2854},17,[414,2856,2745],{"class":2698},[414,2858,2859],{"class":2607}," pinecone",[414,2861,2817],{"class":2698},[414,2863,2820],{"class":2698},[414,2865,2866],{"class":2597}," Pinecone",[414,2868,2869],{"class":2705},"({ apiKey: ",[414,2871,2872],{"class":2607},"PINECONE_API_KEY",[414,2874,2837],{"class":2698},[414,2876,2877],{"class":2705}," });\n",[414,2879,2881,2883,2886,2888,2891,2894,2897,2900,2902],{"class":2593,"line":2880},18,[414,2882,2745],{"class":2698},[414,2884,2885],{"class":2607}," index",[414,2887,2817],{"class":2698},[414,2889,2890],{"class":2705}," pinecone.",[414,2892,2893],{"class":2597},"index",[414,2895,2896],{"class":2705},"({ name: ",[414,2898,2899],{"class":2607},"PINECONE_INDEX",[414,2901,2837],{"class":2698},[414,2903,2877],{"class":2705},[19,2905],{},[55,2907,2909],{"id":2908},"step-3-get-your-customers-connection-id","Step 3: Get your customer's connection ID",[22,2911,2912,2913,2916],{},"Before you can fetch candidates, your customer authorizes your app to access their ATS (e.g., Lever, Greenhouse) through Unified.to's embedded authorization flow. Once authorized, you receive a ",[31,2914,2915],{},"connection ID"," for that customer's integration. Store it securely and use it in all API calls for that customer.",[19,2918],{},[55,2920,2922],{"id":2921},"step-4-fetch-candidate-records-and-turn-each-into-text","Step 4: Fetch candidate records and turn each into text",[22,2924,2925],{},"Read candidates from the ATS and flatten each profile into one text block for embedding. Building the same text shape for every candidate keeps embeddings comparable across ATS integrations; fields are filled only where the integration returns them (skills on 44 of 141 candidate integrations, experiences on 54, education on 60, as of 19 October 2026). Leave the name and email out of the embedded text: matching doesn't need them, so store them as metadata if you need them.",[2584,2927,2929],{"className":2689,"code":2928,"language":2691,"meta":2433,"style":2433},"import type { AtsCandidate } from '@unified-api\u002Ftypescript-sdk\u002Fsdk\u002Fmodels\u002Fshared';\n\nexport async function fetchCandidates(connectionId: string): Promise\u003CAtsCandidate[]> {\n  return await sdk.ats.listAtsCandidates({\n    connectionId,\n    limit: 50,\n  });\n}\n\nexport function normalizeResume(candidate: AtsCandidate): string {\n  const experiences = (candidate.experiences ?? [])\n    .map((exp: any) => `${exp.title ?? ''} at ${exp.companyName ?? ''}`)\n    .join('; ');\n\n  const education = (candidate.education ?? [])\n    .map((edu: any) => `${edu.degree ?? ''} in ${edu.fieldOfStudy ?? ''} from ${edu.institution ?? ''}`)\n    .join('; ');\n\n  return [\n    `Title: ${candidate.title ?? ''}`,\n    `Skills: ${(candidate.skills ?? []).join(', ')}`,\n    `Experience: ${experiences}`,\n    `Education: ${education}`,\n  ].join('\\n');\n}\n",[36,2930,2931,2948,2952,2995,3011,3016,3026,3031,3036,3040,3067,3086,3142,3157,3161,3177,3235,3247,3251,3259,3277,3311,3324,3337,3357],{"__ignoreMap":2433},[414,2932,2933,2935,2938,2941,2943,2946],{"class":2593,"line":2594},[414,2934,2699],{"class":2698},[414,2936,2937],{"class":2698}," type",[414,2939,2940],{"class":2705}," { AtsCandidate } ",[414,2942,2716],{"class":2698},[414,2944,2945],{"class":2601}," '@unified-api\u002Ftypescript-sdk\u002Fsdk\u002Fmodels\u002Fshared'",[414,2947,2706],{"class":2705},[414,2949,2950],{"class":2593,"line":2434},[414,2951,2740],{"emptyLinePlaceholder":2459},[414,2953,2954,2957,2960,2963,2966,2969,2973,2975,2978,2981,2983,2986,2989,2992],{"class":2593,"line":2613},[414,2955,2956],{"class":2698},"export",[414,2958,2959],{"class":2698}," async",[414,2961,2962],{"class":2698}," function",[414,2964,2965],{"class":2597}," fetchCandidates",[414,2967,2968],{"class":2705},"(",[414,2970,2972],{"class":2971},"sAzo5","connectionId",[414,2974,2646],{"class":2698},[414,2976,2977],{"class":2607}," string",[414,2979,2980],{"class":2705},")",[414,2982,2646],{"class":2698},[414,2984,2985],{"class":2597}," Promise",[414,2987,2988],{"class":2705},"\u003C",[414,2990,2991],{"class":2597},"AtsCandidate",[414,2993,2994],{"class":2705},"[]> {\n",[414,2996,2997,3000,3003,3006,3009],{"class":2593,"line":2625},[414,2998,2999],{"class":2698},"  return",[414,3001,3002],{"class":2698}," await",[414,3004,3005],{"class":2705}," sdk.ats.",[414,3007,3008],{"class":2597},"listAtsCandidates",[414,3010,2826],{"class":2705},[414,3012,3013],{"class":2593,"line":2677},[414,3014,3015],{"class":2705},"    connectionId,\n",[414,3017,3018,3021,3024],{"class":2593,"line":2751},[414,3019,3020],{"class":2705},"    limit: ",[414,3022,3023],{"class":2607},"50",[414,3025,2757],{"class":2705},[414,3027,3028],{"class":2593,"line":2760},[414,3029,3030],{"class":2705},"  });\n",[414,3032,3033],{"class":2593,"line":2768},[414,3034,3035],{"class":2705},"}\n",[414,3037,3038],{"class":2593,"line":2776},[414,3039,2740],{"emptyLinePlaceholder":2459},[414,3041,3042,3044,3046,3049,3051,3054,3056,3059,3061,3063,3065],{"class":2593,"line":2784},[414,3043,2956],{"class":2698},[414,3045,2962],{"class":2698},[414,3047,3048],{"class":2597}," normalizeResume",[414,3050,2968],{"class":2705},[414,3052,3053],{"class":2971},"candidate",[414,3055,2646],{"class":2698},[414,3057,3058],{"class":2597}," AtsCandidate",[414,3060,2980],{"class":2705},[414,3062,2646],{"class":2698},[414,3064,2977],{"class":2607},[414,3066,2748],{"class":2705},[414,3068,3069,3072,3075,3077,3080,3083],{"class":2593,"line":2792},[414,3070,3071],{"class":2698},"  const",[414,3073,3074],{"class":2607}," experiences",[414,3076,2817],{"class":2698},[414,3078,3079],{"class":2705}," (candidate.experiences ",[414,3081,3082],{"class":2698},"??",[414,3084,3085],{"class":2705}," [])\n",[414,3087,3088,3091,3094,3097,3100,3102,3105,3108,3111,3114,3116,3118,3121,3124,3127,3129,3131,3134,3136,3139],{"class":2593,"line":2804},[414,3089,3090],{"class":2705},"    .",[414,3092,3093],{"class":2597},"map",[414,3095,3096],{"class":2705},"((",[414,3098,3099],{"class":2971},"exp",[414,3101,2646],{"class":2698},[414,3103,3104],{"class":2607}," any",[414,3106,3107],{"class":2705},") ",[414,3109,3110],{"class":2698},"=>",[414,3112,3113],{"class":2601}," `${",[414,3115,3099],{"class":2705},[414,3117,97],{"class":2601},[414,3119,3120],{"class":2705},"title",[414,3122,3123],{"class":2698}," ??",[414,3125,3126],{"class":2601}," ''} at ${",[414,3128,3099],{"class":2705},[414,3130,97],{"class":2601},[414,3132,3133],{"class":2705},"companyName",[414,3135,3123],{"class":2698},[414,3137,3138],{"class":2601}," ''}`",[414,3140,3141],{"class":2705},")\n",[414,3143,3144,3146,3149,3151,3154],{"class":2593,"line":2809},[414,3145,3090],{"class":2705},[414,3147,3148],{"class":2597},"join",[414,3150,2968],{"class":2705},[414,3152,3153],{"class":2601},"'; '",[414,3155,3156],{"class":2705},");\n",[414,3158,3159],{"class":2593,"line":2829},[414,3160,2740],{"emptyLinePlaceholder":2459},[414,3162,3163,3165,3168,3170,3173,3175],{"class":2593,"line":2843},[414,3164,3071],{"class":2698},[414,3166,3167],{"class":2607}," education",[414,3169,2817],{"class":2698},[414,3171,3172],{"class":2705}," (candidate.education ",[414,3174,3082],{"class":2698},[414,3176,3085],{"class":2705},[414,3178,3179,3181,3183,3185,3188,3190,3192,3194,3196,3198,3200,3202,3205,3207,3210,3212,3214,3217,3219,3222,3224,3226,3229,3231,3233],{"class":2593,"line":2849},[414,3180,3090],{"class":2705},[414,3182,3093],{"class":2597},[414,3184,3096],{"class":2705},[414,3186,3187],{"class":2971},"edu",[414,3189,2646],{"class":2698},[414,3191,3104],{"class":2607},[414,3193,3107],{"class":2705},[414,3195,3110],{"class":2698},[414,3197,3113],{"class":2601},[414,3199,3187],{"class":2705},[414,3201,97],{"class":2601},[414,3203,3204],{"class":2705},"degree",[414,3206,3123],{"class":2698},[414,3208,3209],{"class":2601}," ''} in ${",[414,3211,3187],{"class":2705},[414,3213,97],{"class":2601},[414,3215,3216],{"class":2705},"fieldOfStudy",[414,3218,3123],{"class":2698},[414,3220,3221],{"class":2601}," ''} from ${",[414,3223,3187],{"class":2705},[414,3225,97],{"class":2601},[414,3227,3228],{"class":2705},"institution",[414,3230,3123],{"class":2698},[414,3232,3138],{"class":2601},[414,3234,3141],{"class":2705},[414,3236,3237,3239,3241,3243,3245],{"class":2593,"line":2854},[414,3238,3090],{"class":2705},[414,3240,3148],{"class":2597},[414,3242,2968],{"class":2705},[414,3244,3153],{"class":2601},[414,3246,3156],{"class":2705},[414,3248,3249],{"class":2593,"line":2880},[414,3250,2740],{"emptyLinePlaceholder":2459},[414,3252,3254,3256],{"class":2593,"line":3253},19,[414,3255,2999],{"class":2698},[414,3257,3258],{"class":2705}," [\n",[414,3260,3262,3265,3267,3269,3271,3273,3275],{"class":2593,"line":3261},20,[414,3263,3264],{"class":2601},"    `Title: ${",[414,3266,3053],{"class":2705},[414,3268,97],{"class":2601},[414,3270,3120],{"class":2705},[414,3272,3123],{"class":2698},[414,3274,3138],{"class":2601},[414,3276,2757],{"class":2705},[414,3278,3280,3283,3285,3287,3289,3292,3294,3297,3299,3301,3304,3306,3309],{"class":2593,"line":3279},21,[414,3281,3282],{"class":2601},"    `Skills: ${",[414,3284,2968],{"class":2601},[414,3286,3053],{"class":2705},[414,3288,97],{"class":2601},[414,3290,3291],{"class":2705},"skills",[414,3293,3123],{"class":2698},[414,3295,3296],{"class":2601}," []).",[414,3298,3148],{"class":2597},[414,3300,2968],{"class":2601},[414,3302,3303],{"class":2601},"', '",[414,3305,2980],{"class":2601},[414,3307,3308],{"class":2601},"}`",[414,3310,2757],{"class":2705},[414,3312,3314,3317,3320,3322],{"class":2593,"line":3313},22,[414,3315,3316],{"class":2601},"    `Experience: ${",[414,3318,3319],{"class":2705},"experiences",[414,3321,3308],{"class":2601},[414,3323,2757],{"class":2705},[414,3325,3327,3330,3333,3335],{"class":2593,"line":3326},23,[414,3328,3329],{"class":2601},"    `Education: ${",[414,3331,3332],{"class":2705},"education",[414,3334,3308],{"class":2601},[414,3336,2757],{"class":2705},[414,3338,3340,3343,3345,3347,3350,3353,3355],{"class":2593,"line":3339},24,[414,3341,3342],{"class":2705},"  ].",[414,3344,3148],{"class":2597},[414,3346,2968],{"class":2705},[414,3348,3349],{"class":2601},"'",[414,3351,3352],{"class":2607},"\\n",[414,3354,3349],{"class":2601},[414,3356,3156],{"class":2705},[414,3358,3360],{"class":2593,"line":3359},25,[414,3361,3035],{"class":2705},[19,3363],{},[55,3365,3367],{"id":3366},"step-5-embed-candidate-profiles-with-the-genai-api","Step 5: Embed candidate profiles with the GenAI API",[22,3369,3370,3371,3374,3375,3378,3379,3382,3383,3386,3387,3390,3391,3394,3395,3398,3399,3402,3403,3406,3407,3410],{},"Use ",[41,3372,123],{"href":121,"rel":3373},[45],"'s GenAI embedding endpoint. Note ",[36,3376,3377],{},"content"," is an array of ",[36,3380,3381],{},"{ text }"," objects. The encoding field is spelled ",[36,3384,3385],{},"enconding_format"," in the API schema (",[36,3388,3389],{},"encondingFormat"," in the TypeScript SDK) and takes ",[36,3392,3393],{},"FLOAT","; ",[36,3396,3397],{},"type"," distinguishes documents you index (",[36,3400,3401],{},"SEARCH_DOC",") from the recruiter query (",[36,3404,3405],{},"SEARCH_QUERY","). The ",[36,3408,3409],{},"embeddings"," field returns a JSON string, so parse it before use.",[2584,3412,3414],{"className":2689,"code":3413,"language":2691,"meta":2433,"style":2433},"export async function embed(text: string, kind: 'SEARCH_DOC' | 'SEARCH_QUERY'): Promise\u003Cnumber[]> {\n  const result = await sdk.genai.createGenaiEmbedding({\n    connectionId: CONNECTION_GENAI!,\n    genaiEmbedding: {\n      modelId: 'text-embedding-3-small',\n      content: [{ text }],\n      encondingFormat: 'FLOAT', \u002F\u002F spelled this way in the API schema\n      type: kind,\n      dimension: 1536,\n    },\n  });\n\n  \u002F\u002F `embeddings` is a JSON string: one vector, or a list holding one vector per content item.\n  const parsed = JSON.parse(result.embeddings ?? '[]');\n  return Array.isArray(parsed[0]) ? parsed[0] : parsed;\n}\n",[36,3415,3416,3464,3483,3495,3500,3510,3515,3529,3534,3544,3549,3553,3557,3562,3589,3624],{"__ignoreMap":2433},[414,3417,3418,3420,3422,3424,3427,3429,3431,3433,3435,3437,3440,3442,3445,3448,3451,3453,3455,3457,3459,3462],{"class":2593,"line":2594},[414,3419,2956],{"class":2698},[414,3421,2959],{"class":2698},[414,3423,2962],{"class":2698},[414,3425,3426],{"class":2597}," embed",[414,3428,2968],{"class":2705},[414,3430,2652],{"class":2971},[414,3432,2646],{"class":2698},[414,3434,2977],{"class":2607},[414,3436,319],{"class":2705},[414,3438,3439],{"class":2971},"kind",[414,3441,2646],{"class":2698},[414,3443,3444],{"class":2601}," 'SEARCH_DOC'",[414,3446,3447],{"class":2698}," |",[414,3449,3450],{"class":2601}," 'SEARCH_QUERY'",[414,3452,2980],{"class":2705},[414,3454,2646],{"class":2698},[414,3456,2985],{"class":2597},[414,3458,2988],{"class":2705},[414,3460,3461],{"class":2607},"number",[414,3463,2994],{"class":2705},[414,3465,3466,3468,3471,3473,3475,3478,3481],{"class":2593,"line":2434},[414,3467,3071],{"class":2698},[414,3469,3470],{"class":2607}," result",[414,3472,2817],{"class":2698},[414,3474,3002],{"class":2698},[414,3476,3477],{"class":2705}," sdk.genai.",[414,3479,3480],{"class":2597},"createGenaiEmbedding",[414,3482,2826],{"class":2705},[414,3484,3485,3488,3491,3493],{"class":2593,"line":2613},[414,3486,3487],{"class":2705},"    connectionId: ",[414,3489,3490],{"class":2607},"CONNECTION_GENAI",[414,3492,2837],{"class":2698},[414,3494,2757],{"class":2705},[414,3496,3497],{"class":2593,"line":2625},[414,3498,3499],{"class":2705},"    genaiEmbedding: {\n",[414,3501,3502,3505,3508],{"class":2593,"line":2677},[414,3503,3504],{"class":2705},"      modelId: ",[414,3506,3507],{"class":2601},"'text-embedding-3-small'",[414,3509,2757],{"class":2705},[414,3511,3512],{"class":2593,"line":2751},[414,3513,3514],{"class":2705},"      content: [{ text }],\n",[414,3516,3517,3520,3523,3525],{"class":2593,"line":2760},[414,3518,3519],{"class":2705},"      encondingFormat: ",[414,3521,3522],{"class":2601},"'FLOAT'",[414,3524,319],{"class":2705},[414,3526,3528],{"class":3527},"sxXm1","\u002F\u002F spelled this way in the API schema\n",[414,3530,3531],{"class":2593,"line":2768},[414,3532,3533],{"class":2705},"      type: kind,\n",[414,3535,3536,3539,3542],{"class":2593,"line":2776},[414,3537,3538],{"class":2705},"      dimension: ",[414,3540,3541],{"class":2607},"1536",[414,3543,2757],{"class":2705},[414,3545,3546],{"class":2593,"line":2784},[414,3547,3548],{"class":2705},"    },\n",[414,3550,3551],{"class":2593,"line":2792},[414,3552,3030],{"class":2705},[414,3554,3555],{"class":2593,"line":2804},[414,3556,2740],{"emptyLinePlaceholder":2459},[414,3558,3559],{"class":2593,"line":2809},[414,3560,3561],{"class":3527},"  \u002F\u002F `embeddings` is a JSON string: one vector, or a list holding one vector per content item.\n",[414,3563,3564,3566,3569,3571,3574,3576,3579,3582,3584,3587],{"class":2593,"line":2829},[414,3565,3071],{"class":2698},[414,3567,3568],{"class":2607}," parsed",[414,3570,2817],{"class":2698},[414,3572,3573],{"class":2607}," JSON",[414,3575,97],{"class":2705},[414,3577,3578],{"class":2597},"parse",[414,3580,3581],{"class":2705},"(result.embeddings ",[414,3583,3082],{"class":2698},[414,3585,3586],{"class":2601}," '[]'",[414,3588,3156],{"class":2705},[414,3590,3591,3593,3596,3599,3602,3605,3608,3611,3614,3616,3619,3621],{"class":2593,"line":2843},[414,3592,2999],{"class":2698},[414,3594,3595],{"class":2705}," Array.",[414,3597,3598],{"class":2597},"isArray",[414,3600,3601],{"class":2705},"(parsed[",[414,3603,3604],{"class":2607},"0",[414,3606,3607],{"class":2705},"]) ",[414,3609,3610],{"class":2698},"?",[414,3612,3613],{"class":2705}," parsed[",[414,3615,3604],{"class":2607},[414,3617,3618],{"class":2705},"] ",[414,3620,2646],{"class":2698},[414,3622,3623],{"class":2705}," parsed;\n",[414,3625,3626],{"class":2593,"line":2849},[414,3627,3035],{"class":2705},[3629,3630,3632],"h3",{"id":3631},"keeping-the-vector-index-current","Keeping the vector index current",[22,3634,3635,3636,3639],{},"To keep the index current, subscribe to candidate created and updated events on supported integrations: 92 ATS integrations emit candidate events (as of 20 October 2026), including Greenhouse, Lever and Workable. When a candidate changes, re-read it, re-embed and upsert. Where the ATS sends no webhooks, ",[41,3637,123],{"href":121,"rel":3638},[45],"'s virtual webhooks check at an interval you set, as often as every minute on paid plans.",[19,3641],{},[55,3643,3645],{"id":3644},"step-6-upsert-embeddings-to-pinecone","Step 6: Upsert embeddings to Pinecone",[2584,3647,3649],{"className":2689,"code":3648,"language":2691,"meta":2433,"style":2433},"export async function upsertCandidate(candidate: AtsCandidate, values: number[]) {\n  await index.upsert({\n    records: [\n      {\n        id: candidate.id!,\n        values,\n        metadata: {\n          name: candidate.name ?? '',\n          email: candidate.emails?.[0]?.email ?? '',\n          candidate_id: candidate.id ?? '',\n        },\n      },\n    ],\n  });\n}\n",[36,3650,3651,3683,3696,3701,3706,3715,3720,3725,3737,3753,3764,3769,3774,3779,3783],{"__ignoreMap":2433},[414,3652,3653,3655,3657,3659,3662,3664,3666,3668,3670,3672,3675,3677,3680],{"class":2593,"line":2594},[414,3654,2956],{"class":2698},[414,3656,2959],{"class":2698},[414,3658,2962],{"class":2698},[414,3660,3661],{"class":2597}," upsertCandidate",[414,3663,2968],{"class":2705},[414,3665,3053],{"class":2971},[414,3667,2646],{"class":2698},[414,3669,3058],{"class":2597},[414,3671,319],{"class":2705},[414,3673,3674],{"class":2971},"values",[414,3676,2646],{"class":2698},[414,3678,3679],{"class":2607}," number",[414,3681,3682],{"class":2705},"[]) {\n",[414,3684,3685,3688,3691,3694],{"class":2593,"line":2434},[414,3686,3687],{"class":2698},"  await",[414,3689,3690],{"class":2705}," index.",[414,3692,3693],{"class":2597},"upsert",[414,3695,2826],{"class":2705},[414,3697,3698],{"class":2593,"line":2613},[414,3699,3700],{"class":2705},"    records: [\n",[414,3702,3703],{"class":2593,"line":2625},[414,3704,3705],{"class":2705},"      {\n",[414,3707,3708,3711,3713],{"class":2593,"line":2677},[414,3709,3710],{"class":2705},"        id: candidate.id",[414,3712,2837],{"class":2698},[414,3714,2757],{"class":2705},[414,3716,3717],{"class":2593,"line":2751},[414,3718,3719],{"class":2705},"        values,\n",[414,3721,3722],{"class":2593,"line":2760},[414,3723,3724],{"class":2705},"        metadata: {\n",[414,3726,3727,3730,3732,3735],{"class":2593,"line":2768},[414,3728,3729],{"class":2705},"          name: candidate.name ",[414,3731,3082],{"class":2698},[414,3733,3734],{"class":2601}," ''",[414,3736,2757],{"class":2705},[414,3738,3739,3742,3744,3747,3749,3751],{"class":2593,"line":2776},[414,3740,3741],{"class":2705},"          email: candidate.emails?.[",[414,3743,3604],{"class":2607},[414,3745,3746],{"class":2705},"]?.email ",[414,3748,3082],{"class":2698},[414,3750,3734],{"class":2601},[414,3752,2757],{"class":2705},[414,3754,3755,3758,3760,3762],{"class":2593,"line":2784},[414,3756,3757],{"class":2705},"          candidate_id: candidate.id ",[414,3759,3082],{"class":2698},[414,3761,3734],{"class":2601},[414,3763,2757],{"class":2705},[414,3765,3766],{"class":2593,"line":2792},[414,3767,3768],{"class":2705},"        },\n",[414,3770,3771],{"class":2593,"line":2804},[414,3772,3773],{"class":2705},"      },\n",[414,3775,3776],{"class":2593,"line":2809},[414,3777,3778],{"class":2705},"    ],\n",[414,3780,3781],{"class":2593,"line":2829},[414,3782,3030],{"class":2705},[414,3784,3785],{"class":2593,"line":2843},[414,3786,3035],{"class":2705},[19,3788],{},[55,3790,3792],{"id":3791},"step-7-retrieval","Step 7: Retrieval",[22,3794,3795,3796,3798],{},"Given a recruiter query, embed it with ",[36,3797,3405],{}," and search Pinecone for the closest candidates.",[2584,3800,3802],{"className":2689,"code":3801,"language":2691,"meta":2433,"style":2433},"export async function searchCandidates(query: string) {\n  const queryVector = await embed(query, 'SEARCH_QUERY');\n\n  const results = await index.query({\n    vector: queryVector,\n    topK: 5,\n    includeMetadata: true,\n  });\n\n  return results.matches;\n}\n",[36,3803,3804,3827,3848,3852,3869,3874,3884,3894,3898,3902,3909],{"__ignoreMap":2433},[414,3805,3806,3808,3810,3812,3815,3817,3820,3822,3824],{"class":2593,"line":2594},[414,3807,2956],{"class":2698},[414,3809,2959],{"class":2698},[414,3811,2962],{"class":2698},[414,3813,3814],{"class":2597}," searchCandidates",[414,3816,2968],{"class":2705},[414,3818,3819],{"class":2971},"query",[414,3821,2646],{"class":2698},[414,3823,2977],{"class":2607},[414,3825,3826],{"class":2705},") {\n",[414,3828,3829,3831,3834,3836,3838,3840,3843,3846],{"class":2593,"line":2434},[414,3830,3071],{"class":2698},[414,3832,3833],{"class":2607}," queryVector",[414,3835,2817],{"class":2698},[414,3837,3002],{"class":2698},[414,3839,3426],{"class":2597},[414,3841,3842],{"class":2705},"(query, ",[414,3844,3845],{"class":2601},"'SEARCH_QUERY'",[414,3847,3156],{"class":2705},[414,3849,3850],{"class":2593,"line":2613},[414,3851,2740],{"emptyLinePlaceholder":2459},[414,3853,3854,3856,3859,3861,3863,3865,3867],{"class":2593,"line":2625},[414,3855,3071],{"class":2698},[414,3857,3858],{"class":2607}," results",[414,3860,2817],{"class":2698},[414,3862,3002],{"class":2698},[414,3864,3690],{"class":2705},[414,3866,3819],{"class":2597},[414,3868,2826],{"class":2705},[414,3870,3871],{"class":2593,"line":2677},[414,3872,3873],{"class":2705},"    vector: queryVector,\n",[414,3875,3876,3879,3882],{"class":2593,"line":2751},[414,3877,3878],{"class":2705},"    topK: ",[414,3880,3881],{"class":2607},"5",[414,3883,2757],{"class":2705},[414,3885,3886,3889,3892],{"class":2593,"line":2760},[414,3887,3888],{"class":2705},"    includeMetadata: ",[414,3890,3891],{"class":2607},"true",[414,3893,2757],{"class":2705},[414,3895,3896],{"class":2593,"line":2768},[414,3897,3030],{"class":2705},[414,3899,3900],{"class":2593,"line":2776},[414,3901,2740],{"emptyLinePlaceholder":2459},[414,3903,3904,3906],{"class":2593,"line":2784},[414,3905,2999],{"class":2698},[414,3907,3908],{"class":2705}," results.matches;\n",[414,3910,3911],{"class":2593,"line":2792},[414,3912,3035],{"class":2705},[19,3914],{},[55,3916,3918],{"id":3917},"step-8-putting-it-together","Step 8: Putting it together",[2584,3920,3922],{"className":2689,"code":3921,"language":2691,"meta":2433,"style":2433},"async function main() {\n  const candidates = await fetchCandidates(CONNECTION_ATS!);\n\n  for (const candidate of candidates) {\n    const resumeText = normalizeResume(candidate);\n    const values = await embed(resumeText, 'SEARCH_DOC');\n    await upsertCandidate(candidate, values);\n  }\n\n  const matches = await searchCandidates('Senior Python developer with fintech experience');\n  console.log('Top matches:', matches);\n}\n\nmain();\n",[36,3923,3924,3937,3959,3963,3982,3997,4018,4028,4033,4037,4057,4073,4077,4081],{"__ignoreMap":2433},[414,3925,3926,3929,3931,3934],{"class":2593,"line":2594},[414,3927,3928],{"class":2698},"async",[414,3930,2962],{"class":2698},[414,3932,3933],{"class":2597}," main",[414,3935,3936],{"class":2705},"() {\n",[414,3938,3939,3941,3944,3946,3948,3950,3952,3955,3957],{"class":2593,"line":2434},[414,3940,3071],{"class":2698},[414,3942,3943],{"class":2607}," candidates",[414,3945,2817],{"class":2698},[414,3947,3002],{"class":2698},[414,3949,2965],{"class":2597},[414,3951,2968],{"class":2705},[414,3953,3954],{"class":2607},"CONNECTION_ATS",[414,3956,2837],{"class":2698},[414,3958,3156],{"class":2705},[414,3960,3961],{"class":2593,"line":2613},[414,3962,2740],{"emptyLinePlaceholder":2459},[414,3964,3965,3968,3971,3973,3976,3979],{"class":2593,"line":2625},[414,3966,3967],{"class":2698},"  for",[414,3969,3970],{"class":2705}," (",[414,3972,2745],{"class":2698},[414,3974,3975],{"class":2607}," candidate",[414,3977,3978],{"class":2698}," of",[414,3980,3981],{"class":2705}," candidates) {\n",[414,3983,3984,3987,3990,3992,3994],{"class":2593,"line":2677},[414,3985,3986],{"class":2698},"    const",[414,3988,3989],{"class":2607}," resumeText",[414,3991,2817],{"class":2698},[414,3993,3048],{"class":2597},[414,3995,3996],{"class":2705},"(candidate);\n",[414,3998,3999,4001,4004,4006,4008,4010,4013,4016],{"class":2593,"line":2751},[414,4000,3986],{"class":2698},[414,4002,4003],{"class":2607}," values",[414,4005,2817],{"class":2698},[414,4007,3002],{"class":2698},[414,4009,3426],{"class":2597},[414,4011,4012],{"class":2705},"(resumeText, ",[414,4014,4015],{"class":2601},"'SEARCH_DOC'",[414,4017,3156],{"class":2705},[414,4019,4020,4023,4025],{"class":2593,"line":2760},[414,4021,4022],{"class":2698},"    await",[414,4024,3661],{"class":2597},[414,4026,4027],{"class":2705},"(candidate, values);\n",[414,4029,4030],{"class":2593,"line":2768},[414,4031,4032],{"class":2705},"  }\n",[414,4034,4035],{"class":2593,"line":2776},[414,4036,2740],{"emptyLinePlaceholder":2459},[414,4038,4039,4041,4044,4046,4048,4050,4052,4055],{"class":2593,"line":2784},[414,4040,3071],{"class":2698},[414,4042,4043],{"class":2607}," matches",[414,4045,2817],{"class":2698},[414,4047,3002],{"class":2698},[414,4049,3814],{"class":2597},[414,4051,2968],{"class":2705},[414,4053,4054],{"class":2601},"'Senior Python developer with fintech experience'",[414,4056,3156],{"class":2705},[414,4058,4059,4062,4065,4067,4070],{"class":2593,"line":2792},[414,4060,4061],{"class":2705},"  console.",[414,4063,4064],{"class":2597},"log",[414,4066,2968],{"class":2705},[414,4068,4069],{"class":2601},"'Top matches:'",[414,4071,4072],{"class":2705},", matches);\n",[414,4074,4075],{"class":2593,"line":2804},[414,4076,3035],{"class":2705},[414,4078,4079],{"class":2593,"line":2809},[414,4080,2740],{"emptyLinePlaceholder":2459},[414,4082,4083,4086],{"class":2593,"line":2829},[414,4084,4085],{"class":2597},"main",[414,4087,4088],{"class":2705},"();\n",[19,4090],{},[55,4092,4094],{"id":4093},"what-did-you-build","What did you build?",[2354,4096,4097,4100,4107],{},[2357,4098,4099],{},"One list call per connection reads candidate records from the customer's ATS (Greenhouse, Lever and other supported integrations); page with limit and offset for more than one page.",[2357,4101,4102,4103,4106],{},"Candidate profiles are embedded through ",[41,4104,123],{"href":121,"rel":4105},[45],"'s GenAI API, then upserted into Pinecone.",[2357,4108,4109,4110,4113],{},"Recruiters search in natural language and retrieve the closest candidates from your index, built from ATS data read at request time; ",[41,4111,123],{"href":121,"rel":4112},[45]," keeps no customer records at rest.",[22,4115,4116,4117,270,4122],{},"Related: ",[41,4118,4121],{"href":4119,"rel":4120},"https:\u002F\u002Funified.to\u002Fblog\u002Fhow_to_build_a_rag_pipeline_for_live_saas_data",[45],"How to Build a RAG Pipeline for Live SaaS Data",[41,4123,4126],{"href":4124,"rel":4125},"https:\u002F\u002Funified.to\u002Fblog\u002Fhow_to_match_candidates_to_jobs_using_ats_data_with_unified_ats_api",[45],"How to Match Candidates to Jobs Using ATS Data",[22,4128,4129,4130,4135,4136,97],{},"For the product-level walkthrough, see ",[41,4131,4134],{"href":4132,"rel":4133},"https:\u002F\u002Funified.to\u002Fblog\u002Fhow_to_build_a_candidate_assessment_product_with_unified",[45],"How to Build a Candidate Assessment Product with Unified.to",". To wire up sourcing, see ",[41,4137,4140],{"href":4138,"rel":4139},"https:\u002F\u002Funified.to\u002Fblog\u002Fhow_to_source_candidates_externally_and_push_them_into_an_ats_using_unified_ats_api",[45],"How to Source Candidates Externally",[22,4142,4143,4144,4149,4150,97],{},"Ready to build? ",[41,4145,4148],{"href":4146,"rel":4147},"https:\u002F\u002Fapp.unified.to\u002F",[45],"Sign up for a free 30-day trial"," or ",[41,4151,4154],{"href":4152,"rel":4153},"https:\u002F\u002Fcalendly.com\u002Fd\u002Fcph9-g8n-jzg\u002Fconnect-with-unified",[45],"book a demo",[4156,4157,4158],"style",{},"html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}",{"title":2433,"searchDepth":2434,"depth":2434,"links":4160},[4161,4162,4163,4164,4165,4166,4167,4170,4171,4172,4173],{"id":2507,"depth":2434,"text":2508},{"id":2541,"depth":2434,"text":2542},{"id":2581,"depth":2434,"text":2582},{"id":2685,"depth":2434,"text":2686},{"id":2908,"depth":2434,"text":2909},{"id":2921,"depth":2434,"text":2922},{"id":3366,"depth":2434,"text":3367,"children":4168},[4169],{"id":3631,"depth":2613,"text":3632},{"id":3644,"depth":2434,"text":3645},{"id":3791,"depth":2434,"text":3792},{"id":3917,"depth":2434,"text":3918},{"id":4093,"depth":2434,"text":4094},"With Unified.to, you can build candidate search on your customers' ATS data (Greenhouse, Lever, Workable and other supported ATS integrations) by integrating...",{"img":4176,"date":4177,"updated":4178,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fats_to_vector_db_how_to_power_talent_intelligence_with_real_time_data-icon.png","2025-10-14T00:00:00.000Z","2026-10-21T13:50:41.663Z","\u002Fguides\u002Fats_to_vector_db_how_to_power_talent_intelligence_with_real_time_data",{"title":2466,"description":4174},"guides\u002Fats_to_vector_db_how_to_power_talent_intelligence_with_real_time_data","C6k5FLaiCk6bckwigT8GNgWnZ7a-alRFmg6tgkCDv5w",{"id":4184,"title":4185,"body":4186,"description":4399,"extension":2452,"meta":4400,"navigation":2459,"path":4404,"seo":4405,"stem":4406,"__hash__":4407},"guides\u002Fguides\u002Fbuilding_ai_applications_with_unified_and_langbase.md","Building AI applications with Unified and Langbase",{"type":12,"value":4187,"toc":4393},[4188,4191,4193,4198,4205,4208,4217,4221,4224,4254,4258,4261,4266,4275,4278,4286,4294,4299,4314,4317,4322,4325,4330,4337,4341,4344,4369,4373,4376,4390],[15,4189,4185],{"id":4190},"building-ai-applications-with-unified-and-langbase",[19,4192],{},[22,4194,4195],{},[25,4196,4197],{},"February 27, 2025",[22,4199,4200],{},[4201,4202],"img",{"alt":4203,"src":4204},"unified_langbase_2.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fbuilding_ai_applications_with_unified_and_langbase-0.png",[22,4206,4207],{},"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?",[22,4209,4210,4211,4216],{},"That's where the power of Unified.to's APIs combined with ",[41,4212,4215],{"href":4213,"rel":4214},"https:\u002F\u002Flangbase.com\u002F",[45],"Langbase's"," 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.",[55,4218,4220],{"id":4219},"why-use-unifiedto-with-langbase","Why use Unified.to with Langbase?",[22,4222,4223],{},"When you pair Unified.to's normalized data access with Langbase's AI capabilities, you get:",[2354,4225,4226,4236,4242,4248],{},[2357,4227,4228,4231,4232,4235],{},[31,4229,4230],{},"One API, many integrations:"," Instead of building separate integrations for each platform, use ",[41,4233,123],{"href":121,"rel":4234},[45],"'s unified APIs to access normalized data from multiple data sources through a single, unified API. 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.",[2357,4237,4238,4241],{},[31,4239,4240],{},"Unified authorization:"," 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.",[2357,4243,4244,4247],{},[31,4245,4246],{},"Production-ready AI:"," Langbase Pipes and Memory Agents (serverless RAG agents with long-term memory) eliminate infrastructure management, making scaling and deployment seamless for all developers—not just AI\u002FML experts. Its composable AI infrastructure lets developers chain multiple models into AI pipelines, optimizing cost, performance, and personalization at every step.",[2357,4249,4250,4253],{},[31,4251,4252],{},"Real-time updates:"," 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.",[55,4255,4257],{"id":4256},"real-world-applications-you-can-build","Real-world applications you can build",[22,4259,4260],{},"Let's look at some practical applications you can create by combining these platforms.",[22,4262,4263],{},[31,4264,4265],{},"Intelligent support bots",[22,4267,4268,4269,4274],{},"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 ",[41,4270,4273],{"href":4271,"rel":4272},"https:\u002F\u002Flangbase.com\u002Fdocs\u002Fmemory",[45],"Langbase's Memory Agents"," , you can create a bot that gets smarter as your knowledge base grows.",[22,4276,4277],{},"The best part? Since you're using unified APIs, you can easily adapt this pattern for different platforms:",[2354,4279,4280,4283],{},[2357,4281,4282],{},"Use Notion, Confluence or other KMS platforms for your knowledge base",[2357,4284,4285],{},"Deploy your bot on Slack instead of Discord",[22,4287,4288,4289],{},"Want to build your own? Check out our step-by-step ",[41,4290,4293],{"href":4291,"rel":4292},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_build_a_discord_support_bot_with_unified_and_langbase#how-to-build-a-discord-support-bot-with-unifiedto-and-langbase",[45],"guide on building a Discord support bot.",[22,4295,4296],{},[31,4297,4298],{},"AI-powered recruitment assistant",[22,4300,4301,4302,4307,4308,4313],{},"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 ",[41,4303,4306],{"href":4304,"rel":4305},"https:\u002F\u002Funified.to\u002Fats",[45],"ATS integrations"," and Langbase ",[41,4309,4312],{"href":4310,"rel":4311},"https:\u002F\u002Flangbase.com\u002Fdocs\u002Fpipe\u002Fquickstart",[45],"Pipe agents",", your assistant can handle the time-consuming parts of recruitment while maintaining a personal touch.",[22,4315,4316],{},"The unified approach means you can support multiple ATS platforms (Lever, Greenhouse, Workday, etc.) without rewriting your core logic.",[22,4318,4319],{},[31,4320,4321],{},"Enhanced email agents",[22,4323,4324],{},"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.",[22,4326,4327],{},[31,4328,4329],{},"Intelligent sales assistant",[22,4331,4332,4333,4336],{},"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 ",[41,4334,4273],{"href":4271,"rel":4335},[45]," (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 Enrichment API to add extra contextual data for the Memory Agent.",[55,4338,4340],{"id":4339},"getting-started","Getting started",[22,4342,4343],{},"Ready to start building? Here's how to get going:",[2510,4345,4346,4357,4366],{},[2357,4347,4348,4349,4352,4353],{},"Sign up for accounts on ",[41,4350,123],{"href":121,"rel":4351},[45]," and",[41,4354,4356],{"href":4213,"rel":4355},[45]," Langbase",[2357,4358,4359,4360,4365],{},"Join our ",[41,4361,4364],{"href":4362,"rel":4363},"https:\u002F\u002Fdiscord.gg\u002F85z7HF7JbD",[45],"Discord community"," to connect with other developers",[2357,4367,4368],{},"Keep an eye on our blog for upcoming guides in this series",[55,4370,4372],{"id":4371},"looking-ahead","Looking ahead",[22,4374,4375],{},"The combination of Unified.to and Langbase opens up exciting possibilities for AI application development. As both platforms continue to evolve, you can expect:",[2354,4377,4378,4381,4384,4387],{},[2357,4379,4380],{},"More supported platforms and integrations",[2357,4382,4383],{},"Enhanced AI capabilities through Langbase's Memory Agents",[2357,4385,4386],{},"New unified APIs for different use cases",[2357,4388,4389],{},"Expanded tutorials and example applications",[22,4391,4392],{},"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":2433,"searchDepth":2434,"depth":2434,"links":4394},[4395,4396,4397,4398],{"id":4219,"depth":2434,"text":4220},{"id":4256,"depth":2434,"text":4257},{"id":4339,"depth":2434,"text":4340},{"id":4371,"depth":2434,"text":4372},"Developers building AI applications for their customers face a common challenge, they need to juggle many different APIs and authorization flows, configure and...",{"img":4401,"date":4402,"updated":4403,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fbuilding_ai_applications_with_unified_and_langbase-icon.png","2025-02-27T00:00:00.000Z","2026-05-28T13:31:30.461Z","\u002Fguides\u002Fbuilding_ai_applications_with_unified_and_langbase",{"title":4185,"description":4399},"guides\u002Fbuilding_ai_applications_with_unified_and_langbase","k82vXvbBFh0Yq3QEnYMJrhgdnEbzCyBkElVIJ3bqJww",{"id":4409,"title":4410,"body":4411,"description":4429,"extension":2452,"meta":4852,"navigation":2459,"path":4857,"seo":4858,"stem":4859,"__hash__":4860},"guides\u002Fguides\u002Fconcur_and_concur_company_connection_guide.md","Concur & Concur (Company) — Connection Guide",{"type":12,"value":4412,"toc":4835},[4413,4416,4418,4423,4427,4430,4434,4465,4467,4471,4474,4533,4535,4538,4599,4601,4605,4633,4635,4639,4716,4718,4722,4726,4764,4766,4770,4773,4790,4793,4795,4799,4802,4805,4811,4814,4818,4821],[15,4414,4410],{"id":4415},"concur-concur-company-connection-guide",[19,4417],{},[22,4419,4420],{},[25,4421,4422],{},"April 10, 2026",[55,4424,4426],{"id":4425},"overview","Overview",[22,4428,4429],{},"There are two SAP Concur integrations are available. You will need to choose which one to use based off of the authentication type and required data objects.",[3629,4431,4433],{"id":4432},"integrations","Integrations",[2354,4435,4436,4449],{},[2357,4437,4438,4441],{},[31,4439,4440],{},"Concur",[2354,4442,4443,4446],{},[2357,4444,4445],{},"End-user OAuth (authorization code flow)",[2357,4447,4448],{},"Categories: Accounting, Storage, Auth",[2357,4450,4451,4454],{},[31,4452,4453],{},"Concur (Company)",[2354,4455,4456,4459,4462],{},[2357,4457,4458],{},"Company-level authentication",[2357,4460,4461],{},"Uses credentials instead of user OAuth",[2357,4463,4464],{},"Categories: Accounting, HRIS, Storage, Auth",[19,4466],{},[55,4468,4470],{"id":4469},"concur-vs-concur-company","Concur vs Concur (Company)",[3629,4472,4440],{"id":4473},"concur",[2354,4475,4476,4482,4498,4523],{},[2357,4477,4478,4481],{},[31,4479,4480],{},"Authentication:"," OAuth 2.0 (user-based)",[2357,4483,4484,4487],{},[31,4485,4486],{},"Credentials:",[2354,4488,4489,4492,4495],{},[2357,4490,4491],{},"Client ID",[2357,4493,4494],{},"Client Secret",[2357,4496,4497],{},"Redirect URI",[2357,4499,4500,4503],{},[31,4501,4502],{},"Supported Objects:",[2354,4504,4505,4508,4511,4514,4517,4520],{},[2357,4506,4507],{},"Accounting — Expense",[2357,4509,4510],{},"Accounting — Invoice",[2357,4512,4513],{},"Accounting — Contact",[2357,4515,4516],{},"Storage — File",[2357,4518,4519],{},"Accounting — Expense report",[2357,4521,4522],{},"Expense type: reads map type=USER (employee T&E \u002F Quick Expense)",[2357,4524,4525,4528],{},[31,4526,4527],{},"Use Case:",[2354,4529,4530],{},[2357,4531,4532],{},"User connects their own account and grants access",[19,4534],{},[3629,4536,4453],{"id":4537},"concur-company",[2354,4539,4540,4545,4562,4584],{},[2357,4541,4542,4544],{},[31,4543,4480],{}," Company token flow (server-to-server)",[2357,4546,4547,4550],{},[31,4548,4549],{},"token_names:",[2354,4551,4552,4554,4556,4559],{},[2357,4553,4491],{},[2357,4555,4494],{},[2357,4557,4558],{},"Company UUID",[2357,4560,4561],{},"Request Token",[2357,4563,4564,4566],{},[31,4565,4502],{},[2354,4567,4568,4570,4572,4574,4577,4579,4581],{},[2357,4569,4507],{},[2357,4571,4510],{},[2357,4573,4513],{},[2357,4575,4576],{},"HRIS — Employee",[2357,4578,4516],{},[2357,4580,4519],{},[2357,4582,4583],{},"Expense type: reads map type=COMPANY (company-scoped reports)",[2357,4585,4586,4588],{},[31,4587,4527],{},[2354,4589,4590,4593,4596],{},[2357,4591,4592],{},"Company-wide access",[2357,4594,4595],{},"Backend integrations",[2357,4597,4598],{},"Employee data access",[19,4600],{},[55,4602,4604],{"id":4603},"when-to-use-which","When to Use Which",[2354,4606,4607,4617],{},[2357,4608,4609,4612],{},[31,4610,4611],{},"Use Concur",[2354,4613,4614],{},[2357,4615,4616],{},"When a user signs in and authorizes access",[2357,4618,4619,4622],{},[31,4620,4621],{},"Use Concur (Company)",[2354,4623,4624,4627,4630],{},[2357,4625,4626],{},"When you need company-wide access",[2357,4628,4629],{},"When working with employee data",[2357,4631,4632],{},"When SAP requires Company UUID + Request Token",[19,4634],{},[55,4636,4638],{"id":4637},"oauth-scopes","OAuth Scopes",[155,4640,4641,4654],{},[158,4642,4643],{},[161,4644,4645,4648,4651],{},[164,4646,4647],{},"Object",[164,4649,4650],{},"Read",[164,4652,4653],{},"Write",[174,4655,4656,4666,4676,4686,4706],{},[161,4657,4658,4661,4664],{},[179,4659,4660],{},"Expense",[179,4662,4663],{},"EXPRPT",[179,4665,4663],{},[161,4667,4668,4671,4674],{},[179,4669,4670],{},"Invoice",[179,4672,4673],{},"INVPMT",[179,4675,4673],{},[161,4677,4678,4681,4684],{},[179,4679,4680],{},"File",[179,4682,4683],{},"IMAGE",[179,4685,4683],{},[161,4687,4688,4691,4700],{},[179,4689,4690],{},"User",[179,4692,4693,4696,4697],{},[36,4694,4695],{},"identity.user.ids.read",", ",[36,4698,4699],{},"identity.user.core.read",[179,4701,4702,4696,4704],{},[36,4703,4695],{},[36,4705,4699],{},[161,4707,4708,4711,4714],{},[179,4709,4710],{},"Vendor",[179,4712,4713],{},"INVVEN",[179,4715,4713],{},[19,4717],{},[55,4719,4721],{"id":4720},"concur-company-credential-details","Concur (Company) — Credential Details",[3629,4723,4725],{"id":4724},"required-fields","Required Fields",[2354,4727,4728,4734,4740,4746],{},[2357,4729,4730,4733],{},[31,4731,4732],{},"Client ID:"," From SAP Concur OAuth Application Management",[2357,4735,4736,4739],{},[31,4737,4738],{},"Client Secret:"," From the same OAuth application",[2357,4741,4742,4745],{},[31,4743,4744],{},"Company UUID:"," Unique identifier for your company in SAP Concur",[2357,4747,4748,4751,4752,3141,4756],{},[31,4749,4750],{},"Request Token:"," Temporary token generated via SAP Concur Company Request Token tool (Guide: ",[41,4753,4754],{"href":4754,"rel":4755},"https:\u002F\u002Fdeveloper.concur.com\u002Fapi-reference\u002Fauthentication\u002Fcompany-refresh-tool.html",[45],[2354,4757,4758,4761],{},[2357,4759,4760],{},"Not long-lived",[2357,4762,4763],{},"Must be regenerated when expired",[19,4765],{},[55,4767,4769],{"id":4768},"region-reference","Region Reference",[22,4771,4772],{},"Select the correct API region based on your tenant:",[2354,4774,4775,4778,4781,4784,4787],{},[2357,4776,4777],{},"Production (US2 default)",[2357,4779,4780],{},"EU2",[2357,4782,4783],{},"APJ1",[2357,4785,4786],{},"US Government",[2357,4788,4789],{},"Sandbox \u002F Implementation",[22,4791,4792],{},"If unsure, confirm with your SAP Concur administrator.",[19,4794],{},[55,4796,4798],{"id":4797},"network-requirements","Network Requirements",[22,4800,4801],{},"To ensure successful API communication, you may need to whitelist Unified IP addresses on your SAP Concur account.",[22,4803,4804],{},"You can find the list of IP addresses here:",[22,4806,4807],{},[41,4808,4809],{"href":4809,"rel":4810},"https:\u002F\u002Fapp.unified.to\u002Fapikeys",[45],[22,4812,4813],{},"Failure to whitelist these IPs may result in connection or data access issues.",[55,4815,4817],{"id":4816},"accounting-expense-create-concur","Accounting expense create (Concur)",[22,4819,4820],{},"Personal Concur create routing for accounting_expense (do not use user_id to choose the path):",[2354,4822,4823,4826,4829,4832],{},[2357,4824,4825],{},"type=USER and omit name → Quick Expense v4 (create-only). The returned id cannot be retrieved with get; use accounting_expensereport \u002F report list for reads.",[2357,4827,4828],{},"type=USER with a name (or any create that includes name) → Expense Report v3 create.",[2357,4830,4831],{},"Concur (Company) expense reads use type=COMPANY; personal Concur reads use type=USER.",[2357,4833,4834],{},"Prefer accounting_expensereport for expense reports when available.",{"title":2433,"searchDepth":2434,"depth":2434,"links":4836},[4837,4840,4844,4845,4846,4849,4850,4851],{"id":4425,"depth":2434,"text":4426,"children":4838},[4839],{"id":4432,"depth":2613,"text":4433},{"id":4469,"depth":2434,"text":4470,"children":4841},[4842,4843],{"id":4473,"depth":2613,"text":4440},{"id":4537,"depth":2613,"text":4453},{"id":4603,"depth":2434,"text":4604},{"id":4637,"depth":2434,"text":4638},{"id":4720,"depth":2434,"text":4721,"children":4847},[4848],{"id":4724,"depth":2613,"text":4725},{"id":4768,"depth":2434,"text":4769},{"id":4797,"depth":2434,"text":4798},{"id":4816,"depth":2434,"text":4817},{"img":4853,"date":4854,"updated":4855,"tag":2457,"integrations":4856},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fconcur_and_concur_company_connection_guide-icon.png","2026-04-10T14:21:00.000Z","2026-09-25T04:43:12.559Z","concur, concurcompany","\u002Fguides\u002Fconcur_and_concur_company_connection_guide",{"title":4410,"description":4429},"guides\u002Fconcur_and_concur_company_connection_guide","6cpapTzfb7rvrVUHMGq_uOU27OiBYMYjx-AeBRNweq8",{"id":4862,"title":4863,"body":4864,"description":5763,"extension":2452,"meta":5764,"navigation":2459,"path":5769,"seo":5770,"stem":5771,"__hash__":5772},"guides\u002Fguides\u002Fconfigure_greenhouse_native_candidate_webhooks.md","Configure Greenhouse Native Candidate Webhooks",{"type":12,"value":4865,"toc":5737},[4866,4869,4871,4876,4882,4885,4887,4891,4894,4915,4917,4921,4936,4961,4963,4967,4970,4984,4988,5048,5055,5067,5074,5081,5083,5087,5090,5141,5158,5174,5176,5180,5183,5208,5221,5223,5227,5230,5233,5236,5325,5329,5335,5343,5347,5351,5371,5375,5379,5387,5405,5407,5411,5505,5507,5511,5514,5522,5526,5545,5547,5551,5554,5560,5563,5592,5597,5599,5603,5606,5609,5617,5619,5623,5627,5630,5633,5650,5654,5656,5681,5685,5688,5691,5693,5697,5726,5734],[15,4867,4863],{"id":4868},"configure-greenhouse-native-candidate-webhooks",[19,4870],{},[22,4872,4873],{},[25,4874,4875],{},"July 15, 2026",[22,4877,4878,4879,97],{},"Greenhouse Recruiting requires native webhooks to be created manually in its ",[31,4880,4881],{},"Dev Center",[22,4883,4884],{},"This guide explains how to connect Greenhouse candidate events to a Unified webhook subscription.",[19,4886],{},[55,4888,4890],{"id":4889},"before-you-begin","Before you begin",[22,4892,4893],{},"You need:",[2354,4895,4896,4899,4902,4905,4912],{},[2357,4897,4898],{},"An active Greenhouse connection in Unified",[2357,4900,4901],{},"The Greenhouse connection ID",[2357,4903,4904],{},"A public HTTPS endpoint in your application that can receive Unified webhook payloads",[2357,4906,4907,4908,4911],{},"Greenhouse's ",[31,4909,4910],{},"Manage and configure webhooks"," developer permission",[2357,4913,4914],{},"A Unified API key",[19,4916],{},[55,4918,4920],{"id":4919},"how-the-webhook-flow-works","How the webhook flow works",[2510,4922,4923,4926,4933],{},[2357,4924,4925],{},"Greenhouse sends a candidate event to Unified.",[2357,4927,4928,4929,4932],{},"Unified converts the event into the unified ",[36,4930,4931],{},"ats_candidate"," format.",[2357,4934,4935],{},"Unified sends the normalized webhook payload to your application's webhook URL.",[4937,4938,4939,4944,4955],"blockquote",{},[22,4940,4941],{},[31,4942,4943],{},"Note",[22,4945,4946,4947,4950,4951,4954],{},"For ",[36,4948,4949],{},"created"," and ",[36,4952,4953],{},"updated"," events, Unified retrieves the latest candidate record from Greenhouse before sending the payload to your application.",[22,4956,4946,4957,4960],{},[36,4958,4959],{},"deleted"," events, the payload contains the deleted candidate ID.",[19,4962],{},[55,4964,4966],{"id":4965},"step-1-create-unified-webhook-subscriptions","Step 1: Create Unified webhook subscriptions",[22,4968,4969],{},"Create one native Unified webhook subscription for each event type you need:",[2354,4971,4972,4976,4980],{},[2357,4973,4974],{},[36,4975,4949],{},[2357,4977,4978],{},[36,4979,4953],{},[2357,4981,4982],{},[36,4983,4959],{},[3629,4985,4987],{"id":4986},"example-created-candidate-subscription","Example: Created candidate subscription",[2584,4989,4991],{"className":2649,"code":4990,"language":2651,"meta":2652,"style":2433},"curl --request POST \\\n  --url 'https:\u002F\u002Fapi.unified.to\u002Funified\u002Fwebhook' \\\n  --header 'Authorization: Bearer YOUR_UNIFIED_API_KEY' \\\n  --header 'Content-Type: application\u002Fjson' \\\n  --data '{\n    \"connection_id\": \"YOUR_GREENHOUSE_CONNECTION_ID\",\n    \"object_type\": \"ats_candidate\",\n    \"event\": \"created\",\n    \"webhook_type\": \"native\",\n    \"hook_url\": \"https:\u002F\u002Fyour-app.example.com\u002Fwebhooks\u002Funified\"\n  }'\n",[36,4992,4993,4998,5003,5008,5013,5018,5023,5028,5033,5038,5043],{"__ignoreMap":2433},[414,4994,4995],{"class":2593,"line":2594},[414,4996,4997],{},"curl --request POST \\\n",[414,4999,5000],{"class":2593,"line":2434},[414,5001,5002],{},"  --url 'https:\u002F\u002Fapi.unified.to\u002Funified\u002Fwebhook' \\\n",[414,5004,5005],{"class":2593,"line":2613},[414,5006,5007],{},"  --header 'Authorization: Bearer YOUR_UNIFIED_API_KEY' \\\n",[414,5009,5010],{"class":2593,"line":2625},[414,5011,5012],{},"  --header 'Content-Type: application\u002Fjson' \\\n",[414,5014,5015],{"class":2593,"line":2677},[414,5016,5017],{},"  --data '{\n",[414,5019,5020],{"class":2593,"line":2751},[414,5021,5022],{},"    \"connection_id\": \"YOUR_GREENHOUSE_CONNECTION_ID\",\n",[414,5024,5025],{"class":2593,"line":2760},[414,5026,5027],{},"    \"object_type\": \"ats_candidate\",\n",[414,5029,5030],{"class":2593,"line":2768},[414,5031,5032],{},"    \"event\": \"created\",\n",[414,5034,5035],{"class":2593,"line":2776},[414,5036,5037],{},"    \"webhook_type\": \"native\",\n",[414,5039,5040],{"class":2593,"line":2784},[414,5041,5042],{},"    \"hook_url\": \"https:\u002F\u002Fyour-app.example.com\u002Fwebhooks\u002Funified\"\n",[414,5044,5045],{"class":2593,"line":2792},[414,5046,5047],{},"  }'\n",[22,5049,5050,5051,5054],{},"The ",[36,5052,5053],{},"hook_url"," is your application's endpoint. Unified sends normalized webhook payloads to this URL.",[22,5056,5057,5058,5061,5062,4950,5064,5066],{},"Repeat the request with ",[36,5059,5060],{},"event"," set to ",[36,5063,4953],{},[36,5065,4959],{}," when those events are required.",[22,5068,5069,5070,5073],{},"Save the ",[36,5071,5072],{},"id"," returned for each webhook subscription.",[22,5075,5076],{},[41,5077,5080],{"href":5078,"rel":5079},"https:\u002F\u002Fdocs.unified.to\u002Funified\u002Fwebhook\u002FCreate_webhook_subscription",[45],"Create webhook subscription",[19,5082],{},[55,5084,5086],{"id":5085},"step-2-build-the-greenhouse-endpoint-urls","Step 2: Build the Greenhouse endpoint URLs",[22,5088,5089],{},"Build a separate Greenhouse endpoint URL using each Unified webhook subscription ID.",[155,5091,5092,5102],{},[158,5093,5094],{},[161,5095,5096,5099],{},[164,5097,5098],{},"Unified region",[164,5100,5101],{},"Greenhouse endpoint",[174,5103,5104,5114,5124,5134],{},[161,5105,5106,5109],{},[179,5107,5108],{},"US",[179,5110,5111],{},[36,5112,5113],{},"https:\u002F\u002Fapi.unified.to\u002Fwebhook\u002Fgreenhouse\u002FUNIFIED_WEBHOOK_ID",[161,5115,5116,5119],{},[179,5117,5118],{},"EU",[179,5120,5121],{},[36,5122,5123],{},"https:\u002F\u002Fapi-eu.unified.to\u002Fwebhook\u002Fgreenhouse\u002FUNIFIED_WEBHOOK_ID",[161,5125,5126,5129],{},[179,5127,5128],{},"Australia",[179,5130,5131],{},[36,5132,5133],{},"https:\u002F\u002Fapi-au.unified.to\u002Fwebhook\u002Fgreenhouse\u002FUNIFIED_WEBHOOK_ID",[161,5135,5136,5139],{},[179,5137,5138],{},"Use:",[179,5140],{},[2354,5142,5143,5148,5153],{},[2357,5144,5050,5145,5147],{},[36,5146,4949],{}," subscription ID for Greenhouse creation triggers",[2357,5149,5050,5150,5152],{},[36,5151,4953],{}," subscription ID for Greenhouse update triggers",[2357,5154,5050,5155,5157],{},[36,5156,4959],{}," subscription ID for Greenhouse deletion triggers",[4937,5159,5160,5165,5171],{},[22,5161,5162],{},[31,5163,5164],{},"Important",[22,5166,5167,5168,5170],{},"Do not enter your application's ",[36,5169,5053],{}," in Greenhouse.",[22,5172,5173],{},"Greenhouse must send its payload to the Unified endpoint shown above. Unified will then normalize the event and forward it to your application.",[19,5175],{},[55,5177,5179],{"id":5178},"step-3-open-greenhouse-webhook-settings","Step 3: Open Greenhouse webhook settings",[22,5181,5182],{},"In Greenhouse Recruiting:",[2510,5184,5185,5191,5195,5200,5205],{},[2357,5186,5187,5188,97],{},"Select ",[31,5189,5190],{},"Configure",[2357,5192,5187,5193,97],{},[31,5194,4881],{},[2357,5196,5187,5197,97],{},[31,5198,5199],{},"Web Hooks",[2357,5201,5187,5202,5204],{},[31,5203,5199],{}," again.",[2357,5206,5207],{},"Select the option to create a new webhook.",[4937,5209,5210,5215],{},[22,5211,5212],{},[31,5213,5214],{},"Permission required",[22,5216,5217,5218,5220],{},"If you cannot access this page, ask a Greenhouse administrator to grant you the ",[31,5219,4910],{}," developer permission.",[19,5222],{},[55,5224,5226],{"id":5225},"step-4-create-the-greenhouse-webhooks","Step 4: Create the Greenhouse webhooks",[22,5228,5229],{},"Greenhouse allows only one trigger per webhook.",[22,5231,5232],{},"Create a separate Greenhouse webhook for every trigger you want to receive.",[22,5234,5235],{},"For each webhook, enter the following:",[155,5237,5238,5248],{},[158,5239,5240],{},[161,5241,5242,5245],{},[164,5243,5244],{},"Field",[164,5246,5247],{},"Value",[174,5249,5250,5263,5273,5283,5293,5303,5315],{},[161,5251,5252,5257],{},[179,5253,5254],{},[31,5255,5256],{},"Name this webhook",[179,5258,5259,5260],{},"A descriptive name, such as ",[36,5261,5262],{},"Unified – Candidate hired",[161,5264,5265,5270],{},[179,5266,5267],{},[31,5268,5269],{},"When",[179,5271,5272],{},"One of the supported triggers listed below",[161,5274,5275,5280],{},[179,5276,5277],{},[31,5278,5279],{},"Endpoint URL",[179,5281,5282],{},"The Unified endpoint for the corresponding Unified event",[161,5284,5285,5290],{},[179,5286,5287],{},[31,5288,5289],{},"Secret Key",[179,5291,5292],{},"A unique, randomly generated secret stored securely",[161,5294,5295,5300],{},[179,5296,5297],{},[31,5298,5299],{},"Error recipient email",[179,5301,5302],{},"A Greenhouse administrator who should receive delivery failure notices",[161,5304,5305,5310],{},[179,5306,5307],{},[31,5308,5309],{},"Disabled?",[179,5311,5312],{},[36,5313,5314],{},"No",[161,5316,5317,5322],{},[179,5318,5319],{},[31,5320,5321],{},"Advanced settings",[179,5323,5324],{},"Leave blank unless your organization has additional requirements",[3629,5326,5328],{"id":5327},"created-candidate-events","Created candidate events",[22,5330,5331,5332,5334],{},"Point the following Greenhouse triggers to the endpoint containing your Unified ",[36,5333,4949],{}," webhook ID:",[2354,5336,5337,5340],{},[2357,5338,5339],{},"Application created",[2357,5341,5342],{},"Prospect created",[3629,5344,5346],{"id":5345},"updated-candidate-events","Updated candidate events",[22,5348,5331,5349,5334],{},[36,5350,4953],{},[2354,5352,5353,5356,5359,5362,5365,5368],{},[2357,5354,5355],{},"Candidate\u002FProspect updated",[2357,5357,5358],{},"Candidate hired",[2357,5360,5361],{},"Candidate\u002FProspect rejected",[2357,5363,5364],{},"Candidate stage change",[2357,5366,5367],{},"Candidate unhired",[2357,5369,5370],{},"Candidate\u002FProspect unrejected",[3629,5372,5374],{"id":5373},"deleted-candidate-events","Deleted candidate events",[22,5376,5331,5377,5334],{},[36,5378,4959],{},[2354,5380,5381,5384],{},[2357,5382,5383],{},"Candidate deleted",[2357,5385,5386],{},"Candidate merged",[4937,5388,5389,5393,5396],{},[22,5390,5391],{},[31,5392,5164],{},[22,5394,5395],{},"Use the correct Unified endpoint for each trigger group.",[22,5397,5398,5399,5401,5402,5404],{},"For example, do not send a ",[31,5400,5358],{}," trigger to the endpoint associated with a Unified ",[36,5403,4949],{}," subscription.",[19,5406],{},[55,5408,5410],{"id":5409},"trigger-mapping-reference","Trigger mapping reference",[155,5412,5413,5423],{},[158,5414,5415],{},[161,5416,5417,5420],{},[164,5418,5419],{},"Greenhouse trigger",[164,5421,5422],{},"Unified event",[174,5424,5425,5433,5441,5449,5457,5465,5473,5481,5489,5497],{},[161,5426,5427,5429],{},[179,5428,5339],{},[179,5430,5431],{},[36,5432,4949],{},[161,5434,5435,5437],{},[179,5436,5342],{},[179,5438,5439],{},[36,5440,4949],{},[161,5442,5443,5445],{},[179,5444,5355],{},[179,5446,5447],{},[36,5448,4953],{},[161,5450,5451,5453],{},[179,5452,5358],{},[179,5454,5455],{},[36,5456,4953],{},[161,5458,5459,5461],{},[179,5460,5361],{},[179,5462,5463],{},[36,5464,4953],{},[161,5466,5467,5469],{},[179,5468,5364],{},[179,5470,5471],{},[36,5472,4953],{},[161,5474,5475,5477],{},[179,5476,5367],{},[179,5478,5479],{},[36,5480,4953],{},[161,5482,5483,5485],{},[179,5484,5370],{},[179,5486,5487],{},[36,5488,4953],{},[161,5490,5491,5493],{},[179,5492,5383],{},[179,5494,5495],{},[36,5496,4959],{},[161,5498,5499,5501],{},[179,5500,5386],{},[179,5502,5503],{},[36,5504,4959],{},[19,5506],{},[55,5508,5510],{"id":5509},"step-5-confirm-that-each-webhook-is-active","Step 5: Confirm that each webhook is active",[22,5512,5513],{},"When a Greenhouse webhook is created, Greenhouse sends a test ping to the configured endpoint.",[2354,5515,5516,5519],{},[2357,5517,5518],{},"If the ping succeeds, Greenhouse activates the webhook.",[2357,5520,5521],{},"If the ping fails, Greenhouse saves the webhook in a disabled state.",[3629,5523,5525],{"id":5524},"retry-a-failed-webhook","Retry a failed webhook",[2510,5527,5528,5531,5534,5542],{},[2357,5529,5530],{},"Open the webhook in Greenhouse.",[2357,5532,5533],{},"Confirm that the endpoint contains the correct Unified webhook subscription ID.",[2357,5535,5536,5537,5539,5540,97],{},"Set ",[31,5538,5309],{}," to ",[31,5541,5314],{},[2357,5543,5544],{},"Save the webhook again.",[19,5546],{},[55,5548,5550],{"id":5549},"test-the-integration","Test the integration",[22,5552,5553],{},"Perform a Greenhouse action matching one of the configured triggers.",[22,5555,5556,5557,5559],{},"For example, update a test candidate after configuring the ",[31,5558,5355],{}," trigger.",[22,5561,5562],{},"Confirm that your application receives a Unified webhook payload containing:",[2354,5564,5565,5572,5579,5585],{},[2357,5566,5567,5061,5569],{},[36,5568,3397],{},[36,5570,5571],{},"NATIVE",[2357,5573,5574,5061,5577],{},[36,5575,5576],{},"webhook.object_type",[36,5578,4931],{},[2357,5580,5581,5584],{},[36,5582,5583],{},"webhook.event"," set to the expected Unified event",[2357,5586,5587,5588,5591],{},"The normalized candidate record in the ",[36,5589,5590],{},"data"," array",[22,5593,5594,5595,97],{},"Deleted candidate events contain an object with the deleted candidate's ",[36,5596,5072],{},[19,5598],{},[55,5600,5602],{"id":5601},"remove-the-webhooks","Remove the webhooks",[22,5604,5605],{},"Deleting a Unified webhook subscription does not delete the manually configured Greenhouse webhooks.",[22,5607,5608],{},"To fully remove the integration:",[2510,5610,5611,5614],{},[2357,5612,5613],{},"Disable or delete each corresponding webhook in Greenhouse.",[2357,5615,5616],{},"Delete the Unified webhook subscriptions.",[19,5618],{},[55,5620,5622],{"id":5621},"troubleshooting","Troubleshooting",[3629,5624,5626],{"id":5625},"the-greenhouse-webhook-is-disabled-immediately","The Greenhouse webhook is disabled immediately",[22,5628,5629],{},"The initial endpoint ping failed.",[22,5631,5632],{},"Check that:",[2354,5634,5635,5641,5644,5647],{},[2357,5636,5637,5638,97],{},"The endpoint starts with ",[36,5639,5640],{},"https:\u002F\u002F",[2357,5642,5643],{},"The Unified webhook ID is correct.",[2357,5645,5646],{},"The endpoint uses the API hostname for the correct Unified region.",[2357,5648,5649],{},"The Unified webhook subscription still exists.",[3629,5651,5653],{"id":5652},"no-webhook-arrives-after-a-candidate-change","No webhook arrives after a candidate change",[22,5655,5632],{},[2354,5657,5658,5661,5672,5675,5678],{},[2357,5659,5660],{},"You configured the specific Greenhouse trigger for that action.",[2357,5662,5663,5664,4696,5666,5668,5669,5671],{},"The trigger points to the Unified endpoint for the correct ",[36,5665,4949],{},[36,5667,4953],{},", or ",[36,5670,4959],{}," subscription.",[2357,5673,5674],{},"The Greenhouse webhook is not disabled.",[2357,5676,5677],{},"The Greenhouse connection still has permission to retrieve candidates.",[2357,5679,5680],{},"The configured error recipient has not received a Greenhouse delivery failure email.",[3629,5682,5684],{"id":5683},"duplicate-deliveries","Duplicate deliveries",[22,5686,5687],{},"Check that the same Greenhouse trigger was not created more than once.",[22,5689,5690],{},"Greenhouse may also retry failed deliveries, so your application should process webhook deliveries idempotently.",[19,5692],{},[55,5694,5696],{"id":5695},"additional-documentation","Additional documentation",[2354,5698,5699,5706,5713,5720],{},[2357,5700,5701],{},[41,5702,5705],{"href":5703,"rel":5704},"https:\u002F\u002Fsupport.greenhouse.io\u002Fhc\u002Fen-us\u002Farticles\u002F360005574531-Create-a-webhook",[45],"Greenhouse: Create a webhook",[2357,5707,5708],{},[41,5709,5712],{"href":5710,"rel":5711},"https:\u002F\u002Fdevelopers.greenhouse.io\u002Fwebhooks.html",[45],"Greenhouse Recruiting webhooks",[2357,5714,5715],{},[41,5716,5719],{"href":5717,"rel":5718},"https:\u002F\u002Fdocs.unified.to\u002Freference\u002Fwebhooks",[45],"Unified: Introduction to webhooks",[2357,5721,5722],{},[41,5723,5725],{"href":5078,"rel":5724},[45],"Unified: Create webhook subscription",[22,5727,5728,5729,97],{},"For creating the webhook in Unified, see ",[41,5730,5733],{"href":5731,"rel":5732},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_create_and_configure_webhooks",[45],"How to create and configure webhooks",[4156,5735,5736],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":2433,"searchDepth":2434,"depth":2434,"links":5738},[5739,5740,5741,5744,5745,5746,5751,5752,5755,5756,5757,5762],{"id":4889,"depth":2434,"text":4890},{"id":4919,"depth":2434,"text":4920},{"id":4965,"depth":2434,"text":4966,"children":5742},[5743],{"id":4986,"depth":2613,"text":4987},{"id":5085,"depth":2434,"text":5086},{"id":5178,"depth":2434,"text":5179},{"id":5225,"depth":2434,"text":5226,"children":5747},[5748,5749,5750],{"id":5327,"depth":2613,"text":5328},{"id":5345,"depth":2613,"text":5346},{"id":5373,"depth":2613,"text":5374},{"id":5409,"depth":2434,"text":5410},{"id":5509,"depth":2434,"text":5510,"children":5753},[5754],{"id":5524,"depth":2613,"text":5525},{"id":5549,"depth":2434,"text":5550},{"id":5601,"depth":2434,"text":5602},{"id":5621,"depth":2434,"text":5622,"children":5758},[5759,5760,5761],{"id":5625,"depth":2613,"text":5626},{"id":5652,"depth":2613,"text":5653},{"id":5683,"depth":2613,"text":5684},{"id":5695,"depth":2434,"text":5696},"Greenhouse Recruiting requires native webhooks to be created manually in its Dev Center.",{"img":5765,"date":5766,"updated":5767,"tag":2457,"integrations":5768},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fconfigure_greenhouse_native_candidate_webhooks-icon.png","2026-07-15T15:38:00.000Z","2026-10-13T00:41:28.754Z","greenhouse, greenhouseingest","\u002Fguides\u002Fconfigure_greenhouse_native_candidate_webhooks",{"title":4863,"description":5763},"guides\u002Fconfigure_greenhouse_native_candidate_webhooks","NwS8KuLXH2oEaFvXLakfhboqe3Rz91AEI4qizw10O0Y",{"id":5774,"title":5775,"body":5776,"description":6102,"extension":2452,"meta":6103,"navigation":2459,"path":6108,"seo":6109,"stem":6110,"__hash__":6111},"guides\u002Fguides\u002Fconnect_amazon_seller_central_to_unified.md","Connect Amazon Seller Central to Unified.to",{"type":12,"value":5777,"toc":6100},[5778,5781,5783,5788,5793,5858,5860,5865,5922,5934,5948,5962,5964,5969,5979,6030,6032,6037,6085,6087,6092],[15,5779,5775],{"id":5780},"connect-amazon-seller-central-to-unifiedto",[19,5782],{},[22,5784,5785],{},[25,5786,5787],{},"May 13, 2026",[22,5789,5790],{},[31,5791,5792],{},"What this integration covers",[155,5794,5795,5808],{},[158,5796,5797],{},[161,5798,5799,5802,5805],{},[164,5800,5801],{},"Area",[164,5803,5804],{},"Unified objects",[164,5806,5807],{},"Typical use",[174,5809,5810,5823,5836,5849],{},[161,5811,5812,5817,5820],{},[179,5813,5814],{},[31,5815,5816],{},"E‑Commerce",[179,5818,5819],{},"commerce_item, commerce_collection, commerce_inventory, commerce_saleschannel",[179,5821,5822],{},"Catalog, product types, FBA inventory summaries, marketplace participation",[161,5824,5825,5830,5833],{},[179,5826,5827],{},[31,5828,5829],{},"Accounting",[179,5831,5832],{},"commerce_account, accounting_salesorder, accounting_contact",[179,5834,5835],{},"Orders and related account\u002Fcontact style data from SP-API",[161,5837,5838,5843,5846],{},[179,5839,5840],{},[31,5841,5842],{},"Metadata",[179,5844,5845],{},"metadata_metadata",[179,5847,5848],{},"Custom \u002F structured metadata mapping where supported",[161,5850,5851,5854,5856],{},[179,5852,5853],{},"Exact read\u002Fwrite support follows your workspace permissions and the integration's object support matrix in the Unified app.",[179,5855],{},[179,5857],{},[19,5859],{},[22,5861,5862],{},[31,5863,5864],{},"Prerequisites (Amazon side)",[2510,5866,5867,5873,5916],{},[2357,5868,5869,5872],{},[31,5870,5871],{},"Active Seller Central"," account for the marketplaces you care about.",[2357,5874,5875,5878,5879,5882,5883,5887,5890,5894,5896,5899,5901,5904,5906,5907,5911,5913],{},[31,5876,5877],{},"SP-API developer registration"," — create and configure a ",[31,5880,5881],{},"Selling Partner API"," application in the Amazon developer \u002F SP-API flow. Please follow this guide: ",[41,5884,5885],{"href":5885,"rel":5886},"https:\u002F\u002Fdeveloper-docs.amazon.com\u002Fsp-api\u002Fdocs\u002Fregistering-your-application",[45],[5888,5889],"br",{},[4201,5891],{"alt":5892,"src":5893},"image.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fconnect_amazon_seller_central_to_unified-0.png",[5888,5895],{},[4201,5897],{"alt":5892,"src":5898},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fconnect_amazon_seller_central_to_unified-1.png",[5888,5900],{},[4201,5902],{"alt":5892,"src":5903},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fconnect_amazon_seller_central_to_unified-2.png",[5888,5905],{},"Put the redirect_url as shown here: ",[41,5908,5909],{"href":5909,"rel":5910},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Famazonsellercentral?tab=oauth2",[45],[5888,5912],{},[4201,5914],{"alt":5892,"src":5915},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fconnect_amazon_seller_central_to_unified-3.png",[2357,5917,5918,5921],{},[31,5919,5920],{},"LWA (Login with Amazon) security profile"," linked to that application so you obtain:",[2354,5923,5924,5929],{},[2357,5925,5926],{},[31,5927,5928],{},"LWA Client ID",[2357,5930,5931],{},[31,5932,5933],{},"LWA Client Secret",[2510,5935,5936,5942],{},[2357,5937,5938,5941],{},[31,5939,5940],{},"Marketplace ID(s)"," for each marketplace (e.g. US). Reference: Marketplace IDs.",[2357,5943,5944,5947],{},[31,5945,5946],{},"Correct region"," for the SP-API endpoint you will use (see below).",[22,5949,5950,5953,5954,5957,5958,5961],{},[31,5951,5952],{},"NOTE:"," Amazon's SP-API documentation also describes ",[31,5955,5956],{},"IAM users\u002Froles and request signing"," for many operations. Follow Amazon's current SP-API onboarding for your app (including any ",[31,5959,5960],{},"IAM \u002F signing"," requirements Amazon still enforces for certain endpoints). If calls fail with auth errors, verify the app's SP-API roles and Amazon's latest auth requirements.",[19,5963],{},[22,5965,5966],{},[31,5967,5968],{},"Choose the SP-API region (must match your selling region)",[22,5970,5971,5972,4950,5975,5978],{},"When connecting, pick the environment that matches where you sell (this selects ",[31,5973,5974],{},"authorize URL",[31,5976,5977],{},"SP-API base URL","):",[155,5980,5981,5991],{},[158,5982,5983],{},[161,5984,5985,5988],{},[164,5986,5987],{},"Region",[164,5989,5990],{},"Host",[174,5992,5993,6006,6018],{},[161,5994,5995,6000],{},[179,5996,5997],{},[31,5998,5999],{},"North America",[179,6001,6002,6005],{},[31,6003,6004],{},"Seller Central"," host : .com",[161,6007,6008,6013],{},[179,6009,6010],{},[31,6011,6012],{},"Europe",[179,6014,6015,6017],{},[31,6016,6004],{}," host : .co.uk",[161,6019,6020,6025],{},[179,6021,6022],{},[31,6023,6024],{},"Far East",[179,6026,6027,6029],{},[31,6028,6004],{}," host : .co.jp",[19,6031],{},[22,6033,6034],{},[31,6035,6036],{},"Connect in Unified (step-by-step)",[2510,6038,6039,6048,6059,6069,6075],{},[2357,6040,6041,6044,6045,97],{},[31,6042,6043],{},"Open Integrations"," (or your product's connection UI) and activate ",[31,6046,6047],{},"Amazon Seller Central",[2357,6049,6050,6053,6054,4950,6056,6058],{},[31,6051,6052],{},"Enter OAuth app credentials"," from Amazon (LWA ",[31,6055,4491],{},[31,6057,4494],{},") in the fields your Unified workspace uses for this integration (same pattern as other OAuth2 apps).",[2357,6060,6061,6064,6065,6068],{},[31,6062,6063],{},"Set Marketplace ID"," in the field Unified uses as the developer \u002F connection key for this integration (",[31,6066,6067],{},"labeled as Marketplace ID"," in vendor config).",[2357,6070,6071,6074],{},[31,6072,6073],{},"Select the correct regional URL"," (North America vs Europe vs Far East) so authorize and API hosts align with your seller account.",[2357,6076,6077,6080,6081,6084],{},[31,6078,6079],{},"Start OAuth"," — you will be sent to ",[31,6082,6083],{},"Seller Central"," to approve the app (\u002Fapps\u002Fauthorize\u002Fconsent).",[19,6086],{},[22,6088,6089],{},[31,6090,6091],{},"Sandbox",[22,6093,6094,6095,6099],{},"Amazon documents an SP-API sandbox: ",[41,6096,6097],{"href":6097,"rel":6098},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Famazonsellercentral?tab=partnership",[45],"\nUse it if you are testing before production seller data.",{"title":2433,"searchDepth":2434,"depth":2434,"links":6101},[],"| Area           | Unified objects                                                               | Typical use                                                 ...",{"img":6104,"date":6105,"updated":6106,"tag":2457,"integrations":6107},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fconnect_amazon_seller_central_to_unified-icon.png","2026-05-13T14:25:00.000Z","2026-09-17T14:45:37.514Z","amazonsellercentral","\u002Fguides\u002Fconnect_amazon_seller_central_to_unified",{"title":5775,"description":6102},"guides\u002Fconnect_amazon_seller_central_to_unified","IszXDf3wmTMpdkSvRjd3iahKty1FwKilVvUW0W2iKTo",{"id":6113,"title":6114,"body":6115,"description":6135,"extension":2452,"meta":7026,"navigation":2459,"path":7031,"seo":7032,"stem":7033,"__hash__":7034},"guides\u002Fguides\u002Fconnecting_bamboohr_via_oauth_2.md","Connecting BambooHR via OAuth 2",{"type":12,"value":6116,"toc":7012},[6117,6120,6122,6127,6131,6133,6136,6139,6142,6144,6148,6155,6159,6162,6168,6171,6175,6180,6204,6208,6211,6223,6229,6233,6240,6250,6253,6258,6265,6273,6277,6283,6287,6289,6294,6299,6302,6318,6321,6781,6783,6787,6791,6794,6799,6804,6807,6841,6847,6852,6856,6858,6863,6868,6871,6903,6906,6909,6929,6931,6935,6939,6946,6956,6961,6965,6968,6975,6981,6986,6990,6993,6998,7005,7010],[15,6118,6114],{"id":6119},"connecting-bamboohr-via-oauth-2",[19,6121],{},[22,6123,6124],{},[25,6125,6126],{},"July 28, 2026",[15,6128,6130],{"id":6129},"bamboohr-oauth-setup-guide","BambooHR OAuth Setup Guide",[55,6132,4426],{"id":4425},[22,6134,6135],{},"First, register an application in the BambooHR Developer Portal to obtain OAuth credentials.",[22,6137,6138],{},"Next, configure those credentials in Unified.",[22,6140,6141],{},"After the setup is complete, your end users can authorize their own BambooHR accounts through your embedded Unified connection flow.",[19,6143],{},[15,6145,6147],{"id":6146},"part-a-set-up-your-app-in-the-bamboohr-developer-portal","Part A — Set Up Your App in the BambooHR Developer Portal",[4937,6149,6150],{},[22,6151,6152],{},[31,6153,6154],{},"One-time setup",[55,6156,6158],{"id":6157},"_1-open-the-bamboohr-developer-portal","1. Open the BambooHR Developer Portal",[22,6160,6161],{},"Go to:",[22,6163,6164],{},[41,6165,6166],{"href":6166,"rel":6167},"https:\u002F\u002Fdevelopers.bamboohr.com\u002Fhome\u002Fapplications",[45],[22,6169,6170],{},"Sign in to your BambooHR Developer Portal account.",[55,6172,6174],{"id":6173},"_2-create-a-new-application","2. Create a New Application",[22,6176,6177],{},[4201,6178],{"alt":5892,"src":6179},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fconnecting_bamboohr_via_oauth_2-0.png",[2510,6181,6182,6189,6199],{},[2357,6183,6184,6185,6188],{},"Click ",[31,6186,6187],{},"Add application"," in the top-right corner.",[2357,6190,6191,6192,6195,6196],{},"Enter an ",[31,6193,6194],{},"Application Name",", for example: ",[36,6197,6198],{},"unified",[2357,6200,6184,6201,97],{},[31,6202,6203],{},"Create Application",[55,6205,6207],{"id":6206},"_3-collect-your-application-details","3. Collect Your Application Details",[22,6209,6210],{},"After creating the application, note the following values:",[2354,6212,6213,6218],{},[2357,6214,6215],{},[31,6216,6217],{},"Application Key",[2357,6219,6220],{},[31,6221,6222],{},"Application ID",[22,6224,6225,6226,6228],{},"You will need the ",[31,6227,6217],{}," when configuring the integration in Unified.",[55,6230,6232],{"id":6231},"_4-copy-your-oauth-credentials","4. Copy Your OAuth Credentials",[22,6234,6235,6236,6239],{},"Under ",[31,6237,6238],{},"App Credentials",", copy the following:",[2354,6241,6242,6246],{},[2357,6243,6244],{},[31,6245,4491],{},[2357,6247,6248],{},[31,6249,4494],{},[22,6251,6252],{},"Use the eye icon to reveal the Client Secret.",[22,6254,6255],{},[4201,6256],{"alt":5892,"src":6257},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fconnecting_bamboohr_via_oauth_2-1.png",[22,6259,6260,6261,6264],{},"You can use ",[31,6262,6263],{},"Regenerate"," to create a new Client Secret when required.",[4937,6266,6267],{},[22,6268,6269,6272],{},[31,6270,6271],{},"Important:"," Treat the Client Secret like a password. If you regenerate it, you must also update the Client Secret in Unified.",[55,6274,6276],{"id":6275},"_5-add-the-redirect-uri","5. Add the Redirect URI",[22,6278,6235,6279,6282],{},[31,6280,6281],{},"Redirect URIs",", add the OAuth callback URL provided by Unified.",[55,6284,6286],{"id":6285},"_6-select-the-required-scopes","6. Select the Required Scopes",[22,6288,6161],{},[22,6290,6291],{},[31,6292,6293],{},"Application Scopes → Select Scopes",[22,6295,6296],{},[4201,6297],{"alt":5892,"src":6298},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fconnecting_bamboohr_via_oauth_2-2.png",[22,6300,6301],{},"For each available category, such as Employee, Company, Hiring, Time Off, and Reports, choose the appropriate permission level:",[2354,6303,6304,6309,6313],{},[2357,6305,6306],{},[31,6307,6308],{},"No Access",[2357,6310,6311],{},[31,6312,4650],{},[2357,6314,6315],{},[31,6316,6317],{},"Read \u002F Write",[22,6319,6320],{},"Configure the following scopes as required by your implementation:",[2584,6322,6324],{"className":2649,"code":6323,"language":2651,"meta":2652,"style":2433},"email\nopenid\ncompany:info\ncompany_file\ncompany_file.write\nemployee\nemployee.write\nemployee:assets\nemployee:assets.write\nemployee:compensation\nemployee:compensation.write\nemployee:contact\nemployee:contact.write\nemployee:custom_fields\nemployee:custom_fields.write\nemployee:custom_fields_encrypted\nemployee:custom_fields_encrypted.write\nemployee:demographic\nemployee:demographic.write\nemployee:dependent\nemployee:dependent.write\nemployee:dependent:ssn\nemployee:dependent:ssn.write\nemployee:education\nemployee:education.write\nemployee:emergency_contacts\nemployee:emergency_contacts.write\nemployee:file\nemployee:file.write\nemployee:identification\nemployee:identification.write\nemployee:job\nemployee:job.write\nemployee:management\nemployee:management.write\nemployee:name\nemployee:name.write\nemployee:payroll\nemployee:payroll.write\nemployee:photo\nemployee:photo.write\nemployee:providers\nemployee:providers.write\nemployee:providers:payroll\nemployee:providers:payroll.write\nemployee:vaccination\nemployee:vaccination.write\nemployee_verifications\nemployee_verifications.write\ngoal\ngoal.write\nonboarding\nonboarding.write\nperformance:assessments\nperformance:assessments.write\nperformance:feedback\nperformance:feedback.write\nperformance:one_on_ones\nperformance:one_on_ones.write\nsensitive_employee:address\nsensitive_employee:address.write\nsensitive_employee:creditcards\nsensitive_employee:creditcards.write\nsensitive_employee:protected_info\nsensitive_employee:protected_info.write\ntasks\ntasks.write\nhiring:applications\nhiring:applications.write\nhiring:job_openings\nhiring:job_openings.write\noffline_access\nuser\nuser.write\nreport\nreport.write\ntime_off\ntime_off.write\ntime_off:requests\ntime_off:requests.write\n",[36,6325,6326,6331,6336,6341,6346,6351,6356,6361,6366,6371,6376,6381,6386,6391,6396,6401,6406,6411,6416,6421,6426,6431,6436,6441,6446,6451,6457,6463,6469,6475,6481,6487,6493,6499,6505,6511,6517,6523,6529,6535,6541,6547,6553,6559,6565,6571,6577,6583,6589,6595,6601,6607,6613,6619,6625,6631,6637,6643,6649,6655,6661,6667,6673,6679,6685,6691,6697,6703,6709,6715,6721,6727,6733,6739,6745,6751,6757,6763,6769,6775],{"__ignoreMap":2433},[414,6327,6328],{"class":2593,"line":2594},[414,6329,6330],{},"email\n",[414,6332,6333],{"class":2593,"line":2434},[414,6334,6335],{},"openid\n",[414,6337,6338],{"class":2593,"line":2613},[414,6339,6340],{},"company:info\n",[414,6342,6343],{"class":2593,"line":2625},[414,6344,6345],{},"company_file\n",[414,6347,6348],{"class":2593,"line":2677},[414,6349,6350],{},"company_file.write\n",[414,6352,6353],{"class":2593,"line":2751},[414,6354,6355],{},"employee\n",[414,6357,6358],{"class":2593,"line":2760},[414,6359,6360],{},"employee.write\n",[414,6362,6363],{"class":2593,"line":2768},[414,6364,6365],{},"employee:assets\n",[414,6367,6368],{"class":2593,"line":2776},[414,6369,6370],{},"employee:assets.write\n",[414,6372,6373],{"class":2593,"line":2784},[414,6374,6375],{},"employee:compensation\n",[414,6377,6378],{"class":2593,"line":2792},[414,6379,6380],{},"employee:compensation.write\n",[414,6382,6383],{"class":2593,"line":2804},[414,6384,6385],{},"employee:contact\n",[414,6387,6388],{"class":2593,"line":2809},[414,6389,6390],{},"employee:contact.write\n",[414,6392,6393],{"class":2593,"line":2829},[414,6394,6395],{},"employee:custom_fields\n",[414,6397,6398],{"class":2593,"line":2843},[414,6399,6400],{},"employee:custom_fields.write\n",[414,6402,6403],{"class":2593,"line":2849},[414,6404,6405],{},"employee:custom_fields_encrypted\n",[414,6407,6408],{"class":2593,"line":2854},[414,6409,6410],{},"employee:custom_fields_encrypted.write\n",[414,6412,6413],{"class":2593,"line":2880},[414,6414,6415],{},"employee:demographic\n",[414,6417,6418],{"class":2593,"line":3253},[414,6419,6420],{},"employee:demographic.write\n",[414,6422,6423],{"class":2593,"line":3261},[414,6424,6425],{},"employee:dependent\n",[414,6427,6428],{"class":2593,"line":3279},[414,6429,6430],{},"employee:dependent.write\n",[414,6432,6433],{"class":2593,"line":3313},[414,6434,6435],{},"employee:dependent:ssn\n",[414,6437,6438],{"class":2593,"line":3326},[414,6439,6440],{},"employee:dependent:ssn.write\n",[414,6442,6443],{"class":2593,"line":3339},[414,6444,6445],{},"employee:education\n",[414,6447,6448],{"class":2593,"line":3359},[414,6449,6450],{},"employee:education.write\n",[414,6452,6454],{"class":2593,"line":6453},26,[414,6455,6456],{},"employee:emergency_contacts\n",[414,6458,6460],{"class":2593,"line":6459},27,[414,6461,6462],{},"employee:emergency_contacts.write\n",[414,6464,6466],{"class":2593,"line":6465},28,[414,6467,6468],{},"employee:file\n",[414,6470,6472],{"class":2593,"line":6471},29,[414,6473,6474],{},"employee:file.write\n",[414,6476,6478],{"class":2593,"line":6477},30,[414,6479,6480],{},"employee:identification\n",[414,6482,6484],{"class":2593,"line":6483},31,[414,6485,6486],{},"employee:identification.write\n",[414,6488,6490],{"class":2593,"line":6489},32,[414,6491,6492],{},"employee:job\n",[414,6494,6496],{"class":2593,"line":6495},33,[414,6497,6498],{},"employee:job.write\n",[414,6500,6502],{"class":2593,"line":6501},34,[414,6503,6504],{},"employee:management\n",[414,6506,6508],{"class":2593,"line":6507},35,[414,6509,6510],{},"employee:management.write\n",[414,6512,6514],{"class":2593,"line":6513},36,[414,6515,6516],{},"employee:name\n",[414,6518,6520],{"class":2593,"line":6519},37,[414,6521,6522],{},"employee:name.write\n",[414,6524,6526],{"class":2593,"line":6525},38,[414,6527,6528],{},"employee:payroll\n",[414,6530,6532],{"class":2593,"line":6531},39,[414,6533,6534],{},"employee:payroll.write\n",[414,6536,6538],{"class":2593,"line":6537},40,[414,6539,6540],{},"employee:photo\n",[414,6542,6544],{"class":2593,"line":6543},41,[414,6545,6546],{},"employee:photo.write\n",[414,6548,6550],{"class":2593,"line":6549},42,[414,6551,6552],{},"employee:providers\n",[414,6554,6556],{"class":2593,"line":6555},43,[414,6557,6558],{},"employee:providers.write\n",[414,6560,6562],{"class":2593,"line":6561},44,[414,6563,6564],{},"employee:providers:payroll\n",[414,6566,6568],{"class":2593,"line":6567},45,[414,6569,6570],{},"employee:providers:payroll.write\n",[414,6572,6574],{"class":2593,"line":6573},46,[414,6575,6576],{},"employee:vaccination\n",[414,6578,6580],{"class":2593,"line":6579},47,[414,6581,6582],{},"employee:vaccination.write\n",[414,6584,6586],{"class":2593,"line":6585},48,[414,6587,6588],{},"employee_verifications\n",[414,6590,6592],{"class":2593,"line":6591},49,[414,6593,6594],{},"employee_verifications.write\n",[414,6596,6598],{"class":2593,"line":6597},50,[414,6599,6600],{},"goal\n",[414,6602,6604],{"class":2593,"line":6603},51,[414,6605,6606],{},"goal.write\n",[414,6608,6610],{"class":2593,"line":6609},52,[414,6611,6612],{},"onboarding\n",[414,6614,6616],{"class":2593,"line":6615},53,[414,6617,6618],{},"onboarding.write\n",[414,6620,6622],{"class":2593,"line":6621},54,[414,6623,6624],{},"performance:assessments\n",[414,6626,6628],{"class":2593,"line":6627},55,[414,6629,6630],{},"performance:assessments.write\n",[414,6632,6634],{"class":2593,"line":6633},56,[414,6635,6636],{},"performance:feedback\n",[414,6638,6640],{"class":2593,"line":6639},57,[414,6641,6642],{},"performance:feedback.write\n",[414,6644,6646],{"class":2593,"line":6645},58,[414,6647,6648],{},"performance:one_on_ones\n",[414,6650,6652],{"class":2593,"line":6651},59,[414,6653,6654],{},"performance:one_on_ones.write\n",[414,6656,6658],{"class":2593,"line":6657},60,[414,6659,6660],{},"sensitive_employee:address\n",[414,6662,6664],{"class":2593,"line":6663},61,[414,6665,6666],{},"sensitive_employee:address.write\n",[414,6668,6670],{"class":2593,"line":6669},62,[414,6671,6672],{},"sensitive_employee:creditcards\n",[414,6674,6676],{"class":2593,"line":6675},63,[414,6677,6678],{},"sensitive_employee:creditcards.write\n",[414,6680,6682],{"class":2593,"line":6681},64,[414,6683,6684],{},"sensitive_employee:protected_info\n",[414,6686,6688],{"class":2593,"line":6687},65,[414,6689,6690],{},"sensitive_employee:protected_info.write\n",[414,6692,6694],{"class":2593,"line":6693},66,[414,6695,6696],{},"tasks\n",[414,6698,6700],{"class":2593,"line":6699},67,[414,6701,6702],{},"tasks.write\n",[414,6704,6706],{"class":2593,"line":6705},68,[414,6707,6708],{},"hiring:applications\n",[414,6710,6712],{"class":2593,"line":6711},69,[414,6713,6714],{},"hiring:applications.write\n",[414,6716,6718],{"class":2593,"line":6717},70,[414,6719,6720],{},"hiring:job_openings\n",[414,6722,6724],{"class":2593,"line":6723},71,[414,6725,6726],{},"hiring:job_openings.write\n",[414,6728,6730],{"class":2593,"line":6729},72,[414,6731,6732],{},"offline_access\n",[414,6734,6736],{"class":2593,"line":6735},73,[414,6737,6738],{},"user\n",[414,6740,6742],{"class":2593,"line":6741},74,[414,6743,6744],{},"user.write\n",[414,6746,6748],{"class":2593,"line":6747},75,[414,6749,6750],{},"report\n",[414,6752,6754],{"class":2593,"line":6753},76,[414,6755,6756],{},"report.write\n",[414,6758,6760],{"class":2593,"line":6759},77,[414,6761,6762],{},"time_off\n",[414,6764,6766],{"class":2593,"line":6765},78,[414,6767,6768],{},"time_off.write\n",[414,6770,6772],{"class":2593,"line":6771},79,[414,6773,6774],{},"time_off:requests\n",[414,6776,6778],{"class":2593,"line":6777},80,[414,6779,6780],{},"time_off:requests.write\n",[19,6782],{},[15,6784,6786],{"id":6785},"part-b-configure-bamboohr-in-unified","Part B — Configure BambooHR in Unified",[55,6788,6790],{"id":6789},"_7-configure-the-bamboohr-integration","7. Configure the BambooHR Integration",[22,6792,6793],{},"In the Unified dashboard, go to:",[22,6795,6796],{},[31,6797,6798],{},"Integrations → BambooHR → Authorization",[22,6800,6801],{},[4201,6802],{"alt":5892,"src":6803},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fconnecting_bamboohr_via_oauth_2-3.png",[22,6805,6806],{},"Configure the following fields:",[2354,6808,6809,6815,6822,6827],{},[2357,6810,6811,6812],{},"Set the authorization method to ",[31,6813,6814],{},"OAuth 2",[2357,6816,6817,6818,6821],{},"Paste the ",[31,6819,6820],{},"OAuth 2 Client ID"," from Step 4",[2357,6823,6817,6824,6821],{},[31,6825,6826],{},"OAuth 2 Client Secret",[2357,6828,6829,6830,6833],{},"Enter the ",[31,6831,6832],{},"Developer API Key",[2354,6834,6835],{},[2357,6836,6837,6838,6840],{},"Use the ",[31,6839,6217],{}," collected in Step 3",[22,6842,6184,6843,6846],{},[31,6844,6845],{},"Update"," to save the configuration.",[22,6848,6849],{},[4201,6850],{"alt":5892,"src":6851},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fconnecting_bamboohr_via_oauth_2-4.png",[55,6853,6855],{"id":6854},"_8-configure-the-embedded-component","8. Configure the Embedded Component",[22,6857,6793],{},[22,6859,6860],{},[31,6861,6862],{},"Embedded components",[22,6864,6865],{},[4201,6866],{"alt":5892,"src":6867},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fconnecting_bamboohr_via_oauth_2-5.png",[22,6869,6870],{},"Configure the following settings:",[2354,6872,6873,6878,6883,6898],{},[2357,6874,6875],{},[31,6876,6877],{},"Success URL",[2357,6879,6880],{},[31,6881,6882],{},"Failure URL",[2357,6884,6885,6888,6889],{},[31,6886,6887],{},"Data region",", such as:\n",[2354,6890,6891,6893,6895],{},[2357,6892,5108],{},[2357,6894,5118],{},[2357,6896,6897],{},"AU",[2357,6899,6900],{},[31,6901,6902],{},"Permission Scopes \u002F Categories",[22,6904,6905],{},"Copy the appropriate embed code into your application.",[22,6907,6908],{},"Unified provides embed options for:",[2354,6910,6911,6914,6917,6920,6923,6926],{},[2357,6912,6913],{},"React",[2357,6915,6916],{},"Angular",[2357,6918,6919],{},"Vue",[2357,6921,6922],{},"Svelte",[2357,6924,6925],{},"JavaScript",[2357,6927,6928],{},"API-based implementations",[19,6930],{},[15,6932,6934],{"id":6933},"part-c-end-user-authorization-flow","Part C — End-User Authorization Flow",[55,6936,6938],{"id":6937},"_9-enter-the-bamboohr-domain","9. Enter the BambooHR Domain",[22,6940,6941,6942,6945],{},"In the embedded authorization flow, the end user sees the ",[31,6943,6944],{},"Authorize Access"," screen.",[22,6947,6948,6949,6952,6953,97],{},"The user enters their ",[31,6950,6951],{},"BambooHR Domain"," and clicks ",[31,6954,6955],{},"Authorize",[22,6957,6958],{},[4201,6959],{"alt":5892,"src":6960},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fconnecting_bamboohr_via_oauth_2-6.png",[55,6962,6964],{"id":6963},"_10-approve-access","10. Approve Access",[22,6966,6967],{},"BambooHR displays a consent screen similar to:",[4937,6969,6970],{},[22,6971,6972],{},[31,6973,6974],{},"Share access with unified?",[22,6976,6977,6978,97],{},"The user reviews the requested scopes and clicks ",[31,6979,6980],{},"Allow Access",[22,6982,6983],{},[4201,6984],{"alt":5892,"src":6985},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fconnecting_bamboohr_via_oauth_2-7.png",[55,6987,6989],{"id":6988},"_11-confirm-the-connection","11. Confirm the Connection",[22,6991,6992],{},"After authorization is completed, the connection appears in Unified under:",[22,6994,6995],{},[31,6996,6997],{},"Settings → Connections",[22,6999,7000,7001,7004],{},"The connection should display a ",[31,7002,7003],{},"Healthy"," status.",[22,7006,7007],{},[4201,7008],{"alt":5892,"src":7009},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fconnecting_bamboohr_via_oauth_2-8.png",[4156,7011,5736],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":7013},[7014,7015,7016,7017,7018,7019,7020,7021,7022,7023,7024,7025],{"id":4425,"depth":2434,"text":4426},{"id":6157,"depth":2434,"text":6158},{"id":6173,"depth":2434,"text":6174},{"id":6206,"depth":2434,"text":6207},{"id":6231,"depth":2434,"text":6232},{"id":6275,"depth":2434,"text":6276},{"id":6285,"depth":2434,"text":6286},{"id":6789,"depth":2434,"text":6790},{"id":6854,"depth":2434,"text":6855},{"id":6937,"depth":2434,"text":6938},{"id":6963,"depth":2434,"text":6964},{"id":6988,"depth":2434,"text":6989},{"img":7027,"date":7028,"updated":7029,"tag":2457,"integrations":7030},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fconnecting_bamboohr_via_oauth_2-icon.svg","2026-07-28T21:01:00.000Z","2026-08-23T14:54:25.577Z","bamboohr","\u002Fguides\u002Fconnecting_bamboohr_via_oauth_2",{"title":6114,"description":6135},"guides\u002Fconnecting_bamboohr_via_oauth_2","FJSRSFWwXGs5i8YKREbhusQvC4KTal1qlFrCMeP89Mo",{"id":7036,"title":7037,"body":7038,"description":7947,"extension":2452,"meta":7948,"navigation":2459,"path":7953,"seo":7954,"stem":7955,"__hash__":7956},"guides\u002Fguides\u002Fconnecting_google_workspace_integrations_with_a_service_account.md","Connecting Google Workspace Integrations with a Service Account",{"type":12,"value":7039,"toc":7931},[7040,7043,7045,7050,7061,7067,7082,7084,7090,7110,7116,7131,7247,7253,7287,7293,7318,7321,7475,7477,7483,7486,7492,7503,7552,7557,7563,7569,7589,7592,7594,7600,7603,7730,7732,7738,7745,7817,7819,7823,7911,7917,7928],[15,7041,7037],{"id":7042},"connecting-google-workspace-integrations-with-a-service-account",[19,7044],{},[22,7046,7047],{},[25,7048,7049],{},"May 21, 2026",[22,7051,7052,7053,7056,7057,7060],{},"Unified API supports two ways to authenticate Google integrations: the standard interactive ",[31,7054,7055],{},"OAuth2"," flow (a user clicks \"Allow\"), or a ",[31,7058,7059],{},"service account"," for server-to-server access with no human in the loop. This guide covers the service account path: how to create one, how to grant it access to your data, and what to enter in Unified API.",[55,7062,7064],{"id":7063},"when-to-use-a-service-account",[31,7065,7066],{},"When to use a service account",[22,7068,7069,7070,7073,7074,7077,7078,7081],{},"Use a service account when you want a backend system to access Google data without a user logging in each time — for example, syncing every mailbox in your company, reading a shared Drive, or managing your Workspace directory. For most Workspace data (Gmail, Calendar, Drive files owned by users, etc.) the service account must ",[31,7071,7072],{},"impersonate"," a user via ",[31,7075,7076],{},"domain-wide delegation (DWD)",". For a few APIs (Analytics, Merchant Center, Campaign Manager) you instead just ",[31,7079,7080],{},"share"," the resource with the service account's email — no delegation needed.",[19,7083],{},[55,7085,7087],{"id":7086},"step-1-create-a-google-cloud-project",[31,7088,7089],{},"Step 1 — Create a Google Cloud project",[2510,7091,7092,7100,7103],{},[2357,7093,7094,7095,97],{},"Go to the ",[41,7096,7099],{"href":7097,"rel":7098},"https:\u002F\u002Fconsole.cloud.google.com\u002F",[45],"Google Cloud Console",[2357,7101,7102],{},"Create a new project (or select an existing one) using the project picker at the top.",[2357,7104,7105,7106,7109],{},"Note the ",[31,7107,7108],{},"Project ID"," — you'll see it referenced in the key file later.",[55,7111,7113],{"id":7112},"step-2-enable-the-apis-you-need",[31,7114,7115],{},"Step 2 — Enable the APIs you need",[2510,7117,7118,7124],{},[2357,7119,7120,7121,97],{},"Navigate to ",[31,7122,7123],{},"APIs & Services → Library",[2357,7125,7126,7127,7130],{},"Search for and ",[31,7128,7129],{},"Enable"," the API for each integration you'll use:",[155,7132,7133,7146],{},[158,7134,7135],{},[161,7136,7137,7141],{},[164,7138,7139],{},[31,7140,166],{},[164,7142,7143],{},[31,7144,7145],{},"API to enable",[174,7147,7148,7156,7164,7172,7180,7188,7196,7204,7212,7220,7228,7236],{},[161,7149,7150,7153],{},[179,7151,7152],{},"Google Drive",[179,7154,7155],{},"Google Drive API",[161,7157,7158,7161],{},[179,7159,7160],{},"Gmail",[179,7162,7163],{},"Gmail API",[161,7165,7166,7169],{},[179,7167,7168],{},"Google Calendar",[179,7170,7171],{},"Google Calendar API",[161,7173,7174,7177],{},[179,7175,7176],{},"Google Sheets",[179,7178,7179],{},"Google Sheets API",[161,7181,7182,7185],{},[179,7183,7184],{},"Google Docs",[179,7186,7187],{},"Google Docs API",[161,7189,7190,7193],{},[179,7191,7192],{},"Google Slides",[179,7194,7195],{},"Google Slides API",[161,7197,7198,7201],{},[179,7199,7200],{},"Google Forms",[179,7202,7203],{},"Google Forms API",[161,7205,7206,7209],{},[179,7207,7208],{},"Google Tasks",[179,7210,7211],{},"Google Tasks API",[161,7213,7214,7217],{},[179,7215,7216],{},"Google Contacts",[179,7218,7219],{},"People API",[161,7221,7222,7225],{},[179,7223,7224],{},"Google Meet",[179,7226,7227],{},"Google Meet API + Google Calendar API",[161,7229,7230,7233],{},[179,7231,7232],{},"Workspace Directory",[179,7234,7235],{},"Admin SDK API",[161,7237,7238,7245],{},[179,7239,7240,7241,7244],{},"If an API isn't enabled, calls will fail with a ",[36,7242,7243],{},"403 ... API has not been used in project"," error.",[179,7246],{},[55,7248,7250],{"id":7249},"step-3-create-the-service-account",[31,7251,7252],{},"Step 3 — Create the service account",[2510,7254,7255,7261,7271,7277],{},[2357,7256,7257,7258,97],{},"Go to ",[31,7259,7260],{},"APIs & Services → Credentials → Create credentials → Service account",[2357,7262,7263,7264,7267,7268,97],{},"Give it a name (e.g. ",[36,7265,7266],{},"unified-api-sync",") and click ",[31,7269,7270],{},"Create and continue",[2357,7272,7273,7274,97],{},"You can skip the optional \"grant access\" steps for now. Click ",[31,7275,7276],{},"Done",[2357,7278,7279,7280,7283,7284],{},"You'll land on the service account list. Note its ",[31,7281,7282],{},"email"," — it looks like:",[36,7285,7286],{},"unified-api-sync@your-project-id.iam.gserviceaccount.com",[55,7288,7290],{"id":7289},"step-4-generate-a-key",[31,7291,7292],{},"Step 4 — Generate a key",[2510,7294,7295,7302,7307],{},[2357,7296,7297,7298,7301],{},"Click the service account, then open the ",[31,7299,7300],{},"Keys"," tab.",[2357,7303,7304],{},[31,7305,7306],{},"Add key → Create new key → JSON → Create.",[2357,7308,7309,7310,7313,7314,7317],{},"A ",[36,7311,7312],{},".json"," file downloads. ",[31,7315,7316],{},"Store it securely"," — Google does not let you re-download it.",[22,7319,7320],{},"The file looks like this (the two fields you need are highlighted):",[2584,7322,7326],{"className":7323,"code":7324,"language":7325,"meta":2433,"style":2433},"language-json shiki shiki-themes github-dark github-dark github-light","{  \n    \"type\": \"service_account\",  \n    \"project_id\": \"your-project-id\",  \n    \"private_key_id\": \"abc123...\",  \n    \"private_key\": \"-----BEGIN PRIVATE KEY-----\\nMIIEv...\\n-----END PRIVATE KEY-----\\n\",   ← Service Account Private Key  \n    \"client_email\": \"unified-api-sync@your-project-id.iam.gserviceaccount.com\",            ← Service Account Email  \n    \"client_id\": \"11223344...\",  \n    \"token_uri\": \"https:\u002F\u002Foauth2.googleapis.com\u002Ftoken\",  \n    ...\n}\n","json",[36,7327,7328,7333,7347,7359,7371,7418,7442,7454,7466,7471],{"__ignoreMap":2433},[414,7329,7330],{"class":2593,"line":2594},[414,7331,7332],{"class":2705},"{  \n",[414,7334,7335,7338,7341,7344],{"class":2593,"line":2434},[414,7336,7337],{"class":2607},"    \"type\"",[414,7339,7340],{"class":2705},": ",[414,7342,7343],{"class":2601},"\"service_account\"",[414,7345,7346],{"class":2705},",  \n",[414,7348,7349,7352,7354,7357],{"class":2593,"line":2613},[414,7350,7351],{"class":2607},"    \"project_id\"",[414,7353,7340],{"class":2705},[414,7355,7356],{"class":2601},"\"your-project-id\"",[414,7358,7346],{"class":2705},[414,7360,7361,7364,7366,7369],{"class":2593,"line":2625},[414,7362,7363],{"class":2607},"    \"private_key_id\"",[414,7365,7340],{"class":2705},[414,7367,7368],{"class":2601},"\"abc123...\"",[414,7370,7346],{"class":2705},[414,7372,7373,7376,7378,7381,7383,7386,7388,7391,7393,7396,7399,7403,7406,7409,7412,7415],{"class":2593,"line":2677},[414,7374,7375],{"class":2607},"    \"private_key\"",[414,7377,7340],{"class":2705},[414,7379,7380],{"class":2601},"\"-----BEGIN PRIVATE KEY-----",[414,7382,3352],{"class":2607},[414,7384,7385],{"class":2601},"MIIEv...",[414,7387,3352],{"class":2607},[414,7389,7390],{"class":2601},"-----END PRIVATE KEY-----",[414,7392,3352],{"class":2607},[414,7394,7395],{"class":2601},"\"",[414,7397,7398],{"class":2705},",   ",[414,7400,7402],{"class":7401},"sgQC_","←",[414,7404,7405],{"class":7401}," Service",[414,7407,7408],{"class":7401}," Account",[414,7410,7411],{"class":7401}," Private",[414,7413,7414],{"class":7401}," Key",[414,7416,7417],{"class":2705},"  \n",[414,7419,7420,7423,7425,7428,7431,7433,7435,7437,7440],{"class":2593,"line":2751},[414,7421,7422],{"class":2607},"    \"client_email\"",[414,7424,7340],{"class":2705},[414,7426,7427],{"class":2601},"\"unified-api-sync@your-project-id.iam.gserviceaccount.com\"",[414,7429,7430],{"class":2705},",            ",[414,7432,7402],{"class":7401},[414,7434,7405],{"class":7401},[414,7436,7408],{"class":7401},[414,7438,7439],{"class":7401}," Email",[414,7441,7417],{"class":2705},[414,7443,7444,7447,7449,7452],{"class":2593,"line":2760},[414,7445,7446],{"class":2607},"    \"client_id\"",[414,7448,7340],{"class":2705},[414,7450,7451],{"class":2601},"\"11223344...\"",[414,7453,7346],{"class":2705},[414,7455,7456,7459,7461,7464],{"class":2593,"line":2768},[414,7457,7458],{"class":2607},"    \"token_uri\"",[414,7460,7340],{"class":2705},[414,7462,7463],{"class":2601},"\"https:\u002F\u002Foauth2.googleapis.com\u002Ftoken\"",[414,7465,7346],{"class":2705},[414,7467,7468],{"class":2593,"line":2776},[414,7469,7470],{"class":7401},"    ...\n",[414,7472,7473],{"class":2593,"line":2784},[414,7474,3035],{"class":2705},[19,7476],{},[55,7478,7480],{"id":7479},"step-5-grant-the-service-account-access-to-your-data",[31,7481,7482],{},"Step 5 — Grant the service account access to your data",[22,7484,7485],{},"This is the step that differs by API. Pick the path that matches your integration.",[3629,7487,7489],{"id":7488},"path-a-domain-wide-delegation-workspace-user-data",[31,7490,7491],{},"Path A — Domain-wide delegation (Workspace user data)",[22,7493,7494,7495,7498,7499,7502],{},"Required for ",[31,7496,7497],{},"Gmail, Calendar, Drive (user files), Sheets, Docs, Slides, Forms, Tasks, Contacts, Meet, and Directory",". This lets the service account act ",[25,7500,7501],{},"as"," a specific user in your Workspace.",[2510,7504,7505,7515,7527,7546],{},[2357,7506,7507,7508,7510,7511,7514],{},"On the service account's detail page, note its ",[31,7509,4491],{}," (the numeric ",[36,7512,7513],{},"client_id"," from the JSON, also called \"Unique ID\").",[2357,7516,7517,7518,7521,7522,97],{},"As a Workspace ",[31,7519,7520],{},"super admin",", go to the ",[41,7523,7526],{"href":7524,"rel":7525},"https:\u002F\u002Fadmin.google.com\u002Fac\u002Fowl\u002Fdomainwidedelegation",[45],"Admin Console → Security → Access and data control → API controls → Domain-wide delegation",[2357,7528,6184,7529,7532,7533],{},[31,7530,7531],{},"Add new"," and enter:\n",[2354,7534,7535,7540],{},[2357,7536,7537,7539],{},[31,7538,4491],{},": the service account's numeric Client ID.",[2357,7541,7542,7545],{},[31,7543,7544],{},"OAuth scopes",": a comma-separated list of the scopes for the APIs you'll use (see the scope table below).",[2357,7547,7548,7551],{},[31,7549,7550],{},"Authorize."," Changes can take a few minutes to propagate.",[4937,7553,7554],{},[22,7555,7556],{},"Only the scopes you authorize here will work. If you add the Drive integration later, you must come back and add the Drive scope.",[3629,7558,7560],{"id":7559},"path-b-resource-sharing-no-delegation",[31,7561,7562],{},"Path B — Resource sharing (no delegation)",[22,7564,7565,7566,7568],{},"For APIs where data is owned by an account\u002Fproperty rather than a user, you skip DWD and just grant the service account's ",[31,7567,7282],{}," access inside the product:",[2354,7570,7571,7577,7583],{},[2357,7572,7573,7576],{},[31,7574,7575],{},"Google Analytics"," — add the service account email as a user on the GA4 property.",[2357,7578,7579,7582],{},[31,7580,7581],{},"Merchant Center"," — add it as a user in Merchant Center settings.",[2357,7584,7585,7588],{},[31,7586,7587],{},"Campaign Manager \u002F Display & Video 360"," — add it as a user in the platform.",[22,7590,7591],{},"(These integrations aren't part of the Workspace set covered here but follow the same key-creation steps.)",[19,7593],{},[55,7595,7597],{"id":7596},"step-6-scopes-per-integration",[31,7598,7599],{},"Step 6 — Scopes per integration",[22,7601,7602],{},"When configuring domain-wide delegation (Path A), authorize the matching scope(s). These are exactly the scopes Unified API requests when minting tokens:",[155,7604,7605,7618],{},[158,7606,7607],{},[161,7608,7609,7613],{},[164,7610,7611],{},[31,7612,166],{},[164,7614,7615],{},[31,7616,7617],{},"Scope(s) to authorize",[174,7619,7620,7629,7638,7647,7656,7665,7674,7686,7695,7704,7715],{},[161,7621,7622,7624],{},[179,7623,7152],{},[179,7625,7626],{},[36,7627,7628],{},"https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fdrive",[161,7630,7631,7633],{},[179,7632,7160],{},[179,7634,7635],{},[36,7636,7637],{},"https:\u002F\u002Fmail.google.com\u002F",[161,7639,7640,7642],{},[179,7641,7168],{},[179,7643,7644],{},[36,7645,7646],{},"https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fcalendar",[161,7648,7649,7651],{},[179,7650,7176],{},[179,7652,7653],{},[36,7654,7655],{},"https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fspreadsheets",[161,7657,7658,7660],{},[179,7659,7184],{},[179,7661,7662],{},[36,7663,7664],{},"https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fdocuments",[161,7666,7667,7669],{},[179,7668,7192],{},[179,7670,7671],{},[36,7672,7673],{},"https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fpresentations",[161,7675,7676,7678],{},[179,7677,7200],{},[179,7679,7680,4696,7683],{},[36,7681,7682],{},"https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fforms.body",[36,7684,7685],{},"https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fforms.responses.readonly",[161,7687,7688,7690],{},[179,7689,7208],{},[179,7691,7692],{},[36,7693,7694],{},"https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Ftasks",[161,7696,7697,7699],{},[179,7698,7216],{},[179,7700,7701],{},[36,7702,7703],{},"https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fcontacts",[161,7705,7706,7708],{},[179,7707,7224],{},[179,7709,7710,4696,7712],{},[36,7711,7646],{},[36,7713,7714],{},"https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fmeetings.space.readonly",[161,7716,7717,7719],{},[179,7718,7232],{},[179,7720,7721,4696,7724,4696,7727],{},[36,7722,7723],{},"https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fadmin.directory.user",[36,7725,7726],{},"https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fadmin.directory.group",[36,7728,7729],{},"https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fadmin.directory.group.member",[19,7731],{},[55,7733,7735],{"id":7734},"step-7-configure-the-connection-in-unified-api",[31,7736,7737],{},"Step 7 — Configure the connection in Unified API",[22,7739,7740,7741,7744],{},"When creating the connection, choose the ",[31,7742,7743],{},"Service Account"," authentication option and fill in three fields:",[155,7746,7747,7759],{},[158,7748,7749],{},[161,7750,7751,7755],{},[164,7752,7753],{},[31,7754,5244],{},[164,7756,7757],{},[31,7758,5247],{},[174,7760,7761,7774,7793,7810],{},[161,7762,7763,7768],{},[179,7764,7765],{},[31,7766,7767],{},"Service Account Email",[179,7769,5050,7770,7773],{},[36,7771,7772],{},"client_email"," from the JSON key file.",[161,7775,7776,7781],{},[179,7777,7778],{},[31,7779,7780],{},"Service Account Private Key",[179,7782,5050,7783,7786,7787,4950,7790,7792],{},[36,7784,7785],{},"private_key"," from the JSON key file — paste it whole, including the ",[36,7788,7789],{},"-----BEGIN PRIVATE KEY-----",[36,7791,7390],{}," lines.",[161,7794,7795,7800],{},[179,7796,7797],{},[31,7798,7799],{},"Subject",[179,7801,7802,7805,7806,7809],{},[25,7803,7804],{},"(Optional)"," The email of the Workspace user to impersonate via domain-wide delegation. ",[31,7807,7808],{},"Required for most Workspace data"," (e.g. Gmail needs a mailbox owner). Leave blank only if the service account itself owns the data or you've shared resources directly with it.",[161,7811,7812,7815],{},[179,7813,7814],{},"That's it. Unified API signs a short-lived JWT with your private key, exchanges it with Google for an access token (caching it until it expires), and uses it for all API calls — no further interaction needed.",[179,7816],{},[19,7818],{},[55,7820,7821],{"id":5621},[31,7822,5622],{},[155,7824,7825,7839],{},[158,7826,7827],{},[161,7828,7829,7834],{},[164,7830,7831],{},[31,7832,7833],{},"Error",[164,7835,7836],{},[31,7837,7838],{},"Likely cause",[174,7840,7841,7851,7861,7878,7893],{},[161,7842,7843,7848],{},[179,7844,7845],{},[36,7846,7847],{},"unauthorized_client",[179,7849,7850],{},"The scope isn't authorized in domain-wide delegation, or the Client ID is wrong. Re-check Step 5A.",[161,7852,7853,7858],{},[179,7854,7855],{},[36,7856,7857],{},"403 ... has not been used in project",[179,7859,7860],{},"The API isn't enabled for the project (Step 2).",[161,7862,7863,7872],{},[179,7864,7865,7868,7869],{},[36,7866,7867],{},"400 invalid_grant"," \u002F ",[36,7870,7871],{},"Invalid JWT Signature",[179,7873,7874,7875,7877],{},"The private key was pasted incorrectly (truncated, or newlines lost). Re-copy the full ",[36,7876,7785],{}," value.",[161,7879,7880,7887],{},[179,7881,7882,7883,7886],{},"Empty results \u002F ",[36,7884,7885],{},"404"," for a user's data",[179,7888,7889,7890,7892],{},"Missing or wrong ",[31,7891,7799],{}," — you're querying as the service account itself instead of impersonating the user.",[161,7894,7895,7901],{},[179,7896,7897,7900],{},[36,7898,7899],{},"403 Not Authorized to access this resource"," (Directory)",[179,7902,7903,7904,7906,7907,7910],{},"The impersonated ",[31,7905,7799],{}," must be a Workspace ",[31,7908,7909],{},"admin"," with rights to the directory data.",[3629,7912,7914],{"id":7913},"security-notes",[31,7915,7916],{},"Security notes",[2354,7918,7919,7922,7925],{},[2357,7920,7921],{},"The private key grants standing access to your data — store it in a secret manager, never in source control.",[2357,7923,7924],{},"Authorize only the scopes you actually use; broad scopes increase blast radius if the key leaks.",[2357,7926,7927],{},"Rotate keys periodically (create a new key, update the connection, delete the old key).",[4156,7929,7930],{},"html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sgQC_, html code.shiki .sgQC_{--shiki-default:#FDAEB7;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic;--shiki-light:#B31D28;--shiki-light-font-style:italic}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":2433,"searchDepth":2434,"depth":2434,"links":7932},[7933,7934,7935,7936,7937,7938,7942,7943,7944],{"id":7063,"depth":2434,"text":7066},{"id":7086,"depth":2434,"text":7089},{"id":7112,"depth":2434,"text":7115},{"id":7249,"depth":2434,"text":7252},{"id":7289,"depth":2434,"text":7292},{"id":7479,"depth":2434,"text":7482,"children":7939},[7940,7941],{"id":7488,"depth":2613,"text":7491},{"id":7559,"depth":2613,"text":7562},{"id":7596,"depth":2434,"text":7599},{"id":7734,"depth":2434,"text":7737},{"id":5621,"depth":2434,"text":5622,"children":7945},[7946],{"id":7913,"depth":2613,"text":7916},"Unified API supports two ways to authenticate Google integrations, the standard interactive OAuth2 flow (a user clicks \"Allow\"), or a service account for...",{"img":7949,"date":7950,"updated":7951,"tag":2457,"integrations":7952},"https:\u002F\u002Funified.to\u002Fimages\u002Flogo.svg","2026-05-21T16:13:00.000Z","2026-08-23T14:53:14.172Z","googledirectory","\u002Fguides\u002Fconnecting_google_workspace_integrations_with_a_service_account",{"title":7037,"description":7947},"guides\u002Fconnecting_google_workspace_integrations_with_a_service_account","Zxor4P4EASIrn9R02M2KEjsu2mk5jnF1R0CsAnLS2fw",{"id":7958,"title":7959,"body":7960,"description":7974,"extension":2452,"meta":8396,"navigation":2459,"path":8401,"seo":8402,"stem":8403,"__hash__":8404},"guides\u002Fguides\u002Fcorrect_welcomekit_scopes_for_jungle_integration.md","Correct WelcomeKit Scopes for Jungle Integration",{"type":12,"value":7961,"toc":8385},[7962,7965,7967,7972,7975,7979,8193,8195,8199,8203,8225,8228,8234,8253,8258,8285,8287,8291,8294,8305,8307,8311,8317,8321],[15,7963,7959],{"id":7964},"correct-welcomekit-scopes-for-jungle-integration",[19,7966],{},[22,7968,7969],{},[25,7970,7971],{},"April 14, 2026",[22,7973,7974],{},"This guide outlines the required WelcomeKit scopes per Unified object for the Jungle integration.",[55,7976,7978],{"id":7977},"scope-mapping-by-unified-object","Scope Mapping (by Unified Object)",[155,7980,7981,7994],{},[158,7982,7983],{},[161,7984,7985,7988,7991],{},[164,7986,7987],{},"Unified Object",[164,7989,7990],{},"Required Scope(s)",[164,7992,7993],{},"Partnership (su_*) Needed?",[174,7995,7996,8016,8053,8091,8127,8148,8171],{},[161,7997,7998,8008,8013],{},[179,7999,8000,8003,8006],{},[31,8001,8002],{},"ATS · Job (",[36,8004,8005],{},"ats_job",[31,8007,2980],{},[179,8009,8010],{},[36,8011,8012],{},"su_jobs_r",[179,8014,8015],{},"Yes",[161,8017,8018,8027,8051],{},[179,8019,8020,8023,8025],{},[31,8021,8022],{},"ATS · Candidate (",[36,8024,4931],{},[31,8026,2980],{},[179,8028,8029,8032,8033,8036,8037,34,8040,34,8042,8032,8045,8036,8048],{},[31,8030,8031],{},"Read:"," ",[36,8034,8035],{},"candidates_r"," AND ",[36,8038,8039],{},"my_candidates_r",[5888,8041],{},[31,8043,8044],{},"Write:",[36,8046,8047],{},"candidates_rw",[36,8049,8050],{},"my_candidates_rw",[179,8052,5314],{},[161,8054,8055,8065,8089],{},[179,8056,8057,8060,8063],{},[31,8058,8059],{},"ATS · Document (",[36,8061,8062],{},"ats_document",[31,8064,2980],{},[179,8066,8067,8032,8069,8072,8073,8075,8076,3107,8078,34,8080,8032,8082,8072,8085,8075,8087,2980],{},[31,8068,8031],{},[36,8070,8071],{},"documents_r"," AND (",[36,8074,8035],{}," & ",[36,8077,8039],{},[5888,8079],{},[31,8081,8044],{},[36,8083,8084],{},"documents_rw",[36,8086,8047],{},[36,8088,8050],{},[179,8090,5314],{},[161,8092,8093,8103,8125],{},[179,8094,8095,8098,8101],{},[31,8096,8097],{},"ATS · Activity (",[36,8099,8100],{},"ats_activity",[31,8102,2980],{},[179,8104,8105,8032,8107,8072,8110,8075,8112,3107,8114,34,8116,8032,8118,8072,8121,8075,8123,2980],{},[31,8106,8031],{},[36,8108,8109],{},"emails_r",[36,8111,8035],{},[36,8113,8039],{},[5888,8115],{},[31,8117,8044],{},[36,8119,8120],{},"comments_w",[36,8122,8047],{},[36,8124,8050],{},[179,8126,5314],{},[161,8128,8129,8139,8146],{},[179,8130,8131,8134,8137],{},[31,8132,8133],{},"HRIS · Company (",[36,8135,8136],{},"hris_company",[31,8138,2980],{},[179,8140,8141,34,8143],{},[31,8142,8031],{},[36,8144,8145],{},"su_organizations_r",[179,8147,8015],{},[161,8149,8150,8153,8169],{},[179,8151,8152],{},"HRIS · Location (hris_location)",[179,8154,8155,8156,8159,8160,34,8163,8165,8166],{},"Read: ",[36,8157,8158],{},"offices_r"," & ",[36,8161,8162],{},"su_offices_r",[5888,8164],{}," Write: ",[36,8167,8168],{},"offices_rw",[179,8170,8015],{},[161,8172,8173,8176,8191],{},[179,8174,8175],{},"HRIS · Group (hris_group)",[179,8177,8155,8178,8159,8181,8159,8184,34,8187,8165,8189],{},[36,8179,8180],{},"departments_r",[36,8182,8183],{},"departments_rw",[36,8185,8186],{},"su_departments_r",[5888,8188],{},[36,8190,8183],{},[179,8192,8015],{},[19,8194],{},[55,8196,8198],{"id":8197},"important-notes","Important Notes",[3629,8200,8202],{"id":8201},"partnership-only-scopes","Partnership-only scopes",[2354,8204,8205,8210,8215,8220],{},[2357,8206,8207,8209],{},[36,8208,8012],{}," → Required for listing jobs",[2357,8211,8212,8214],{},[36,8213,8145],{}," → Required for listing organizations",[2357,8216,8217,8219],{},[36,8218,8162],{},"  → Required for listing locations",[2357,8221,8222,8224],{},[36,8223,8186],{}," → Required for listing groups",[22,8226,8227],{},"These require WelcomeKit partnership approval.",[3629,8229,8231],{"id":8230},"non-partner-access-scope-overrides",[31,8232,8233],{},"Non-partner access (scope overrides)",[22,8235,8236,8237,8240,8241,8244,8245,8248,8249,8252],{},"If you do ",[31,8238,8239],{},"not"," have WelcomeKit partnership approval, you won't be able to use the partnership-only scopes. Instead, request the standard non-partner scopes by overriding the defaults for this integration. Each Unified permission (like ",[36,8242,8243],{},"ats_job_read",") maps to a default set of the provider's raw scopes, and you can replace that default per integration via the integration's scope override setting. Update the ",[36,8246,8247],{},"WorkspaceIntegration"," object with an ",[36,8250,8251],{},"overriden_scopes"," map keyed by the Unified permission, where each value is a comma-separated list of the provider's raw scopes:",[22,8254,8255],{},[36,8256,8257],{},"{ \"overriden_scopes\": { \"ats_job\": \"jobs_r\" } }",[22,8259,8260,8261,8264,8265,8267,8268,8271,8272,8275,8276,8279,8280,97],{},"With this override, Unified requests ",[36,8262,8263],{},"jobs_r"," (org-scoped jobs) instead of ",[36,8266,8012],{},". At runtime, the connector lists jobs via ",[36,8269,8270],{},"GET \u002Fjobs?organization_reference=..."," using the organization cached on the connection during auth setup, and falls back to ",[36,8273,8274],{},"GET \u002Fusers\u002Fcurrent"," for organization discovery — so non-partner keys never depend on the ",[36,8277,8278],{},"su_*"," scopes. For full details, see ",[41,8281,8284],{"href":8282,"rel":8283},"https:\u002F\u002Fdocs.unified.to\u002Fconcepts\u002Fscopes#overriding-scopes-per-integration",[45],"Overriding scopes per integration",[19,8286],{},[3629,8288,8290],{"id":8289},"candidate-dependent-scopes","Candidate-dependent scopes",[22,8292,8293],{},"The following always require candidate access:",[2354,8295,8296,8299,8302],{},[2357,8297,8298],{},"Documents → require candidate read\u002Fwrite scopes",[2357,8300,8301],{},"Emails → require candidate read scopes",[2357,8303,8304],{},"Comments → require candidate write scopes",[19,8306],{},[55,8308,8310],{"id":8309},"how-to-get-partnership-access-jungle-welcomekit","How to Get Partnership Access (Jungle \u002F WelcomeKit)",[22,8312,8313,8314,8316],{},"To access partnership-only scopes (",[36,8315,8278],{},"), you will need to be approved by WelcomeKit.",[3629,8318,8320],{"id":8319},"steps","Steps:",[2510,8322,8323,8340,8356,8369],{},[2357,8324,8325,8328,3141,8332],{},[31,8326,8327],{},"Reach out to WelcomeKit support or your account manager (",[41,8329,8330],{"href":8330,"rel":8331},"https:\u002F\u002Fhelp.welcometothejungle.com\u002Fen",[45],[2354,8333,8334,8337],{},[2357,8335,8336],{},"Request access to partnership scopes",[2357,8338,8339],{},"Clearly mention your use case (e.g. job syncing, org-level data access)",[2357,8341,8342,8345],{},[31,8343,8344],{},"Provide integration details",[2354,8346,8347,8350,8353],{},[2357,8348,8349],{},"Your application name",[2357,8351,8352],{},"What data you intend to access",[2357,8354,8355],{},"Whether access is read-only or includes write operations",[2357,8357,8358,8361],{},[31,8359,8360],{},"Explain your end-user flow",[2354,8362,8363,8366],{},[2357,8364,8365],{},"How users connect their WelcomeKit account",[2357,8367,8368],{},"Why elevated (partnership) access is required",[2357,8370,8371,8374],{},[31,8372,8373],{},"Await approval",[2354,8375,8376,8379],{},[2357,8377,8378],{},"Once approved, the scopes will be enabled for your app",[2357,8380,8381,8382,8384],{},"You can then include ",[36,8383,8278],{}," scopes in your OAuth flow",{"title":2433,"searchDepth":2434,"depth":2434,"links":8386},[8387,8388,8393],{"id":7977,"depth":2434,"text":7978},{"id":8197,"depth":2434,"text":8198,"children":8389},[8390,8391,8392],{"id":8201,"depth":2613,"text":8202},{"id":8230,"depth":2613,"text":8233},{"id":8289,"depth":2613,"text":8290},{"id":8309,"depth":2434,"text":8310,"children":8394},[8395],{"id":8319,"depth":2613,"text":8320},{"img":8397,"date":8398,"updated":8399,"tag":2457,"integrations":8400},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fcorrect_welcomekit_scopes_for_jungle_integration-icon.png","2026-04-14T14:32:00.000Z","2026-08-23T14:53:20.027Z","welcometothejungle","\u002Fguides\u002Fcorrect_welcomekit_scopes_for_jungle_integration",{"title":7959,"description":7974},"guides\u002Fcorrect_welcomekit_scopes_for_jungle_integration","LZ0wK_p27wI-nMLLjVGAPXkEvZNwWANtqPaACXHM0h0",{"id":8406,"title":8407,"body":8408,"description":11128,"extension":2452,"meta":11129,"navigation":2459,"path":11133,"seo":11134,"stem":11135,"__hash__":11136},"guides\u002Fguides\u002Fcreating_ads_using_the_unified_ads_api.md","Creating Ads using the Unified Ads API",{"type":12,"value":8409,"toc":11090},[8410,8413,8415,8420,8424,8427,8431,8434,8459,8552,8556,8613,8617,8666,8670,8697,8701,8704,8829,8833,8836,8877,8886,8888,8892,8898,8907,8996,8998,9002,9005,9064,9068,9180,9182,9186,9192,9199,9204,9281,9285,9298,9301,9377,9381,9393,9397,9409,9426,9430,9445,9447,9451,9455,9532,9536,9625,9629,9707,9711,9788,9792,9867,9869,9873,9882,9886,9889,9896,9900,10036,10053,10057,10077,10079,10170,10174,10193,10195,10247,10251,10270,10274,10290,10340,10342,10346,10350,10353,10396,10399,10544,10548,10658,10662,10668,10746,10773,10777,10929,10933,10936,10975,10984,11085,11087],[15,8411,8407],{"id":8412},"creating-ads-using-the-unified-ads-api",[19,8414],{},[22,8416,8417],{},[25,8418,8419],{},"March 14, 2026",[15,8421,8423],{"id":8422},"unified-ads-api-overview","Unified Ads API Overview",[22,8425,8426],{},"The Unified API Ads category models advertising structures across Meta, Google, Amazon, Twitter, LinkedIn, and other providers. Understanding how objects relate helps you build the correc flows.",[3629,8428,8430],{"id":8429},"core-hierarchy","Core Hierarchy",[22,8432,8433],{},"Most integrations follow a hierarchy from organization → campaign → ad group → ad:",[2584,8435,8437],{"className":2649,"code":8436,"language":2651,"meta":2652,"style":2433},"ads_organization (ad account)\n    └── ads_campaign\n            └── ads_group (ad set, line item, etc.)\n                    └── ads_ad\n",[36,8438,8439,8444,8449,8454],{"__ignoreMap":2433},[414,8440,8441],{"class":2593,"line":2594},[414,8442,8443],{},"ads_organization (ad account)\n",[414,8445,8446],{"class":2593,"line":2434},[414,8447,8448],{},"    └── ads_campaign\n",[414,8450,8451],{"class":2593,"line":2613},[414,8452,8453],{},"            └── ads_group (ad set, line item, etc.)\n",[414,8455,8456],{"class":2593,"line":2625},[414,8457,8458],{},"                    └── ads_ad\n",[155,8460,8461,8475],{},[158,8462,8463],{},[161,8464,8465,8467,8470,8473],{},[164,8466,4647],{},[164,8468,8469],{},"Description",[164,8471,8472],{},"Parent(s)",[164,8474,5807],{},[174,8476,8477,8492,8510,8530],{},[161,8478,8479,8484,8487,8489],{},[179,8480,8481],{},[31,8482,8483],{},"ads_organization",[179,8485,8486],{},"The ad account (e.g., Meta ad account, Google Ads customer). Billing and access are scoped here.",[179,8488,139],{},[179,8490,8491],{},"List accounts, select which account to use",[161,8493,8494,8499,8502,8507],{},[179,8495,8496],{},[31,8497,8498],{},"ads_campaign",[179,8500,8501],{},"A campaign groups ad sets under a goal, budget, and schedule.",[179,8503,8504],{},[36,8505,8506],{},"organization_id",[179,8508,8509],{},"Set campaign-level budget, dates, objective",[161,8511,8512,8517,8520,8527],{},[179,8513,8514],{},[31,8515,8516],{},"ads_group",[179,8518,8519],{},"An ad set or line item. Holds targeting, bid, and budget. Often called \"ad set\" (Meta) or \"line item\" (DV360).",[179,8521,8522,319,8525],{},[36,8523,8524],{},"campaign_id",[36,8526,8506],{},[179,8528,8529],{},"Define who sees ads (targeting), bid strategy, promoted object",[161,8531,8532,8537,8540,8549],{},[179,8533,8534],{},[31,8535,8536],{},"ads_ad",[179,8538,8539],{},"The actual ad creative + placement. What users see.",[179,8541,8542,319,8545,319,8547],{},[36,8543,8544],{},"group_id",[36,8546,8524],{},[36,8548,8506],{},[179,8550,8551],{},"Creative content, destination URL, promoted entity (e.g., tweet, product)",[3629,8553,8555],{"id":8554},"creatives-and-insertion-orders","Creatives and Insertion Orders",[155,8557,8558,8571],{},[158,8559,8560],{},[161,8561,8562,8564,8566,8568],{},[164,8563,4647],{},[164,8565,8469],{},[164,8567,8472],{},[164,8569,8570],{},"Notes",[174,8572,8573,8594],{},[161,8574,8575,8580,8583,8591],{},[179,8576,8577],{},[31,8578,8579],{},"ads_creative",[179,8581,8582],{},"The creative asset (image, video, copy). Some providers treat it as a separate resource; others embed it in the ad.",[179,8584,8585,319,8587,319,8589],{},[36,8586,8544],{},[36,8588,8524],{},[36,8590,8506],{},[179,8592,8593],{},"Meta: can be shared across ads. Amazon\u002FTwitter: often 1:1 with ad.",[161,8595,8596,8601,8604,8610],{},[179,8597,8598],{},[31,8599,8600],{},"ads_insertionorder",[179,8602,8603],{},"DV360-specific. Sits between campaign and line item.",[179,8605,8606,319,8608],{},[36,8607,8524],{},[36,8609,8506],{},[179,8611,8612],{},"Similar to a purchase order for a campaign.",[3629,8614,8616],{"id":8615},"discovery","Discovery",[155,8618,8619,8630],{},[158,8620,8621],{},[161,8622,8623,8625,8627],{},[164,8624,4647],{},[164,8626,8469],{},[164,8628,8629],{},"Purpose",[174,8631,8632,8649],{},[161,8633,8634,8639,8642],{},[179,8635,8636],{},[31,8637,8638],{},"ads_target",[179,8640,8641],{},"Targeting options (countries, regions, interests, etc.).",[179,8643,8644,8645,8648],{},"Look up valid IDs to use in ",[36,8646,8647],{},"targeting"," when creating campaigns\u002Fgroups.",[161,8650,8651,8656,8659],{},[179,8652,8653],{},[31,8654,8655],{},"ads_promote",[179,8657,8658],{},"Promoted entities (pages, apps, products, tweets, ad group types).",[179,8660,8661,8662,8665],{},"Look up or pass IDs for ",[36,8663,8664],{},"promoted"," when creating groups\u002Fads\u002Fcreatives.",[3629,8667,8669],{"id":8668},"reporting","Reporting",[155,8671,8672,8682],{},[158,8673,8674],{},[161,8675,8676,8678,8680],{},[164,8677,4647],{},[164,8679,8469],{},[164,8681,8629],{},[174,8683,8684],{},[161,8685,8686,8691,8694],{},[179,8687,8688],{},[31,8689,8690],{},"ads_report",[179,8692,8693],{},"Performance metrics.",[179,8695,8696],{},"Fetch impressions, clicks, spend, etc. by org, campaign, group, or ad.",[3629,8698,8700],{"id":8699},"provider-mapping","Provider Mapping",[22,8702,8703],{},"Naming varies by provider:",[155,8705,8706,8725],{},[158,8707,8708],{},[161,8709,8710,8713,8715,8717,8720,8723],{},[164,8711,8712],{},"Unified API",[164,8714,222],{},[164,8716,209],{},[164,8718,8719],{},"Amazon Ads",[164,8721,8722],{},"Twitter Ads",[164,8724,183],{},[174,8726,8727,8746,8762,8779,8797,8812],{},[161,8728,8729,8731,8734,8737,8740,8743],{},[179,8730,8483],{},[179,8732,8733],{},"Ad Account",[179,8735,8736],{},"Customer",[179,8738,8739],{},"Profile",[179,8741,8742],{},"Account",[179,8744,8745],{},"Sponsored Account",[161,8747,8748,8750,8753,8755,8757,8759],{},[179,8749,8498],{},[179,8751,8752],{},"Campaign",[179,8754,8752],{},[179,8756,8752],{},[179,8758,8752],{},[179,8760,8761],{},"Campaign Group",[161,8763,8764,8766,8769,8772,8774,8777],{},[179,8765,8516],{},[179,8767,8768],{},"Ad Set",[179,8770,8771],{},"Ad Group",[179,8773,8771],{},[179,8775,8776],{},"Line Item",[179,8778,8752],{},[161,8780,8781,8783,8786,8788,8791,8794],{},[179,8782,8536],{},[179,8784,8785],{},"Ad",[179,8787,8785],{},[179,8789,8790],{},"Product Ad",[179,8792,8793],{},"Promoted Tweet",[179,8795,8796],{},"Creative",[161,8798,8799,8801,8804,8806,8808,8810],{},[179,8800,8579],{},[179,8802,8803],{},"Ad Creative",[179,8805,8785],{},[179,8807,8790],{},[179,8809,8793],{},[179,8811,8796],{},[161,8813,8814,8819,8821,8823,8825,8827],{},[179,8815,8816],{},[25,8817,8818],{},"Some integrations collapse levels (e.g., LinkedIn's \"Campaign\" maps to our ads_group).",[179,8820],{},[179,8822],{},[179,8824],{},[179,8826],{},[179,8828],{},[3629,8830,8832],{"id":8831},"creating-ads-required-parent-ids","Creating Ads: Required Parent IDs",[22,8834,8835],{},"When creating objects, you typically need parent IDs:",[2354,8837,8838,8845,8854,8865],{},[2357,8839,8840,34,8843],{},[31,8841,8842],{},"Create campaign:",[36,8844,8506],{},[2357,8846,8847,34,8850,319,8852],{},[31,8848,8849],{},"Create ad group:",[36,8851,8506],{},[36,8853,8524],{},[2357,8855,8856,34,8859,319,8861,319,8863],{},[31,8857,8858],{},"Create ad:",[36,8860,8506],{},[36,8862,8524],{},[36,8864,8544],{},[2357,8866,8867,34,8870,319,8872,319,8874,8876],{},[31,8868,8869],{},"Create creative:",[36,8871,8506],{},[36,8873,8524],{},[36,8875,8544],{}," (varies by provider)",[22,8878,8879,8880,8882,8883,8885],{},"The ",[36,8881,8664],{}," 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 ",[36,8884,8655],{}," to discover options, or pass IDs manually when the provider has no list API.",[19,8887],{},[15,8889,8891],{"id":8890},"promoted-explained","Promoted Explained",[22,8893,8894,8895,8897],{},"The new ",[36,8896,8664],{}," field specifies promoted entities (pages, apps, products, tweets, ad group types) when creating and managing ads across the Unified API.",[22,8899,8900,8901,8903,8904,8906],{},"Ads, Campaigns, and AdGroups have a ",[36,8902,8664],{}," field to specify an ID of an entity to promote.  There is also a ",[36,8905,8655],{}," endpoint that provides a clean way to query the promoted entities.",[2584,8908,8910],{"className":7323,"code":8909,"language":7325,"meta":2433,"style":2433},"{\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",[36,8911,8912,8917,8929,8941,8953,8961,8987,8992],{"__ignoreMap":2433},[414,8913,8914],{"class":2593,"line":2594},[414,8915,8916],{"class":2705},"{\n",[414,8918,8919,8922,8924,8927],{"class":2593,"line":2434},[414,8920,8921],{"class":2607},"  \"organization_id\"",[414,8923,7340],{"class":2705},[414,8925,8926],{"class":2601},"\"act_123\"",[414,8928,2757],{"class":2705},[414,8930,8931,8934,8936,8939],{"class":2593,"line":2613},[414,8932,8933],{"class":2607},"  \"campaign_id\"",[414,8935,7340],{"class":2705},[414,8937,8938],{"class":2601},"\"456\"",[414,8940,2757],{"class":2705},[414,8942,8943,8946,8948,8951],{"class":2593,"line":2625},[414,8944,8945],{"class":2607},"  \"name\"",[414,8947,7340],{"class":2705},[414,8949,8950],{"class":2601},"\"My Ad Group\"",[414,8952,2757],{"class":2705},[414,8954,8955,8958],{"class":2593,"line":2677},[414,8956,8957],{"class":2607},"  \"promoted\"",[414,8959,8960],{"class":2705},": [\n",[414,8962,8963,8966,8969,8971,8974,8976,8979,8981,8984],{"class":2593,"line":2751},[414,8964,8965],{"class":2705},"    { ",[414,8967,8968],{"class":2607},"\"id\"",[414,8970,7340],{"class":2705},[414,8972,8973],{"class":2601},"\"789\"",[414,8975,319],{"class":2705},[414,8977,8978],{"class":2607},"\"type\"",[414,8980,7340],{"class":2705},[414,8982,8983],{"class":2601},"\"PAGE_ID\"",[414,8985,8986],{"class":2705}," }\n",[414,8988,8989],{"class":2593,"line":2760},[414,8990,8991],{"class":2705},"  ]\n",[414,8993,8994],{"class":2593,"line":2768},[414,8995,3035],{"class":2705},[19,8997],{},[55,8999,9001],{"id":9000},"the-adspromoted-object","The AdsPromoted Object",[22,9003,9004],{},"Each promoted entity has a simple structure:",[155,9006,9007,9021],{},[158,9008,9009],{},[161,9010,9011,9013,9016,9019],{},[164,9012,5244],{},[164,9014,9015],{},"Type",[164,9017,9018],{},"Required",[164,9020,8469],{},[174,9022,9023,9037,9051],{},[161,9024,9025,9029,9032,9034],{},[179,9026,9027],{},[36,9028,5072],{},[179,9030,9031],{},"string",[179,9033,8015],{},[179,9035,9036],{},"The entity ID (e.g., page ID, ASIN, tweet ID)",[161,9038,9039,9044,9046,9048],{},[179,9040,9041],{},[36,9042,9043],{},"name",[179,9045,9031],{},[179,9047,5314],{},[179,9049,9050],{},"Display name (optional, used in list responses)",[161,9052,9053,9057,9059,9061],{},[179,9054,9055],{},[36,9056,3397],{},[179,9058,9031],{},[179,9060,8015],{},[179,9062,9063],{},"One of the supported promoted types (see below)",[3629,9065,9067],{"id":9066},"supported-promoted-types","Supported Promoted Types",[155,9069,9070,9081],{},[158,9071,9072],{},[161,9073,9074,9076,9079],{},[164,9075,9015],{},[164,9077,9078],{},"Integration(s)",[164,9080,8469],{},[174,9082,9083,9095,9107,9119,9131,9143,9155,9167],{},[161,9084,9085,9090,9092],{},[179,9086,9087],{},[36,9088,9089],{},"PAGE_ID",[179,9091,222],{},[179,9093,9094],{},"Facebook Page to promote",[161,9096,9097,9102,9104],{},[179,9098,9099],{},[36,9100,9101],{},"APP_ID",[179,9103,222],{},[179,9105,9106],{},"App to promote",[161,9108,9109,9114,9116],{},[179,9110,9111],{},[36,9112,9113],{},"PIXEL_ID",[179,9115,222],{},[179,9117,9118],{},"Conversion pixel",[161,9120,9121,9126,9128],{},[179,9122,9123],{},[36,9124,9125],{},"CATALOG_ID",[179,9127,222],{},[179,9129,9130],{},"Product catalog",[161,9132,9133,9138,9140],{},[179,9134,9135],{},[36,9136,9137],{},"STORE_URL",[179,9139,222],{},[179,9141,9142],{},"Store URL (manual input)",[161,9144,9145,9150,9152],{},[179,9146,9147],{},[36,9148,9149],{},"PRODUCT_ID",[179,9151,8719],{},[179,9153,9154],{},"Product ASIN (manual input)",[161,9156,9157,9162,9164],{},[179,9158,9159],{},[36,9160,9161],{},"TWEET_ID",[179,9163,8722],{},[179,9165,9166],{},"Tweet to promote",[161,9168,9169,9174,9177],{},[179,9170,9171],{},[36,9172,9173],{},"AD_GROUP_TYPE",[179,9175,9176],{},"LinkedIn, Google Ads",[179,9178,9179],{},"Campaign\u002Fad group type (e.g., SPONSORED_UPDATES, SEARCH_STANDARD)",[19,9181],{},[55,9183,9185],{"id":9184},"get-adsconnection_idpromoted-endpoint","GET \u002Fads\u002F{connection_id}\u002Fpromoted Endpoint",[22,9187,9188,9189,9191],{},"Use the ",[36,9190,8655],{}," list endpoint to discover available promoted entities that the integration supports.",[22,9193,9194,34,9196],{},[31,9195,33],{},[36,9197,9198],{},"GET \u002Fads\u002F{connection_id}\u002Fpromote",[22,9200,9201],{},[31,9202,9203],{},"Query parameters:",[155,9205,9206,9217],{},[158,9207,9208],{},[161,9209,9210,9213,9215],{},[164,9211,9212],{},"Parameter",[164,9214,9015],{},[164,9216,8469],{},[174,9218,9219,9234,9246,9257,9269],{},[161,9220,9221,9225,9227],{},[179,9222,9223],{},[36,9224,3397],{},[179,9226,9031],{},[179,9228,9229,9230,319,9232,2980],{},"Filter by promoted type (e.g., ",[36,9231,9089],{},[36,9233,9161],{},[161,9235,9236,9241,9243],{},[179,9237,9238],{},[36,9239,9240],{},"org_id",[179,9242,9031],{},[179,9244,9245],{},"Organization\u002Faccount I",[161,9247,9248,9252,9254],{},[179,9249,9250],{},[36,9251,3819],{},[179,9253,9031],{},[179,9255,9256],{},"Optional search filter",[161,9258,9259,9264,9266],{},[179,9260,9261],{},[36,9262,9263],{},"limit",[179,9265,3461],{},[179,9267,9268],{},"Max results (default 100)",[161,9270,9271,9276,9278],{},[179,9272,9273],{},[36,9274,9275],{},"offset",[179,9277,3461],{},[179,9279,9280],{},"Pagination offset",[3629,9282,9284],{"id":9283},"example-list-facebook-pages-meta-ads","Example: List Facebook Pages (Meta Ads)",[2584,9286,9288],{"className":2586,"code":9287,"language":2588,"meta":2433,"style":2433},"GET \u002Fads\u002F{connection_id}\u002Fpromote?type=PAGE_ID\n",[36,9289,9290],{"__ignoreMap":2433},[414,9291,9292,9295],{"class":2593,"line":2594},[414,9293,9294],{"class":2597},"GET",[414,9296,9297],{"class":2601}," \u002Fads\u002F{connection_id}\u002Fpromote?type=PAGE_ID\n",[22,9299,9300],{},"Response:",[2584,9302,9304],{"className":7323,"code":9303,"language":7325,"meta":2433,"style":2433},"[\n    { \"id\": \"123456789\", \"name\": \"My Business Page\", \"type\": \"PAGE_ID\" },\n    { \"id\": \"987654321\", \"name\": \"Another Page\", \"type\": \"PAGE_ID\" }\n]\n",[36,9305,9306,9311,9342,9372],{"__ignoreMap":2433},[414,9307,9308],{"class":2593,"line":2594},[414,9309,9310],{"class":2705},"[\n",[414,9312,9313,9315,9317,9319,9322,9324,9327,9329,9332,9334,9336,9338,9340],{"class":2593,"line":2434},[414,9314,8965],{"class":2705},[414,9316,8968],{"class":2607},[414,9318,7340],{"class":2705},[414,9320,9321],{"class":2601},"\"123456789\"",[414,9323,319],{"class":2705},[414,9325,9326],{"class":2607},"\"name\"",[414,9328,7340],{"class":2705},[414,9330,9331],{"class":2601},"\"My Business Page\"",[414,9333,319],{"class":2705},[414,9335,8978],{"class":2607},[414,9337,7340],{"class":2705},[414,9339,8983],{"class":2601},[414,9341,2840],{"class":2705},[414,9343,9344,9346,9348,9350,9353,9355,9357,9359,9362,9364,9366,9368,9370],{"class":2593,"line":2613},[414,9345,8965],{"class":2705},[414,9347,8968],{"class":2607},[414,9349,7340],{"class":2705},[414,9351,9352],{"class":2601},"\"987654321\"",[414,9354,319],{"class":2705},[414,9356,9326],{"class":2607},[414,9358,7340],{"class":2705},[414,9360,9361],{"class":2601},"\"Another Page\"",[414,9363,319],{"class":2705},[414,9365,8978],{"class":2607},[414,9367,7340],{"class":2705},[414,9369,8983],{"class":2601},[414,9371,8986],{"class":2705},[414,9373,9374],{"class":2593,"line":2625},[414,9375,9376],{"class":2705},"]\n",[3629,9378,9380],{"id":9379},"example-list-user-tweets-twitter-ads","Example: List User Tweets (Twitter Ads)",[2584,9382,9384],{"className":2586,"code":9383,"language":2588,"meta":2433,"style":2433},"GET \u002Fads\u002F{connection_id}\u002Fpromote?type=TWEET_ID\n",[36,9385,9386],{"__ignoreMap":2433},[414,9387,9388,9390],{"class":2593,"line":2594},[414,9389,9294],{"class":2597},[414,9391,9392],{"class":2601}," \u002Fads\u002F{connection_id}\u002Fpromote?type=TWEET_ID\n",[3629,9394,9396],{"id":9395},"example-list-ad-group-types-google-ads-linkedin","Example: List Ad Group Types (Google Ads, LinkedIn)",[2584,9398,9400],{"className":2586,"code":9399,"language":2588,"meta":2433,"style":2433},"GET \u002Fads\u002F{connection_id}\u002Fpromote?type=AD_GROUP_TYPE\n",[36,9401,9402],{"__ignoreMap":2433},[414,9403,9404,9406],{"class":2593,"line":2594},[414,9405,9294],{"class":2597},[414,9407,9408],{"class":2601}," \u002Fads\u002F{connection_id}\u002Fpromote?type=AD_GROUP_TYPE\n",[22,9410,9411,9412,319,9415,9418,9419,319,9422,9425],{},"Some integrations will return static options (e.g., ",[36,9413,9414],{},"SEARCH_STANDARD",[36,9416,9417],{},"DISPLAY_STANDARD"," for Google; ",[36,9420,9421],{},"SPONSORED_UPDATES",[36,9423,9424],{},"TEXT_ADS"," for LinkedIn).",[3629,9427,9429],{"id":9428},"when-ads_promoted-returns-empty","When ads_promoted Returns Empty",[22,9431,9432,9433,9435,9436,9438,9439,9441,9442,9444],{},"Some promoted types have no discovery API (e.g., Amazon ",[36,9434,9149],{},", Meta ",[36,9437,9137],{},"). In those cases, ",[36,9440,8655],{}," returns an empty array. You can still create ads by passing ",[36,9443,8664],{}," manually with IDs you already know (e.g., ASINs for Amazon, store URLs for Meta).",[19,9446],{},[55,9448,9450],{"id":9449},"quick-reference-create-examples","Quick Reference: Create Examples",[3629,9452,9454],{"id":9453},"meta-ads-create-ad-group-with-page","Meta Ads – Create Ad Group with Page",[2584,9456,9458],{"className":7323,"code":9457,"language":7325,"meta":2433,"style":2433},"POST \u002Fads\u002F{connection_id}\u002Fgroup\n{\n  \"organization_id\": \"act_123\",\n  \"campaign_id\": \"456\",\n  \"name\": \"My Ad Group\",\n  \"promoted\": [{ \"id\": \"789\", \"type\": \"PAGE_ID\" }]\n}\n",[36,9459,9460,9470,9474,9484,9494,9504,9528],{"__ignoreMap":2433},[414,9461,9462,9465,9467],{"class":2593,"line":2594},[414,9463,9464],{"class":2705},"POST \u002Fads\u002F{",[414,9466,85],{"class":7401},[414,9468,9469],{"class":2705},"}\u002Fgroup\n",[414,9471,9472],{"class":2593,"line":2434},[414,9473,8916],{"class":2705},[414,9475,9476,9478,9480,9482],{"class":2593,"line":2613},[414,9477,8921],{"class":2607},[414,9479,7340],{"class":2705},[414,9481,8926],{"class":2601},[414,9483,2757],{"class":2705},[414,9485,9486,9488,9490,9492],{"class":2593,"line":2625},[414,9487,8933],{"class":2607},[414,9489,7340],{"class":2705},[414,9491,8938],{"class":2601},[414,9493,2757],{"class":2705},[414,9495,9496,9498,9500,9502],{"class":2593,"line":2677},[414,9497,8945],{"class":2607},[414,9499,7340],{"class":2705},[414,9501,8950],{"class":2601},[414,9503,2757],{"class":2705},[414,9505,9506,9508,9511,9513,9515,9517,9519,9521,9523,9525],{"class":2593,"line":2751},[414,9507,8957],{"class":2607},[414,9509,9510],{"class":2705},": [{ ",[414,9512,8968],{"class":2607},[414,9514,7340],{"class":2705},[414,9516,8973],{"class":2601},[414,9518,319],{"class":2705},[414,9520,8978],{"class":2607},[414,9522,7340],{"class":2705},[414,9524,8983],{"class":2601},[414,9526,9527],{"class":2705}," }]\n",[414,9529,9530],{"class":2593,"line":2760},[414,9531,3035],{"class":2705},[3629,9533,9535],{"id":9534},"amazon-ads-create-product-ad","Amazon Ads – Create Product Ad",[2584,9537,9539],{"className":7323,"code":9538,"language":7325,"meta":2433,"style":2433},"POST \u002Fads\u002F{connection_id}\u002Fad\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",[36,9540,9541,9550,9554,9565,9575,9586,9597,9621],{"__ignoreMap":2433},[414,9542,9543,9545,9547],{"class":2593,"line":2594},[414,9544,9464],{"class":2705},[414,9546,85],{"class":7401},[414,9548,9549],{"class":2705},"}\u002Fad\n",[414,9551,9552],{"class":2593,"line":2434},[414,9553,8916],{"class":2705},[414,9555,9556,9558,9560,9563],{"class":2593,"line":2613},[414,9557,8921],{"class":2607},[414,9559,7340],{"class":2705},[414,9561,9562],{"class":2601},"\"profile_123\"",[414,9564,2757],{"class":2705},[414,9566,9567,9569,9571,9573],{"class":2593,"line":2625},[414,9568,8933],{"class":2607},[414,9570,7340],{"class":2705},[414,9572,8938],{"class":2601},[414,9574,2757],{"class":2705},[414,9576,9577,9580,9582,9584],{"class":2593,"line":2677},[414,9578,9579],{"class":2607},"  \"group_id\"",[414,9581,7340],{"class":2705},[414,9583,8973],{"class":2601},[414,9585,2757],{"class":2705},[414,9587,9588,9590,9592,9595],{"class":2593,"line":2751},[414,9589,8945],{"class":2607},[414,9591,7340],{"class":2705},[414,9593,9594],{"class":2601},"\"Product Ad\"",[414,9596,2757],{"class":2705},[414,9598,9599,9601,9603,9605,9607,9610,9612,9614,9616,9619],{"class":2593,"line":2760},[414,9600,8957],{"class":2607},[414,9602,9510],{"class":2705},[414,9604,8968],{"class":2607},[414,9606,7340],{"class":2705},[414,9608,9609],{"class":2601},"\"B08N5WRWNW\"",[414,9611,319],{"class":2705},[414,9613,8978],{"class":2607},[414,9615,7340],{"class":2705},[414,9617,9618],{"class":2601},"\"PRODUCT_ID\"",[414,9620,9527],{"class":2705},[414,9622,9623],{"class":2593,"line":2768},[414,9624,3035],{"class":2705},[3629,9626,9628],{"id":9627},"twitter-ads-create-promoted-tweet","Twitter Ads – Create Promoted Tweet",[2584,9630,9632],{"className":7323,"code":9631,"language":7325,"meta":2433,"style":2433},"POST \u002Fads\u002F{connection_id}\u002Fad\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",[36,9633,9634,9642,9646,9657,9668,9679,9703],{"__ignoreMap":2433},[414,9635,9636,9638,9640],{"class":2593,"line":2594},[414,9637,9464],{"class":2705},[414,9639,85],{"class":7401},[414,9641,9549],{"class":2705},[414,9643,9644],{"class":2593,"line":2434},[414,9645,8916],{"class":2705},[414,9647,9648,9650,9652,9655],{"class":2593,"line":2613},[414,9649,8921],{"class":2607},[414,9651,7340],{"class":2705},[414,9653,9654],{"class":2601},"\"account_123\"",[414,9656,2757],{"class":2705},[414,9658,9659,9661,9663,9666],{"class":2593,"line":2625},[414,9660,9579],{"class":2607},[414,9662,7340],{"class":2705},[414,9664,9665],{"class":2601},"\"line_item_456\"",[414,9667,2757],{"class":2705},[414,9669,9670,9672,9674,9677],{"class":2593,"line":2677},[414,9671,8945],{"class":2607},[414,9673,7340],{"class":2705},[414,9675,9676],{"class":2601},"\"Promoted Tweet\"",[414,9678,2757],{"class":2705},[414,9680,9681,9683,9685,9687,9689,9692,9694,9696,9698,9701],{"class":2593,"line":2751},[414,9682,8957],{"class":2607},[414,9684,9510],{"class":2705},[414,9686,8968],{"class":2607},[414,9688,7340],{"class":2705},[414,9690,9691],{"class":2601},"\"1234567890\"",[414,9693,319],{"class":2705},[414,9695,8978],{"class":2607},[414,9697,7340],{"class":2705},[414,9699,9700],{"class":2601},"\"TWEET_ID\"",[414,9702,9527],{"class":2705},[414,9704,9705],{"class":2593,"line":2760},[414,9706,3035],{"class":2705},[3629,9708,9710],{"id":9709},"linkedin-create-ad-group-campaign","LinkedIn – Create Ad Group (Campaign)",[2584,9712,9714],{"className":7323,"code":9713,"language":7325,"meta":2433,"style":2433},"POST \u002Fads\u002F{connection_id}\u002Fgroup\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",[36,9715,9716,9724,9728,9739,9749,9760,9784],{"__ignoreMap":2433},[414,9717,9718,9720,9722],{"class":2593,"line":2594},[414,9719,9464],{"class":2705},[414,9721,85],{"class":7401},[414,9723,9469],{"class":2705},[414,9725,9726],{"class":2593,"line":2434},[414,9727,8916],{"class":2705},[414,9729,9730,9732,9734,9737],{"class":2593,"line":2613},[414,9731,8921],{"class":2607},[414,9733,7340],{"class":2705},[414,9735,9736],{"class":2601},"\"123\"",[414,9738,2757],{"class":2705},[414,9740,9741,9743,9745,9747],{"class":2593,"line":2625},[414,9742,8933],{"class":2607},[414,9744,7340],{"class":2705},[414,9746,8938],{"class":2601},[414,9748,2757],{"class":2705},[414,9750,9751,9753,9755,9758],{"class":2593,"line":2677},[414,9752,8945],{"class":2607},[414,9754,7340],{"class":2705},[414,9756,9757],{"class":2601},"\"Sponsored Updates Campaign\"",[414,9759,2757],{"class":2705},[414,9761,9762,9764,9766,9768,9770,9773,9775,9777,9779,9782],{"class":2593,"line":2751},[414,9763,8957],{"class":2607},[414,9765,9510],{"class":2705},[414,9767,8968],{"class":2607},[414,9769,7340],{"class":2705},[414,9771,9772],{"class":2601},"\"SPONSORED_UPDATES\"",[414,9774,319],{"class":2705},[414,9776,8978],{"class":2607},[414,9778,7340],{"class":2705},[414,9780,9781],{"class":2601},"\"AD_GROUP_TYPE\"",[414,9783,9527],{"class":2705},[414,9785,9786],{"class":2593,"line":2760},[414,9787,3035],{"class":2705},[3629,9789,9791],{"id":9790},"google-ads-create-ad-group","Google Ads – Create Ad Group",[2584,9793,9795],{"className":7323,"code":9794,"language":7325,"meta":2433,"style":2433},"POST \u002Fads\u002F{connection_id}\u002Fgroup\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",[36,9796,9797,9805,9809,9819,9829,9840,9863],{"__ignoreMap":2433},[414,9798,9799,9801,9803],{"class":2593,"line":2594},[414,9800,9464],{"class":2705},[414,9802,85],{"class":7401},[414,9804,9469],{"class":2705},[414,9806,9807],{"class":2593,"line":2434},[414,9808,8916],{"class":2705},[414,9810,9811,9813,9815,9817],{"class":2593,"line":2613},[414,9812,8921],{"class":2607},[414,9814,7340],{"class":2705},[414,9816,9736],{"class":2601},[414,9818,2757],{"class":2705},[414,9820,9821,9823,9825,9827],{"class":2593,"line":2625},[414,9822,8933],{"class":2607},[414,9824,7340],{"class":2705},[414,9826,8938],{"class":2601},[414,9828,2757],{"class":2705},[414,9830,9831,9833,9835,9838],{"class":2593,"line":2677},[414,9832,8945],{"class":2607},[414,9834,7340],{"class":2705},[414,9836,9837],{"class":2601},"\"Search Ad Group\"",[414,9839,2757],{"class":2705},[414,9841,9842,9844,9846,9848,9850,9853,9855,9857,9859,9861],{"class":2593,"line":2751},[414,9843,8957],{"class":2607},[414,9845,9510],{"class":2705},[414,9847,8968],{"class":2607},[414,9849,7340],{"class":2705},[414,9851,9852],{"class":2601},"\"SEARCH_STANDARD\"",[414,9854,319],{"class":2705},[414,9856,8978],{"class":2607},[414,9858,7340],{"class":2705},[414,9860,9781],{"class":2601},[414,9862,9527],{"class":2705},[414,9864,9865],{"class":2593,"line":2760},[414,9866,3035],{"class":2705},[19,9868],{},[55,9870,9872],{"id":9871},"using-targeting","Using Targeting",[22,9874,9875,9876,9878,9879,9881],{},"Targeting lets you define who sees your ads (geography, demographics, interests, etc.). Use the ",[36,9877,8638],{}," endpoint to look up valid targeting IDs, then pass them in the ",[36,9880,8647],{}," field when creating campaigns, ad groups, or ads.",[3629,9883,9885],{"id":9884},"the-ads_target-endpoint","The ads_target Endpoint",[22,9887,9888],{},"Look up targeting options (countries, regions, cities, interests, etc.) before creating ad objects.",[22,9890,9891,34,9893],{},[31,9892,33],{},[36,9894,9895],{},"GET \u002Fads\u002F{connection_id}\u002Ftarget",[22,9897,9898],{},[31,9899,9203],{},[155,9901,9902,9914],{},[158,9903,9904],{},[161,9905,9906,9908,9910,9912],{},[164,9907,9212],{},[164,9909,9015],{},[164,9911,9018],{},[164,9913,8469],{},[174,9915,9916,9929,9943,9956,9968,9980],{},[161,9917,9918,9922,9924,9926],{},[179,9919,9920],{},[36,9921,3397],{},[179,9923,9031],{},[179,9925,8015],{},[179,9927,9928],{},"Targeting type (see supported types below)",[161,9930,9931,9935,9937,9940],{},[179,9932,9933],{},[36,9934,3819],{},[179,9936,9031],{},[179,9938,9939],{},"Yes*",[179,9941,9942],{},"Search term (*required for most types)",[161,9944,9945,9949,9951,9953],{},[179,9946,9947],{},[36,9948,9240],{},[179,9950,9031],{},[179,9952,5314],{},[179,9954,9955],{},"Organization\u002Faccount ID (required for some types)",[161,9957,9958,9962,9964,9966],{},[179,9959,9960],{},[36,9961,9263],{},[179,9963,3461],{},[179,9965,5314],{},[179,9967,9268],{},[161,9969,9970,9974,9976,9978],{},[179,9971,9972],{},[36,9973,9275],{},[179,9975,3461],{},[179,9977,5314],{},[179,9979,9280],{},[161,9981,9982,10030,10032,10034],{},[179,9983,9984,34,9987,34,9991,34,9994,319,9997,319,10000,319,10003,319,10006,319,10009,319,10012,319,10015,319,10018,319,10021,319,10024,319,10027],{},[31,9985,9986],{},"Supported",[31,9988,9989],{},[36,9990,3397],{},[31,9992,9993],{},"values:",[36,9995,9996],{},"countries",[36,9998,9999],{},"regions",[36,10001,10002],{},"cities",[36,10004,10005],{},"zips",[36,10007,10008],{},"us_dmas",[36,10010,10011],{},"locales",[36,10013,10014],{},"interests",[36,10016,10017],{},"behaviors",[36,10019,10020],{},"topics",[36,10022,10023],{},"user_lists",[36,10025,10026],{},"age_ranges",[36,10028,10029],{},"genders",[179,10031],{},[179,10033],{},[179,10035],{},[22,10037,10038,34,10041,34,10045,34,10048],{},[25,10039,10040],{},"Support varies by integration. Meta Ads supports most types; others (e.g., Amazon, Twitter) may support only",[25,10042,10043],{},[36,10044,9996],{},[25,10046,10047],{},"and",[25,10049,10050,10052],{},[36,10051,10011],{},"__.",[3629,10054,10056],{"id":10055},"example-look-up-countries","Example: Look Up Countries",[2584,10058,10060],{"className":2586,"code":10059,"language":2588,"meta":2433,"style":2433},"GET \u002Fads\u002F{connection_id}\u002Ftarget?type=countries&query=united\n",[36,10061,10062],{"__ignoreMap":2433},[414,10063,10064,10066,10069,10072,10074],{"class":2593,"line":2594},[414,10065,9294],{"class":2597},[414,10067,10068],{"class":2601}," \u002Fads\u002F{connection_id}\u002Ftarget?type=countries",[414,10070,10071],{"class":2705},"&query",[414,10073,2798],{"class":2698},[414,10075,10076],{"class":2601},"united\n",[22,10078,9300],{},[2584,10080,10082],{"className":7323,"code":10081,"language":7325,"meta":2433,"style":2433},"[\n    { \"id\": \"US\", \"name\": \"United States\", \"value\": \"US\", \"type\": \"countries\" },\n    { \"id\": \"GB\", \"name\": \"United Kingdom\", \"value\": \"GB\", \"type\": \"countries\" }\n]\n",[36,10083,10084,10088,10128,10166],{"__ignoreMap":2433},[414,10085,10086],{"class":2593,"line":2594},[414,10087,9310],{"class":2705},[414,10089,10090,10092,10094,10096,10099,10101,10103,10105,10108,10110,10113,10115,10117,10119,10121,10123,10126],{"class":2593,"line":2434},[414,10091,8965],{"class":2705},[414,10093,8968],{"class":2607},[414,10095,7340],{"class":2705},[414,10097,10098],{"class":2601},"\"US\"",[414,10100,319],{"class":2705},[414,10102,9326],{"class":2607},[414,10104,7340],{"class":2705},[414,10106,10107],{"class":2601},"\"United States\"",[414,10109,319],{"class":2705},[414,10111,10112],{"class":2607},"\"value\"",[414,10114,7340],{"class":2705},[414,10116,10098],{"class":2601},[414,10118,319],{"class":2705},[414,10120,8978],{"class":2607},[414,10122,7340],{"class":2705},[414,10124,10125],{"class":2601},"\"countries\"",[414,10127,2840],{"class":2705},[414,10129,10130,10132,10134,10136,10139,10141,10143,10145,10148,10150,10152,10154,10156,10158,10160,10162,10164],{"class":2593,"line":2613},[414,10131,8965],{"class":2705},[414,10133,8968],{"class":2607},[414,10135,7340],{"class":2705},[414,10137,10138],{"class":2601},"\"GB\"",[414,10140,319],{"class":2705},[414,10142,9326],{"class":2607},[414,10144,7340],{"class":2705},[414,10146,10147],{"class":2601},"\"United Kingdom\"",[414,10149,319],{"class":2705},[414,10151,10112],{"class":2607},[414,10153,7340],{"class":2705},[414,10155,10138],{"class":2601},[414,10157,319],{"class":2705},[414,10159,8978],{"class":2607},[414,10161,7340],{"class":2705},[414,10163,10125],{"class":2601},[414,10165,8986],{"class":2705},[414,10167,10168],{"class":2593,"line":2625},[414,10169,9376],{"class":2705},[3629,10171,10173],{"id":10172},"example-look-up-regions-eg-us-states","Example: Look Up Regions (e.g., US States)",[2584,10175,10177],{"className":2586,"code":10176,"language":2588,"meta":2433,"style":2433},"GET \u002Fads\u002F{connection_id}\u002Ftarget?type=regions&query=california\n",[36,10178,10179],{"__ignoreMap":2433},[414,10180,10181,10183,10186,10188,10190],{"class":2593,"line":2594},[414,10182,9294],{"class":2597},[414,10184,10185],{"class":2601}," \u002Fads\u002F{connection_id}\u002Ftarget?type=regions",[414,10187,10071],{"class":2705},[414,10189,2798],{"class":2698},[414,10191,10192],{"class":2601},"california\n",[22,10194,9300],{},[2584,10196,10198],{"className":7323,"code":10197,"language":7325,"meta":2433,"style":2433},"[\n    { \"id\": \"3843\", \"name\": \"California\", \"value\": \"3843\", \"type\": \"regions\" }\n]\n",[36,10199,10200,10204,10243],{"__ignoreMap":2433},[414,10201,10202],{"class":2593,"line":2594},[414,10203,9310],{"class":2705},[414,10205,10206,10208,10210,10212,10215,10217,10219,10221,10224,10226,10228,10230,10232,10234,10236,10238,10241],{"class":2593,"line":2434},[414,10207,8965],{"class":2705},[414,10209,8968],{"class":2607},[414,10211,7340],{"class":2705},[414,10213,10214],{"class":2601},"\"3843\"",[414,10216,319],{"class":2705},[414,10218,9326],{"class":2607},[414,10220,7340],{"class":2705},[414,10222,10223],{"class":2601},"\"California\"",[414,10225,319],{"class":2705},[414,10227,10112],{"class":2607},[414,10229,7340],{"class":2705},[414,10231,10214],{"class":2601},[414,10233,319],{"class":2705},[414,10235,8978],{"class":2607},[414,10237,7340],{"class":2705},[414,10239,10240],{"class":2601},"\"regions\"",[414,10242,8986],{"class":2705},[414,10244,10245],{"class":2593,"line":2613},[414,10246,9376],{"class":2705},[3629,10248,10250],{"id":10249},"example-look-up-interests-meta-ads","Example: Look Up Interests (Meta Ads)",[2584,10252,10254],{"className":2586,"code":10253,"language":2588,"meta":2433,"style":2433},"GET \u002Fads\u002F{connection_id}\u002Ftarget?type=interests&query=technology\n",[36,10255,10256],{"__ignoreMap":2433},[414,10257,10258,10260,10263,10265,10267],{"class":2593,"line":2594},[414,10259,9294],{"class":2597},[414,10261,10262],{"class":2601}," \u002Fads\u002F{connection_id}\u002Ftarget?type=interests",[414,10264,10071],{"class":2705},[414,10266,2798],{"class":2698},[414,10268,10269],{"class":2601},"technology\n",[3629,10271,10273],{"id":10272},"using-targeting-ids-when-creating-ads","Using Targeting IDs When Creating Ads",[22,10275,10276,10277,10279,10280,10283,10284,10286,10287,10289],{},"Pass the ",[36,10278,5072],{}," (or ",[36,10281,10282],{},"value",") from ",[36,10285,8638],{}," responses into the ",[36,10288,8647],{}," object. The structure matches the targeting type:",[2354,10291,10292,10304,10320,10331],{},[2357,10293,10294,34,10297,10300,10301,2980],{},[31,10295,10296],{},"Countries:",[36,10298,10299],{},"targeting.geographic.countries"," — array of ISO country codes (e.g., ",[36,10302,10303],{},"[\"US\", \"CA\"]",[2357,10305,10306,34,10309,10312,10313,10316,10317,10319],{},[31,10307,10308],{},"Regions:",[36,10310,10311],{},"targeting.geographic.regions"," — array of ",[36,10314,10315],{},"{ id, name? }"," (use ",[36,10318,5072],{}," from ads_target)",[2357,10321,10322,34,10325,10312,10328],{},[31,10323,10324],{},"Cities:",[36,10326,10327],{},"targeting.geographic.cities",[36,10329,10330],{},"{ id, name?, radius?, radius_unit? }",[2357,10332,10333,34,10336,10339],{},[31,10334,10335],{},"Demographics:",[36,10337,10338],{},"targeting.demographic"," — age and gender (no lookup needed; use values directly)",[19,10341],{},[55,10343,10345],{"id":10344},"targeting-examples","Targeting Examples",[3629,10347,10349],{"id":10348},"geo-targeting-countries-and-regions","Geo-Targeting: Countries and Regions",[22,10351,10352],{},"First, look up IDs:",[2584,10354,10356],{"className":2586,"code":10355,"language":2588,"meta":2433,"style":2433},"# Get country codes\nGET \u002Fads\u002F{connection_id}\u002Ftarget?type=countries&query=united\n\n# Get regions (e.g., states) — for regions, query often includes country context\nGET \u002Fads\u002F{connection_id}\u002Ftarget?type=regions&query=california\n",[36,10357,10358,10363,10375,10379,10384],{"__ignoreMap":2433},[414,10359,10360],{"class":2593,"line":2594},[414,10361,10362],{"class":3527},"# Get country codes\n",[414,10364,10365,10367,10369,10371,10373],{"class":2593,"line":2434},[414,10366,9294],{"class":2597},[414,10368,10068],{"class":2601},[414,10370,10071],{"class":2705},[414,10372,2798],{"class":2698},[414,10374,10076],{"class":2601},[414,10376,10377],{"class":2593,"line":2613},[414,10378,2740],{"emptyLinePlaceholder":2459},[414,10380,10381],{"class":2593,"line":2625},[414,10382,10383],{"class":3527},"# Get regions (e.g., states) — for regions, query often includes country context\n",[414,10385,10386,10388,10390,10392,10394],{"class":2593,"line":2677},[414,10387,9294],{"class":2597},[414,10389,10185],{"class":2601},[414,10391,10071],{"class":2705},[414,10393,2798],{"class":2698},[414,10395,10192],{"class":2601},[22,10397,10398],{},"Then create an ad group with geographic targeting:",[2584,10400,10402],{"className":7323,"code":10401,"language":7325,"meta":2433,"style":2433},"POST \u002Fads\u002F{connection_id}\u002Fgroup\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",[36,10403,10404,10412,10416,10426,10436,10447,10470,10478,10485,10498,10505,10526,10531,10536,10540],{"__ignoreMap":2433},[414,10405,10406,10408,10410],{"class":2593,"line":2594},[414,10407,9464],{"class":2705},[414,10409,85],{"class":7401},[414,10411,9469],{"class":2705},[414,10413,10414],{"class":2593,"line":2434},[414,10415,8916],{"class":2705},[414,10417,10418,10420,10422,10424],{"class":2593,"line":2613},[414,10419,8921],{"class":2607},[414,10421,7340],{"class":2705},[414,10423,8926],{"class":2601},[414,10425,2757],{"class":2705},[414,10427,10428,10430,10432,10434],{"class":2593,"line":2625},[414,10429,8933],{"class":2607},[414,10431,7340],{"class":2705},[414,10433,8938],{"class":2601},[414,10435,2757],{"class":2705},[414,10437,10438,10440,10442,10445],{"class":2593,"line":2677},[414,10439,8945],{"class":2607},[414,10441,7340],{"class":2705},[414,10443,10444],{"class":2601},"\"US & California Ad Group\"",[414,10446,2757],{"class":2705},[414,10448,10449,10451,10453,10455,10457,10459,10461,10463,10465,10467],{"class":2593,"line":2751},[414,10450,8957],{"class":2607},[414,10452,9510],{"class":2705},[414,10454,8968],{"class":2607},[414,10456,7340],{"class":2705},[414,10458,8973],{"class":2601},[414,10460,319],{"class":2705},[414,10462,8978],{"class":2607},[414,10464,7340],{"class":2705},[414,10466,8983],{"class":2601},[414,10468,10469],{"class":2705}," }],\n",[414,10471,10472,10475],{"class":2593,"line":2760},[414,10473,10474],{"class":2607},"  \"targeting\"",[414,10476,10477],{"class":2705},": {\n",[414,10479,10480,10483],{"class":2593,"line":2768},[414,10481,10482],{"class":2607},"    \"geographic\"",[414,10484,10477],{"class":2705},[414,10486,10487,10490,10493,10495],{"class":2593,"line":2776},[414,10488,10489],{"class":2607},"      \"countries\"",[414,10491,10492],{"class":2705},": [",[414,10494,10098],{"class":2601},[414,10496,10497],{"class":2705},"],\n",[414,10499,10500,10503],{"class":2593,"line":2784},[414,10501,10502],{"class":2607},"      \"regions\"",[414,10504,8960],{"class":2705},[414,10506,10507,10510,10512,10514,10516,10518,10520,10522,10524],{"class":2593,"line":2792},[414,10508,10509],{"class":2705},"        { ",[414,10511,8968],{"class":2607},[414,10513,7340],{"class":2705},[414,10515,10214],{"class":2601},[414,10517,319],{"class":2705},[414,10519,9326],{"class":2607},[414,10521,7340],{"class":2705},[414,10523,10223],{"class":2601},[414,10525,8986],{"class":2705},[414,10527,10528],{"class":2593,"line":2804},[414,10529,10530],{"class":2705},"      ]\n",[414,10532,10533],{"class":2593,"line":2809},[414,10534,10535],{"class":2705},"    }\n",[414,10537,10538],{"class":2593,"line":2829},[414,10539,4032],{"class":2705},[414,10541,10542],{"class":2593,"line":2843},[414,10543,3035],{"class":2705},[3629,10545,10547],{"id":10546},"geo-targeting-cities-with-radius","Geo-Targeting: Cities with Radius",[2584,10549,10551],{"className":7323,"code":10550,"language":7325,"meta":2433,"style":2433},"{\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",[36,10552,10553,10557,10563,10569,10579,10586,10591,10603,10615,10627,10637,10642,10646,10650,10654],{"__ignoreMap":2433},[414,10554,10555],{"class":2593,"line":2594},[414,10556,8916],{"class":2705},[414,10558,10559,10561],{"class":2593,"line":2434},[414,10560,10474],{"class":2607},[414,10562,10477],{"class":2705},[414,10564,10565,10567],{"class":2593,"line":2613},[414,10566,10482],{"class":2607},[414,10568,10477],{"class":2705},[414,10570,10571,10573,10575,10577],{"class":2593,"line":2625},[414,10572,10489],{"class":2607},[414,10574,10492],{"class":2705},[414,10576,10098],{"class":2601},[414,10578,10497],{"class":2705},[414,10580,10581,10584],{"class":2593,"line":2677},[414,10582,10583],{"class":2607},"      \"cities\"",[414,10585,8960],{"class":2705},[414,10587,10588],{"class":2593,"line":2751},[414,10589,10590],{"class":2705},"        {\n",[414,10592,10593,10596,10598,10601],{"class":2593,"line":2760},[414,10594,10595],{"class":2607},"          \"id\"",[414,10597,7340],{"class":2705},[414,10599,10600],{"class":2601},"\"2420379\"",[414,10602,2757],{"class":2705},[414,10604,10605,10608,10610,10613],{"class":2593,"line":2768},[414,10606,10607],{"class":2607},"          \"name\"",[414,10609,7340],{"class":2705},[414,10611,10612],{"class":2601},"\"San Francisco\"",[414,10614,2757],{"class":2705},[414,10616,10617,10620,10622,10625],{"class":2593,"line":2776},[414,10618,10619],{"class":2607},"          \"radius\"",[414,10621,7340],{"class":2705},[414,10623,10624],{"class":2607},"25",[414,10626,2757],{"class":2705},[414,10628,10629,10632,10634],{"class":2593,"line":2784},[414,10630,10631],{"class":2607},"          \"radius_unit\"",[414,10633,7340],{"class":2705},[414,10635,10636],{"class":2601},"\"MILES\"\n",[414,10638,10639],{"class":2593,"line":2792},[414,10640,10641],{"class":2705},"        }\n",[414,10643,10644],{"class":2593,"line":2804},[414,10645,10530],{"class":2705},[414,10647,10648],{"class":2593,"line":2809},[414,10649,10535],{"class":2705},[414,10651,10652],{"class":2593,"line":2829},[414,10653,4032],{"class":2705},[414,10655,10656],{"class":2593,"line":2843},[414,10657,3035],{"class":2705},[3629,10659,10661],{"id":10660},"demographic-targeting","Demographic Targeting",[22,10663,10664,10665,10667],{},"Demographic targeting uses simple values; no ",[36,10666,8638],{}," lookup is needed:",[2584,10669,10671],{"className":7323,"code":10670,"language":7325,"meta":2433,"style":2433},"{\n  \"targeting\": {\n    \"demographic\": {\n      \"age_min\": 25,\n      \"age_max\": 54,\n      \"male\": true,\n      \"female\": true\n    }\n  }\n}\n",[36,10672,10673,10677,10683,10690,10701,10713,10724,10734,10738,10742],{"__ignoreMap":2433},[414,10674,10675],{"class":2593,"line":2594},[414,10676,8916],{"class":2705},[414,10678,10679,10681],{"class":2593,"line":2434},[414,10680,10474],{"class":2607},[414,10682,10477],{"class":2705},[414,10684,10685,10688],{"class":2593,"line":2613},[414,10686,10687],{"class":2607},"    \"demographic\"",[414,10689,10477],{"class":2705},[414,10691,10692,10695,10697,10699],{"class":2593,"line":2625},[414,10693,10694],{"class":2607},"      \"age_min\"",[414,10696,7340],{"class":2705},[414,10698,10624],{"class":2607},[414,10700,2757],{"class":2705},[414,10702,10703,10706,10708,10711],{"class":2593,"line":2677},[414,10704,10705],{"class":2607},"      \"age_max\"",[414,10707,7340],{"class":2705},[414,10709,10710],{"class":2607},"54",[414,10712,2757],{"class":2705},[414,10714,10715,10718,10720,10722],{"class":2593,"line":2751},[414,10716,10717],{"class":2607},"      \"male\"",[414,10719,7340],{"class":2705},[414,10721,3891],{"class":2607},[414,10723,2757],{"class":2705},[414,10725,10726,10729,10731],{"class":2593,"line":2760},[414,10727,10728],{"class":2607},"      \"female\"",[414,10730,7340],{"class":2705},[414,10732,10733],{"class":2607},"true\n",[414,10735,10736],{"class":2593,"line":2768},[414,10737,10535],{"class":2705},[414,10739,10740],{"class":2593,"line":2776},[414,10741,4032],{"class":2705},[414,10743,10744],{"class":2593,"line":2784},[414,10745,3035],{"class":2705},[2354,10747,10748,10758],{},[2357,10749,10750,10753,10754,10757],{},[36,10751,10752],{},"age_min"," \u002F ",[36,10755,10756],{},"age_max",": 18–65 typically",[2357,10759,10760,10753,10763,7340,10766,10768,10769,10772],{},[36,10761,10762],{},"male",[36,10764,10765],{},"female",[36,10767,3891],{}," to include, ",[36,10770,10771],{},"false"," or omit to exclude",[3629,10774,10776],{"id":10775},"combined-geo-demographic-targeting","Combined Geo + Demographic Targeting",[2584,10778,10780],{"className":7323,"code":10779,"language":7325,"meta":2433,"style":2433},"POST \u002Fads\u002F{connection_id}\u002Fgroup\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",[36,10781,10782,10790,10794,10804,10814,10825,10847,10853,10859,10869,10873,10879,10889,10899,10909,10917,10921,10925],{"__ignoreMap":2433},[414,10783,10784,10786,10788],{"class":2593,"line":2594},[414,10785,9464],{"class":2705},[414,10787,85],{"class":7401},[414,10789,9469],{"class":2705},[414,10791,10792],{"class":2593,"line":2434},[414,10793,8916],{"class":2705},[414,10795,10796,10798,10800,10802],{"class":2593,"line":2613},[414,10797,8921],{"class":2607},[414,10799,7340],{"class":2705},[414,10801,8926],{"class":2601},[414,10803,2757],{"class":2705},[414,10805,10806,10808,10810,10812],{"class":2593,"line":2625},[414,10807,8933],{"class":2607},[414,10809,7340],{"class":2705},[414,10811,8938],{"class":2601},[414,10813,2757],{"class":2705},[414,10815,10816,10818,10820,10823],{"class":2593,"line":2677},[414,10817,8945],{"class":2607},[414,10819,7340],{"class":2705},[414,10821,10822],{"class":2601},"\"US Adults 25-54\"",[414,10824,2757],{"class":2705},[414,10826,10827,10829,10831,10833,10835,10837,10839,10841,10843,10845],{"class":2593,"line":2751},[414,10828,8957],{"class":2607},[414,10830,9510],{"class":2705},[414,10832,8968],{"class":2607},[414,10834,7340],{"class":2705},[414,10836,8973],{"class":2601},[414,10838,319],{"class":2705},[414,10840,8978],{"class":2607},[414,10842,7340],{"class":2705},[414,10844,8983],{"class":2601},[414,10846,10469],{"class":2705},[414,10848,10849,10851],{"class":2593,"line":2760},[414,10850,10474],{"class":2607},[414,10852,10477],{"class":2705},[414,10854,10855,10857],{"class":2593,"line":2768},[414,10856,10482],{"class":2607},[414,10858,10477],{"class":2705},[414,10860,10861,10863,10865,10867],{"class":2593,"line":2776},[414,10862,10489],{"class":2607},[414,10864,10492],{"class":2705},[414,10866,10098],{"class":2601},[414,10868,9376],{"class":2705},[414,10870,10871],{"class":2593,"line":2784},[414,10872,3548],{"class":2705},[414,10874,10875,10877],{"class":2593,"line":2792},[414,10876,10687],{"class":2607},[414,10878,10477],{"class":2705},[414,10880,10881,10883,10885,10887],{"class":2593,"line":2804},[414,10882,10694],{"class":2607},[414,10884,7340],{"class":2705},[414,10886,10624],{"class":2607},[414,10888,2757],{"class":2705},[414,10890,10891,10893,10895,10897],{"class":2593,"line":2809},[414,10892,10705],{"class":2607},[414,10894,7340],{"class":2705},[414,10896,10710],{"class":2607},[414,10898,2757],{"class":2705},[414,10900,10901,10903,10905,10907],{"class":2593,"line":2829},[414,10902,10717],{"class":2607},[414,10904,7340],{"class":2705},[414,10906,3891],{"class":2607},[414,10908,2757],{"class":2705},[414,10910,10911,10913,10915],{"class":2593,"line":2843},[414,10912,10728],{"class":2607},[414,10914,7340],{"class":2705},[414,10916,10733],{"class":2607},[414,10918,10919],{"class":2593,"line":2849},[414,10920,10535],{"class":2705},[414,10922,10923],{"class":2593,"line":2854},[414,10924,4032],{"class":2705},[414,10926,10927],{"class":2593,"line":2880},[414,10928,3035],{"class":2705},[3629,10930,10932],{"id":10931},"audience-targeting-interests-custom-audiences","Audience Targeting (Interests, Custom Audiences)",[22,10934,10935],{},"For interests and custom audiences, look up IDs first:",[2584,10937,10939],{"className":2586,"code":10938,"language":2588,"meta":2433,"style":2433},"GET \u002Fads\u002F{connection_id}\u002Ftarget?type=interests&query=technology\nGET \u002Fads\u002F{connection_id}\u002Ftarget?type=user_lists&query=my&org_id=act_123\n",[36,10940,10941,10953],{"__ignoreMap":2433},[414,10942,10943,10945,10947,10949,10951],{"class":2593,"line":2594},[414,10944,9294],{"class":2597},[414,10946,10262],{"class":2601},[414,10948,10071],{"class":2705},[414,10950,2798],{"class":2698},[414,10952,10269],{"class":2601},[414,10954,10955,10957,10960,10962,10964,10967,10970,10972],{"class":2593,"line":2434},[414,10956,9294],{"class":2597},[414,10958,10959],{"class":2601}," \u002Fads\u002F{connection_id}\u002Ftarget?type=user_lists",[414,10961,10071],{"class":2705},[414,10963,2798],{"class":2698},[414,10965,10966],{"class":2601},"my",[414,10968,10969],{"class":2705},"&org_id",[414,10971,2798],{"class":2698},[414,10973,10974],{"class":2601},"act_123\n",[22,10976,10977,10978,10980,10981,2646],{},"Then use the ",[36,10979,5072],{}," values in ",[36,10982,10983],{},"targeting.audience",[2584,10985,10987],{"className":7323,"code":10986,"language":7325,"meta":2433,"style":2433},"{\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",[36,10988,10989,10993,10999,11006,11013,11035,11040,11047,11069,11073,11077,11081],{"__ignoreMap":2433},[414,10990,10991],{"class":2593,"line":2594},[414,10992,8916],{"class":2705},[414,10994,10995,10997],{"class":2593,"line":2434},[414,10996,10474],{"class":2607},[414,10998,10477],{"class":2705},[414,11000,11001,11004],{"class":2593,"line":2613},[414,11002,11003],{"class":2607},"    \"audience\"",[414,11005,10477],{"class":2705},[414,11007,11008,11011],{"class":2593,"line":2625},[414,11009,11010],{"class":2607},"      \"interests\"",[414,11012,8960],{"class":2705},[414,11014,11015,11017,11019,11021,11024,11026,11028,11030,11033],{"class":2593,"line":2677},[414,11016,10509],{"class":2705},[414,11018,8968],{"class":2607},[414,11020,7340],{"class":2705},[414,11022,11023],{"class":2601},"\"600313926646746\"",[414,11025,319],{"class":2705},[414,11027,9326],{"class":2607},[414,11029,7340],{"class":2705},[414,11031,11032],{"class":2601},"\"Technology\"",[414,11034,8986],{"class":2705},[414,11036,11037],{"class":2593,"line":2751},[414,11038,11039],{"class":2705},"      ],\n",[414,11041,11042,11045],{"class":2593,"line":2760},[414,11043,11044],{"class":2607},"      \"custom_audiences\"",[414,11046,8960],{"class":2705},[414,11048,11049,11051,11053,11055,11058,11060,11062,11064,11067],{"class":2593,"line":2768},[414,11050,10509],{"class":2705},[414,11052,8968],{"class":2607},[414,11054,7340],{"class":2705},[414,11056,11057],{"class":2601},"\"12345678\"",[414,11059,319],{"class":2705},[414,11061,9326],{"class":2607},[414,11063,7340],{"class":2705},[414,11065,11066],{"class":2601},"\"My Custom Audience\"",[414,11068,8986],{"class":2705},[414,11070,11071],{"class":2593,"line":2776},[414,11072,10530],{"class":2705},[414,11074,11075],{"class":2593,"line":2784},[414,11076,10535],{"class":2705},[414,11078,11079],{"class":2593,"line":2792},[414,11080,4032],{"class":2705},[414,11082,11083],{"class":2593,"line":2804},[414,11084,3035],{"class":2705},[19,11086],{},[4156,11088,11089],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sgQC_, html code.shiki .sgQC_{--shiki-default:#FDAEB7;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic;--shiki-light:#B31D28;--shiki-light-font-style:italic}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}",{"title":2433,"searchDepth":2434,"depth":2434,"links":11091},[11092,11093,11094,11095,11096,11097,11098,11101,11107,11114,11121],{"id":8429,"depth":2613,"text":8430},{"id":8554,"depth":2613,"text":8555},{"id":8615,"depth":2613,"text":8616},{"id":8668,"depth":2613,"text":8669},{"id":8699,"depth":2613,"text":8700},{"id":8831,"depth":2613,"text":8832},{"id":9000,"depth":2434,"text":9001,"children":11099},[11100],{"id":9066,"depth":2613,"text":9067},{"id":9184,"depth":2434,"text":9185,"children":11102},[11103,11104,11105,11106],{"id":9283,"depth":2613,"text":9284},{"id":9379,"depth":2613,"text":9380},{"id":9395,"depth":2613,"text":9396},{"id":9428,"depth":2613,"text":9429},{"id":9449,"depth":2434,"text":9450,"children":11108},[11109,11110,11111,11112,11113],{"id":9453,"depth":2613,"text":9454},{"id":9534,"depth":2613,"text":9535},{"id":9627,"depth":2613,"text":9628},{"id":9709,"depth":2613,"text":9710},{"id":9790,"depth":2613,"text":9791},{"id":9871,"depth":2434,"text":9872,"children":11115},[11116,11117,11118,11119,11120],{"id":9884,"depth":2613,"text":9885},{"id":10055,"depth":2613,"text":10056},{"id":10172,"depth":2613,"text":10173},{"id":10249,"depth":2613,"text":10250},{"id":10272,"depth":2613,"text":10273},{"id":10344,"depth":2434,"text":10345,"children":11122},[11123,11124,11125,11126,11127],{"id":10348,"depth":2613,"text":10349},{"id":10546,"depth":2613,"text":10547},{"id":10660,"depth":2613,"text":10661},{"id":10775,"depth":2613,"text":10776},{"id":10931,"depth":2613,"text":10932},"The Unified API Ads category models advertising structures across Meta, Google, Amazon, Twitter, LinkedIn, and other providers. Understanding how objects...",{"img":11130,"date":11131,"updated":11132,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fcreating_ads_using_the_unified_ads_api-icon.png","2026-03-14T23:39:00.000Z","2026-05-28T13:16:26.221Z","\u002Fguides\u002Fcreating_ads_using_the_unified_ads_api",{"title":8407,"description":11128},"guides\u002Fcreating_ads_using_the_unified_ads_api","refx7yU54GprwcGne1zGlubWjm07C-Y_2WTyvBwwuTM",{"id":11138,"title":11139,"body":11140,"description":16193,"extension":2452,"meta":16194,"navigation":2459,"path":16199,"seo":16200,"stem":16201,"__hash__":16202},"guides\u002Fguides\u002Fcreating_walmart_items_via_unified.md","Creating Walmart Items via Unified",{"type":12,"value":11141,"toc":16182},[11142,11145,11147,11152,11167,11169,11173,11228,11230,11234,11240,11278,11284,11642,11645,11647,11654,15455,15457,15461,15467,15474,15476,15480,16065,16091,16104,16120,16124,16158,16162,16165,16179],[15,11143,11139],{"id":11144},"creating-walmart-items-via-unified",[19,11146],{},[22,11148,11149],{},[25,11150,11151],{},"July 31, 2025",[22,11153,11154,11155,11158,11159,11162,11163,11166],{},"Unified allows you to create structured product listings on ",[31,11156,11157],{},"Walmart Marketplace"," via our Unified data model ",[36,11160,11161],{},"commerce_item",". This guide explains the ",[31,11164,11165],{},"critical fields"," you must understand and provide correctly:",[19,11168],{},[3629,11170,11172],{"id":11171},"key-concepts","🧩 Key Concepts",[155,11174,11175,11183],{},[158,11176,11177],{},[161,11178,11179,11181],{},[164,11180,5244],{},[164,11182,8469],{},[174,11184,11185,11198,11215],{},[161,11186,11187,11191],{},[179,11188,11189],{},[36,11190,3397],{},[179,11192,11193,11194,11197],{},"This specifies the ",[31,11195,11196],{},"Walmart subcategory"," your item belongs to. It determines what metadata is required. Must be one of the supported 76 categories (see below).",[161,11199,11200,11205],{},[179,11201,11202],{},[36,11203,11204],{},"global_code",[179,11206,11207,11208,11211,11212,97],{},"This is your product's ",[31,11209,11210],{},"GTIN"," (Global Trade Item Number), a required identifier for Walmart. It must be a ",[31,11213,11214],{},"valid 12–14 digit string",[161,11216,11217,11222],{},[179,11218,11219],{},[36,11220,11221],{},"metadata",[179,11223,11224,11225,11227],{},"A dynamic array of key-value attributes that depends on the selected ",[36,11226,3397],{},". This is how you provide structured product details like color, material, warranty, etc.",[19,11229],{},[3629,11231,11233],{"id":11232},"how-metadata-works","🧠 How Metadata Works",[22,11235,11236,11237,11239],{},"Each ",[36,11238,3397],{}," (subcategory) has a corresponding schema of fields allowed by Walmart. For example:",[2354,11241,11242,11261],{},[2357,11243,11244,11247,11248,319,11251,319,11254,319,11257,11260],{},[36,11245,11246],{},"animal_accessories"," allows fields like ",[36,11249,11250],{},"animalType",[36,11252,11253],{},"petSize",[36,11255,11256],{},"isFoldable",[36,11258,11259],{},"colorCategory",", etc.",[2357,11262,11263,11247,11266,319,11269,319,11272,319,11275,11260],{},[36,11264,11265],{},"computers",[36,11267,11268],{},"processorType",[36,11270,11271],{},"screenSize",[36,11273,11274],{},"ramMemory",[36,11276,11277],{},"operatingSystem",[22,11279,11280,11283],{},[31,11281,11282],{},"List the metadata fields from Unified"," using this API",[2584,11285,11287],{"className":2689,"code":11286,"language":2691,"meta":2433,"style":2433},"GET \u002Fmetadata_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",[36,11288,11289,11307,11311,11315,11319,11331,11342,11353,11365,11377,11387,11391,11395,11406,11416,11426,11437,11496,11504,11508,11512,11523,11534,11544,11555,11566,11573,11580,11587,11594,11601,11608,11615,11620,11625,11633,11637],{"__ignoreMap":2433},[414,11290,11291,11293,11296,11298,11300,11302,11304],{"class":2593,"line":2594},[414,11292,9294],{"class":2607},[414,11294,11295],{"class":2698}," \u002F",[414,11297,5845],{"class":2705},[414,11299,3610],{"class":2698},[414,11301,3397],{"class":2705},[414,11303,2798],{"class":2698},[414,11305,11306],{"class":2705},"commerce_item\n",[414,11308,11309],{"class":2593,"line":2434},[414,11310,2740],{"emptyLinePlaceholder":2459},[414,11312,11313],{"class":2593,"line":2613},[414,11314,9310],{"class":2705},[414,11316,11317],{"class":2593,"line":2625},[414,11318,10590],{"class":2705},[414,11320,11321,11324,11326,11329],{"class":2593,"line":2677},[414,11322,11323],{"class":2601},"            \"id\"",[414,11325,7340],{"class":2705},[414,11327,11328],{"class":2601},"\"shortDescription\"",[414,11330,2757],{"class":2705},[414,11332,11333,11336,11338,11340],{"class":2593,"line":2751},[414,11334,11335],{"class":2601},"            \"name\"",[414,11337,7340],{"class":2705},[414,11339,11328],{"class":2601},[414,11341,2757],{"class":2705},[414,11343,11344,11347,11349,11351],{"class":2593,"line":2760},[414,11345,11346],{"class":2601},"            \"slug\"",[414,11348,7340],{"class":2705},[414,11350,11328],{"class":2601},[414,11352,2757],{"class":2705},[414,11354,11355,11358,11360,11363],{"class":2593,"line":2768},[414,11356,11357],{"class":2601},"            \"format\"",[414,11359,7340],{"class":2705},[414,11361,11362],{"class":2601},"\"TEXT\"",[414,11364,2757],{"class":2705},[414,11366,11367,11370,11372,11375],{"class":2593,"line":2776},[414,11368,11369],{"class":2601},"            \"original_format\"",[414,11371,7340],{"class":2705},[414,11373,11374],{"class":2601},"\"string\"",[414,11376,2757],{"class":2705},[414,11378,11379,11382,11384],{"class":2593,"line":2784},[414,11380,11381],{"class":2601},"            \"object_type\"",[414,11383,7340],{"class":2705},[414,11385,11386],{"class":2601},"\"commerce_item\"\n",[414,11388,11389],{"class":2593,"line":2792},[414,11390,3768],{"class":2705},[414,11392,11393],{"class":2593,"line":2804},[414,11394,10590],{"class":2705},[414,11396,11397,11399,11401,11404],{"class":2593,"line":2809},[414,11398,11323],{"class":2601},[414,11400,7340],{"class":2705},[414,11402,11403],{"class":2601},"\"minimumRecommendedAge\"",[414,11405,2757],{"class":2705},[414,11407,11408,11410,11412,11414],{"class":2593,"line":2829},[414,11409,11335],{"class":2601},[414,11411,7340],{"class":2705},[414,11413,11403],{"class":2601},[414,11415,2757],{"class":2705},[414,11417,11418,11420,11422,11424],{"class":2593,"line":2843},[414,11419,11346],{"class":2601},[414,11421,7340],{"class":2705},[414,11423,11403],{"class":2601},[414,11425,2757],{"class":2705},[414,11427,11428,11430,11432,11435],{"class":2593,"line":2849},[414,11429,11357],{"class":2601},[414,11431,7340],{"class":2705},[414,11433,11434],{"class":2601},"\"MEASUREMENT\"",[414,11436,2757],{"class":2705},[414,11438,11439,11441,11443,11446,11449,11452,11454,11456,11458,11460,11462,11465,11467,11470,11472,11475,11477,11480,11482,11484,11486,11489,11491,11494],{"class":2593,"line":2854},[414,11440,11369],{"class":2601},[414,11442,7340],{"class":2705},[414,11444,11445],{"class":2601},"\"{",[414,11447,11448],{"class":2607},"\\\"",[414,11450,11451],{"class":2601},"measure",[414,11453,11448],{"class":2607},[414,11455,2646],{"class":2601},[414,11457,11448],{"class":2607},[414,11459,3461],{"class":2601},[414,11461,11448],{"class":2607},[414,11463,11464],{"class":2601},",",[414,11466,11448],{"class":2607},[414,11468,11469],{"class":2601},"unit",[414,11471,11448],{"class":2607},[414,11473,11474],{"class":2601},":[",[414,11476,11448],{"class":2607},[414,11478,11479],{"class":2601},"months",[414,11481,11448],{"class":2607},[414,11483,11464],{"class":2601},[414,11485,11448],{"class":2607},[414,11487,11488],{"class":2601},"years",[414,11490,11448],{"class":2607},[414,11492,11493],{"class":2601},"]}\"",[414,11495,2757],{"class":2705},[414,11497,11498,11500,11502],{"class":2593,"line":2880},[414,11499,11381],{"class":2601},[414,11501,7340],{"class":2705},[414,11503,11386],{"class":2601},[414,11505,11506],{"class":2593,"line":3253},[414,11507,3768],{"class":2705},[414,11509,11510],{"class":2593,"line":3261},[414,11511,10590],{"class":2705},[414,11513,11514,11516,11518,11521],{"class":2593,"line":3279},[414,11515,11323],{"class":2601},[414,11517,7340],{"class":2705},[414,11519,11520],{"class":2601},"\"smallPartsWarnings\"",[414,11522,2757],{"class":2705},[414,11524,11525,11527,11529,11532],{"class":2593,"line":3313},[414,11526,11335],{"class":2601},[414,11528,7340],{"class":2705},[414,11530,11531],{"class":2601},"\"Small Parts Warning Code\"",[414,11533,2757],{"class":2705},[414,11535,11536,11538,11540,11542],{"class":2593,"line":3326},[414,11537,11346],{"class":2601},[414,11539,7340],{"class":2705},[414,11541,11520],{"class":2601},[414,11543,2757],{"class":2705},[414,11545,11546,11548,11550,11553],{"class":2593,"line":3339},[414,11547,11357],{"class":2601},[414,11549,7340],{"class":2705},[414,11551,11552],{"class":2601},"\"MULTIPLE_SELECT\"",[414,11554,2757],{"class":2705},[414,11556,11557,11559,11561,11564],{"class":2593,"line":3359},[414,11558,11369],{"class":2601},[414,11560,7340],{"class":2705},[414,11562,11563],{"class":2601},"\"string[]\"",[414,11565,2757],{"class":2705},[414,11567,11568,11571],{"class":2593,"line":6453},[414,11569,11570],{"class":2601},"            \"options\"",[414,11572,8960],{"class":2705},[414,11574,11575,11578],{"class":2593,"line":6459},[414,11576,11577],{"class":2601},"                \"0 - No warning applicable\"",[414,11579,2757],{"class":2705},[414,11581,11582,11585],{"class":2593,"line":6465},[414,11583,11584],{"class":2601},"                \"5 - Choking hazard is a marble\"",[414,11586,2757],{"class":2705},[414,11588,11589,11592],{"class":2593,"line":6471},[414,11590,11591],{"class":2601},"                \"4 - Choking hazard balloon\"",[414,11593,2757],{"class":2705},[414,11595,11596,11599],{"class":2593,"line":6477},[414,11597,11598],{"class":2601},"                \"6 - Choking hazard contains a marble\"",[414,11600,2757],{"class":2705},[414,11602,11603,11606],{"class":2593,"line":6483},[414,11604,11605],{"class":2601},"                \"2 - Choking hazard contains small ball\"",[414,11607,2757],{"class":2705},[414,11609,11610,11613],{"class":2593,"line":6489},[414,11611,11612],{"class":2601},"                \"3 - Choking hazard contains small parts\"",[414,11614,2757],{"class":2705},[414,11616,11617],{"class":2593,"line":6495},[414,11618,11619],{"class":2601},"                \"1 - Choking hazard is a small ball\"\n",[414,11621,11622],{"class":2593,"line":6501},[414,11623,11624],{"class":2705},"            ],\n",[414,11626,11627,11629,11631],{"class":2593,"line":6507},[414,11628,11381],{"class":2601},[414,11630,7340],{"class":2705},[414,11632,11386],{"class":2601},[414,11634,11635],{"class":2593,"line":6513},[414,11636,3768],{"class":2705},[414,11638,11639],{"class":2593,"line":6519},[414,11640,11641],{"class":2705}," ]\n",[22,11643,11644],{},"You can filter these results by inspecting the supported pagination options.",[19,11646],{},[3629,11648,11650,11651,11653],{"id":11649},"supported-type-values-for-walmart-items-commerce_item","Supported ",[36,11652,3397],{}," Values for Walmart Items (commerce_item)",[2354,11655,11656,11661,11666,11671,11676,11681,11686,11691,11696,11701,11706,11711,11716,11721,11726,11731,11736,11741,11746,11751,11756,11761,11766,11771,11776,11781,11786,11791,11796,11801,11806,11811,11816,11821,11826,11831,11836,11841,11846,11851,11856,11861,11866,11871,11876,11881,11886,11891,11896,11901,11906,11911,11916,11921,11926,11931,11936,11941,11946,11951,11956,11961,11966,11971,11976,11981,11986,11991,11996,12001,12006,12011,12016,12021,12026,12031,12036,12041,12046,12051,12056,12061,12066,12071,12076,12081,12086,12091,12096,12101,12106,12111,12116,12121,12126,12131,12136,12141,12146,12151,12156,12161,12166,12171,12176,12181,12186,12191,12196,12201,12206,12211,12216,12221,12226,12231,12236,12241,12246,12251,12256,12261,12266,12271,12276,12281,12286,12291,12296,12301,12306,12311,12316,12321,12326,12331,12336,12341,12346,12351,12356,12361,12366,12371,12376,12381,12386,12391,12396,12401,12406,12411,12416,12421,12426,12431,12436,12441,12446,12451,12456,12461,12466,12471,12475,12480,12485,12490,12495,12500,12505,12510,12515,12520,12525,12530,12535,12540,12545,12550,12555,12560,12565,12570,12575,12580,12585,12590,12595,12600,12605,12610,12615,12620,12625,12630,12635,12640,12645,12650,12655,12660,12665,12670,12675,12680,12685,12690,12695,12700,12705,12710,12715,12720,12725,12730,12735,12740,12745,12750,12755,12760,12765,12770,12775,12780,12785,12790,12795,12800,12805,12810,12815,12820,12825,12830,12835,12840,12845,12850,12855,12860,12865,12870,12875,12880,12885,12890,12895,12900,12905,12910,12915,12920,12925,12930,12935,12940,12945,12950,12955,12960,12965,12970,12975,12980,12985,12990,12995,13000,13005,13010,13015,13020,13025,13030,13035,13040,13045,13050,13055,13060,13065,13070,13075,13080,13085,13090,13095,13100,13105,13110,13115,13120,13125,13130,13135,13140,13145,13150,13155,13160,13165,13170,13175,13180,13185,13190,13195,13200,13205,13210,13215,13220,13225,13230,13235,13240,13245,13250,13255,13260,13265,13270,13275,13280,13285,13290,13295,13300,13305,13310,13315,13320,13325,13330,13335,13340,13345,13350,13355,13360,13365,13370,13375,13380,13385,13390,13395,13400,13405,13410,13415,13420,13425,13430,13435,13440,13445,13450,13455,13460,13465,13470,13475,13480,13485,13490,13495,13500,13505,13510,13515,13520,13525,13530,13535,13540,13545,13550,13555,13560,13565,13570,13575,13580,13585,13590,13595,13600,13605,13610,13615,13620,13625,13630,13635,13640,13645,13650,13655,13660,13665,13670,13675,13680,13685,13690,13695,13700,13705,13710,13715,13720,13725,13730,13735,13740,13745,13750,13755,13760,13765,13770,13775,13780,13785,13790,13795,13800,13805,13810,13815,13820,13825,13830,13835,13840,13845,13850,13855,13860,13865,13870,13875,13880,13885,13890,13895,13900,13905,13910,13915,13920,13925,13930,13935,13940,13945,13950,13955,13960,13965,13970,13975,13980,13985,13990,13995,14000,14005,14010,14015,14020,14025,14030,14035,14040,14045,14050,14055,14060,14065,14070,14075,14080,14085,14090,14095,14100,14105,14110,14115,14120,14125,14130,14135,14140,14145,14150,14155,14160,14165,14170,14175,14180,14185,14190,14195,14200,14205,14210,14215,14220,14225,14230,14235,14240,14245,14250,14255,14260,14265,14270,14275,14280,14285,14290,14295,14300,14305,14310,14315,14320,14325,14330,14335,14340,14345,14350,14355,14360,14365,14370,14375,14380,14385,14390,14395,14400,14405,14410,14415,14420,14425,14430,14435,14440,14445,14450,14455,14460,14465,14470,14475,14480,14485,14490,14495,14500,14505,14510,14515,14520,14525,14530,14535,14540,14545,14550,14555,14560,14565,14570,14575,14580,14585,14590,14595,14600,14605,14610,14615,14620,14625,14630,14635,14640,14645,14650,14655,14660,14665,14670,14675,14680,14685,14690,14695,14700,14705,14710,14715,14720,14725,14730,14735,14740,14745,14750,14755,14760,14765,14770,14775,14780,14785,14790,14795,14800,14805,14810,14815,14820,14825,14830,14835,14840,14845,14850,14855,14860,14865,14870,14875,14880,14885,14890,14895,14900,14905,14910,14915,14920,14925,14930,14935,14940,14945,14950,14955,14960,14965,14970,14975,14980,14985,14990,14995,15000,15005,15010,15015,15020,15025,15030,15035,15040,15045,15050,15055,15060,15065,15070,15075,15080,15085,15090,15095,15100,15105,15110,15115,15120,15125,15130,15135,15140,15145,15150,15155,15160,15165,15170,15175,15180,15185,15190,15195,15200,15205,15210,15215,15220,15225,15230,15235,15240,15245,15250,15255,15260,15265,15270,15275,15280,15285,15290,15295,15300,15305,15310,15315,15320,15325,15330,15335,15340,15345,15350,15355,15360,15365,15370,15375,15380,15385,15390,15395,15400,15405,15410,15415,15420,15425,15430,15435,15440,15445,15450],{},[2357,11657,11658],{},[36,11659,11660],{},"Skateboard Risers",[2357,11662,11663],{},[36,11664,11665],{},"Baby Play Yards",[2357,11667,11668],{},[36,11669,11670],{},"Power Hedge Trimmers",[2357,11672,11673],{},[36,11674,11675],{},"Eyeglass Cases",[2357,11677,11678],{},[36,11679,11680],{},"Microphone Splitters",[2357,11682,11683],{},[36,11684,11685],{},"Electric Buffet Servers",[2357,11687,11688],{},[36,11689,11690],{},"Radio Control Vehicle Servos",[2357,11692,11693],{},[36,11694,11695],{},"Sticky Notes",[2357,11697,11698],{},[36,11699,11700],{},"Matcha Tea Bowls & Whisks",[2357,11702,11703],{},[36,11704,11705],{},"Doughs",[2357,11707,11708],{},[36,11709,11710],{},"Taffy Candy",[2357,11712,11713],{},[36,11714,11715],{},"Hair Dryers",[2357,11717,11718],{},[36,11719,11720],{},"Base Layers",[2357,11722,11723],{},[36,11724,11725],{},"Emergency Lighting",[2357,11727,11728],{},[36,11729,11730],{},"Bidet Toilet Seats",[2357,11732,11733],{},[36,11734,11735],{},"Purse Making Supplies",[2357,11737,11738],{},[36,11739,11740],{},"Grill Grid Lifters",[2357,11742,11743],{},[36,11744,11745],{},"Hunting Scents",[2357,11747,11748],{},[36,11749,11750],{},"Automotive Headlight Restorer",[2357,11752,11753],{},[36,11754,11755],{},"Ear Thermometer Replacement Lens Filters",[2357,11757,11758],{},[36,11759,11760],{},"Glassware & Drinkware",[2357,11762,11763],{},[36,11764,11765],{},"Precious Metals",[2357,11767,11768],{},[36,11769,11770],{},"Lab Chromatography Paper",[2357,11772,11773],{},[36,11774,11775],{},"Plant Terrariums",[2357,11777,11778],{},[36,11779,11780],{},"Microphone Cables",[2357,11782,11783],{},[36,11784,11785],{},"Glucose Supplements",[2357,11787,11788],{},[36,11789,11790],{},"Snow Skis",[2357,11792,11793],{},[36,11794,11795],{},"Perineal Cleansers",[2357,11797,11798],{},[36,11799,11800],{},"Soda Maker Kits",[2357,11802,11803],{},[36,11804,11805],{},"Camera Accessory Bundles",[2357,11807,11808],{},[36,11809,11810],{},"Tetherball Equipment",[2357,11812,11813],{},[36,11814,11815],{},"Paint Reducers & Retarders",[2357,11817,11818],{},[36,11819,11820],{},"Pork Rinds",[2357,11822,11823],{},[36,11824,11825],{},"Portable Basketball Systems",[2357,11827,11828],{},[36,11829,11830],{},"Plate Joiners",[2357,11832,11833],{},[36,11834,11835],{},"Other Weight Loss Supplies",[2357,11837,11838],{},[36,11839,11840],{},"Powder Candy",[2357,11842,11843],{},[36,11844,11845],{},"Outdoor Kitchen Serving & Storage Carts",[2357,11847,11848],{},[36,11849,11850],{},"Unitards & Leotards",[2357,11852,11853],{},[36,11854,11855],{},"Lab Sample Bags",[2357,11857,11858],{},[36,11859,11860],{},"Fishing Rod & Reel Combos",[2357,11862,11863],{},[36,11864,11865],{},"Adhesive Tapes",[2357,11867,11868],{},[36,11869,11870],{},"Track & Field Markers",[2357,11872,11873],{},[36,11874,11875],{},"Fruit & Vegetable Corers",[2357,11877,11878],{},[36,11879,11880],{},"Automotive Fuel Tank Caps",[2357,11882,11883],{},[36,11884,11885],{},"Drawing Boards",[2357,11887,11888],{},[36,11889,11890],{},"Hand Dryers",[2357,11892,11893],{},[36,11894,11895],{},"Pregnancy Tests",[2357,11897,11898],{},[36,11899,11900],{},"Cat Litter Mats",[2357,11902,11903],{},[36,11904,11905],{},"Facial Wipes",[2357,11907,11908],{},[36,11909,11910],{},"Exercise Weights",[2357,11912,11913],{},[36,11914,11915],{},"Sewing Pins",[2357,11917,11918],{},[36,11919,11920],{},"Other Makeup Brushes & Tools",[2357,11922,11923],{},[36,11924,11925],{},"Other Shaving Supplies",[2357,11927,11928],{},[36,11929,11930],{},"Sugar Packet Holders",[2357,11932,11933],{},[36,11934,11935],{},"Honey Dippers",[2357,11937,11938],{},[36,11939,11940],{},"Artificial Topiaries",[2357,11942,11943],{},[36,11944,11945],{},"Cupcake Making Kits",[2357,11947,11948],{},[36,11949,11950],{},"Mobility Walker Bags, Baskets & Carriers",[2357,11952,11953],{},[36,11954,11955],{},"Faucet Water Filters",[2357,11957,11958],{},[36,11959,11960],{},"Urinary Tract Infection Test Strips",[2357,11962,11963],{},[36,11964,11965],{},"Baptism Gowns & Outfits",[2357,11967,11968],{},[36,11969,11970],{},"Function Generators",[2357,11972,11973],{},[36,11974,11975],{},"FM Transmitters",[2357,11977,11978],{},[36,11979,11980],{},"Home Brewing Refractometers",[2357,11982,11983],{},[36,11984,11985],{},"Saddle Bags",[2357,11987,11988],{},[36,11989,11990],{},"Track & Field Competitor Numbers",[2357,11992,11993],{},[36,11994,11995],{},"Fuel Distributors",[2357,11997,11998],{},[36,11999,12000],{},"Nicotine Patches",[2357,12002,12003],{},[36,12004,12005],{},"Griddles & Grill Pans",[2357,12007,12008],{},[36,12009,12010],{},"Planter & Stand Sets",[2357,12012,12013],{},[36,12014,12015],{},"Other Pet Health Supplies",[2357,12017,12018],{},[36,12019,12020],{},"Scooter Decks",[2357,12022,12023],{},[36,12024,12025],{},"Knitting & Crochet Stitch Counters",[2357,12027,12028],{},[36,12029,12030],{},"Camera Tool Kits",[2357,12032,12033],{},[36,12034,12035],{},"Eyelash Combs",[2357,12037,12038],{},[36,12039,12040],{},"Blouses & Tops",[2357,12042,12043],{},[36,12044,12045],{},"Knitting & Crochet Stitch Markers",[2357,12047,12048],{},[36,12049,12050],{},"Hand Tool Punches",[2357,12052,12053],{},[36,12054,12055],{},"Climbing Rappel Devices",[2357,12057,12058],{},[36,12059,12060],{},"Kitchen Towels",[2357,12062,12063],{},[36,12064,12065],{},"Homogenizer Accessories",[2357,12067,12068],{},[36,12069,12070],{},"Attendance Time Cards",[2357,12072,12073],{},[36,12074,12075],{},"Digital Camera Parts",[2357,12077,12078],{},[36,12079,12080],{},"Planners & Appointment Book Refills",[2357,12082,12083],{},[36,12084,12085],{},"Herbal Supplements",[2357,12087,12088],{},[36,12089,12090],{},"Hand-Sewing Needles",[2357,12092,12093],{},[36,12094,12095],{},"Weight Bars",[2357,12097,12098],{},[36,12099,12100],{},"Photography Fixers",[2357,12102,12103],{},[36,12104,12105],{},"Massage Table Carrying Cases",[2357,12107,12108],{},[36,12109,12110],{},"Grill Covers",[2357,12112,12113],{},[36,12114,12115],{},"Other Skating Supplies",[2357,12117,12118],{},[36,12119,12120],{},"Maple Syrups",[2357,12122,12123],{},[36,12124,12125],{},"Pizza Stones & Pans",[2357,12127,12128],{},[36,12129,12130],{},"Manual Letter Openers",[2357,12132,12133],{},[36,12134,12135],{},"Water Guns",[2357,12137,12138],{},[36,12139,12140],{},"Manual Can Openers",[2357,12142,12143],{},[36,12144,12145],{},"Electronic Touchpads",[2357,12147,12148],{},[36,12149,12150],{},"String Trimmer Replacement Parts",[2357,12152,12153],{},[36,12154,12155],{},"Baby Bodysuits & One-Pieces",[2357,12157,12158],{},[36,12159,12160],{},"Walking Cane & Crutch Tips",[2357,12162,12163],{},[36,12164,12165],{},"Cutting Mats",[2357,12167,12168],{},[36,12169,12170],{},"Throwing Knives",[2357,12172,12173],{},[36,12174,12175],{},"Skins for Tablets",[2357,12177,12178],{},[36,12179,12180],{},"Serving Utensils & Sets",[2357,12182,12183],{},[36,12184,12185],{},"Photographic Art",[2357,12187,12188],{},[36,12189,12190],{},"Soap Making Kits",[2357,12192,12193],{},[36,12194,12195],{},"Athletic Shirts & Tops",[2357,12197,12198],{},[36,12199,12200],{},"Ticket Rolls",[2357,12202,12203],{},[36,12204,12205],{},"Fireplace Bellows",[2357,12207,12208],{},[36,12209,12210],{},"Travel Plug Adapters",[2357,12212,12213],{},[36,12214,12215],{},"Vacuum Sealers",[2357,12217,12218],{},[36,12219,12220],{},"Small Animal Habitat Decor",[2357,12222,12223],{},[36,12224,12225],{},"Vacuum Tubes",[2357,12227,12228],{},[36,12229,12230],{},"Stroller Connectors",[2357,12232,12233],{},[36,12234,12235],{},"Ceiling Fans",[2357,12237,12238],{},[36,12239,12240],{},"Other Dancing Supplies",[2357,12242,12243],{},[36,12244,12245],{},"Model Train Locomotives",[2357,12247,12248],{},[36,12249,12250],{},"Electronic Cigarette Starter Kits",[2357,12252,12253],{},[36,12254,12255],{},"Bicycle Baskets",[2357,12257,12258],{},[36,12259,12260],{},"Golf Visors",[2357,12262,12263],{},[36,12264,12265],{},"Bicycle Storage Hooks",[2357,12267,12268],{},[36,12269,12270],{},"Handheld Video Games",[2357,12272,12273],{},[36,12274,12275],{},"Cocktail Mixers",[2357,12277,12278],{},[36,12279,12280],{},"Follow-Focus Levers",[2357,12282,12283],{},[36,12284,12285],{},"Embossing Tools",[2357,12287,12288],{},[36,12289,12290],{},"Incentive Charts",[2357,12292,12293],{},[36,12294,12295],{},"Pressure Gauges",[2357,12297,12298],{},[36,12299,12300],{},"Art Paints & Pigment Powders",[2357,12302,12303],{},[36,12304,12305],{},"Replacement Water Filters",[2357,12307,12308],{},[36,12309,12310],{},"Moisture Meters",[2357,12312,12313],{},[36,12314,12315],{},"Other Pet Grooming Supplies",[2357,12317,12318],{},[36,12319,12320],{},"Shopping Cart & High Chair Covers",[2357,12322,12323],{},[36,12324,12325],{},"Nursing Pillows",[2357,12327,12328],{},[36,12329,12330],{},"Disposable Cutlery Sets",[2357,12332,12333],{},[36,12334,12335],{},"Heat Guns",[2357,12337,12338],{},[36,12339,12340],{},"Construction Flashing",[2357,12342,12343],{},[36,12344,12345],{},"Automotive Aerodynamics Kits",[2357,12347,12348],{},[36,12349,12350],{},"Fire Retardants",[2357,12352,12353],{},[36,12354,12355],{},"Gun Snakes",[2357,12357,12358],{},[36,12359,12360],{},"Snow Removal Rakes & Hand Pushers",[2357,12362,12363],{},[36,12364,12365],{},"Costume Wigs",[2357,12367,12368],{},[36,12369,12370],{},"Outdoor Decorative Stones",[2357,12372,12373],{},[36,12374,12375],{},"Lip Stains",[2357,12377,12378],{},[36,12379,12380],{},"Workwear Uniform Badges",[2357,12382,12383],{},[36,12384,12385],{},"Gut Health Tests",[2357,12387,12388],{},[36,12389,12390],{},"Carbon Monoxide Alarms",[2357,12392,12393],{},[36,12394,12395],{},"Cable Covers",[2357,12397,12398],{},[36,12399,12400],{},"Lathe Cylindrical Rollers",[2357,12402,12403],{},[36,12404,12405],{},"Hamburger Patty Makers",[2357,12407,12408],{},[36,12409,12410],{},"Printing Press Accessories",[2357,12412,12413],{},[36,12414,12415],{},"Automotive Light Covers & Guards",[2357,12417,12418],{},[36,12419,12420],{},"Overbed Tables",[2357,12422,12423],{},[36,12424,12425],{},"Artwork Cases & Portfolios",[2357,12427,12428],{},[36,12429,12430],{},"Disposable Storage Bags",[2357,12432,12433],{},[36,12434,12435],{},"Football Helmets",[2357,12437,12438],{},[36,12439,12440],{},"Automatic Transmission Filters",[2357,12442,12443],{},[36,12444,12445],{},"Live Trees",[2357,12447,12448],{},[36,12449,12450],{},"Umpire Leg Guards",[2357,12452,12453],{},[36,12454,12455],{},"Line Conditioners",[2357,12457,12458],{},[36,12459,12460],{},"Cup & Saucer Sets",[2357,12462,12463],{},[36,12464,12465],{},"Rain Barrels",[2357,12467,12468],{},[36,12469,12470],{},"S",[2357,12472,12473],{},[36,12474,11464],{},[2357,12476,12477],{},[36,12478,12479],{},"s Tapes",[2357,12481,12482],{},[36,12483,12484],{},"Indoor Fireplaces",[2357,12486,12487],{},[36,12488,12489],{},"Headphone Cases",[2357,12491,12492],{},[36,12493,12494],{},"Battery Testers",[2357,12496,12497],{},[36,12498,12499],{},"Floor Hockey Carts",[2357,12501,12502],{},[36,12503,12504],{},"T-Shirts",[2357,12506,12507],{},[36,12508,12509],{},"Dunun Drums",[2357,12511,12512],{},[36,12513,12514],{},"Speed Reducers",[2357,12516,12517],{},[36,12518,12519],{},"Percussion Mallets",[2357,12521,12522],{},[36,12523,12524],{},"Pallet Covers",[2357,12526,12527],{},[36,12528,12529],{},"Telescope Cases",[2357,12531,12532],{},[36,12533,12534],{},"Automotive Grilles",[2357,12536,12537],{},[36,12538,12539],{},"Fencing Sport Epee Parts",[2357,12541,12542],{},[36,12543,12544],{},"Emergency Food Kits",[2357,12546,12547],{},[36,12548,12549],{},"Sports Corner Flags",[2357,12551,12552],{},[36,12553,12554],{},"Bird Nests & Nesting Material",[2357,12556,12557],{},[36,12558,12559],{},"Boxing Rings",[2357,12561,12562],{},[36,12563,12564],{},"Paper Sorters",[2357,12566,12567],{},[36,12568,12569],{},"Lollipop & Treat Sticks",[2357,12571,12572],{},[36,12573,12574],{},"Cabin Air Filters",[2357,12576,12577],{},[36,12578,12579],{},"Pool Covers",[2357,12581,12582],{},[36,12583,12584],{},"Video Game Dance Pads",[2357,12586,12587],{},[36,12588,12589],{},"Football Sleds & Chutes",[2357,12591,12592],{},[36,12593,12594],{},"Clay & Dough Extruders & Presses",[2357,12596,12597],{},[36,12598,12599],{},"Baseball Gloves & Mitts",[2357,12601,12602],{},[36,12603,12604],{},"Yeasts & Leaveners",[2357,12606,12607],{},[36,12608,12609],{},"Skins for Aerial Drones",[2357,12611,12612],{},[36,12613,12614],{},"Replacement Faucet Water Filters",[2357,12616,12617],{},[36,12618,12619],{},"Other Electronic Components & Accessories",[2357,12621,12622],{},[36,12623,12624],{},"Lab Coats",[2357,12626,12627],{},[36,12628,12629],{},"Laser Detectors",[2357,12631,12632],{},[36,12633,12634],{},"Baseball Sliding Shorts",[2357,12636,12637],{},[36,12638,12639],{},"Hunting Game Finders",[2357,12641,12642],{},[36,12643,12644],{},"Rain & Snow Gauges",[2357,12646,12647],{},[36,12648,12649],{},"Shapewear Bodysuits",[2357,12651,12652],{},[36,12653,12654],{},"Toiletry Kits & Bags",[2357,12656,12657],{},[36,12658,12659],{},"Photo Enlarger Heads",[2357,12661,12662],{},[36,12663,12664],{},"Athletic Outfit Sets",[2357,12666,12667],{},[36,12668,12669],{},"Combustion Analyzers",[2357,12671,12672],{},[36,12673,12674],{},"Personal Organizer Refills & Accessories",[2357,12676,12677],{},[36,12678,12679],{},"Harmonic Exciters",[2357,12681,12682],{},[36,12683,12684],{},"Billiard Table Felt",[2357,12686,12687],{},[36,12688,12689],{},"Video Game Console Parts",[2357,12691,12692],{},[36,12693,12694],{},"Ham Radio Transceivers",[2357,12696,12697],{},[36,12698,12699],{},"Baby Juices",[2357,12701,12702],{},[36,12703,12704],{},"Hot Dog Machines",[2357,12706,12707],{},[36,12708,12709],{},"Pipe Inspection Cameras",[2357,12711,12712],{},[36,12713,12714],{},"Misting Systems",[2357,12716,12717],{},[36,12718,12719],{},"Sleeping Bag Liners",[2357,12721,12722],{},[36,12723,12724],{},"Kids Gardening Tools",[2357,12726,12727],{},[36,12728,12729],{},"Camera Film Winders",[2357,12731,12732],{},[36,12733,12734],{},"Other Billiard Supplies",[2357,12736,12737],{},[36,12738,12739],{},"Ergonomic Backrests",[2357,12741,12742],{},[36,12743,12744],{},"Balloon Pumps",[2357,12746,12747],{},[36,12748,12749],{},"Lump Charcoals",[2357,12751,12752],{},[36,12753,12754],{},"Pilates Barrels",[2357,12756,12757],{},[36,12758,12759],{},"Surfing Leashes",[2357,12761,12762],{},[36,12763,12764],{},"Dart Shafts",[2357,12766,12767],{},[36,12768,12769],{},"Makeup Blotting Paper",[2357,12771,12772],{},[36,12773,12774],{},"Eye Masks",[2357,12776,12777],{},[36,12778,12779],{},"Welding Helmets",[2357,12781,12782],{},[36,12783,12784],{},"Electronic Coils",[2357,12786,12787],{},[36,12788,12789],{},"Energy Drinks",[2357,12791,12792],{},[36,12793,12794],{},"Push-Up Stands",[2357,12796,12797],{},[36,12798,12799],{},"Photography Stop Baths",[2357,12801,12802],{},[36,12803,12804],{},"Handbag Hook Hangers",[2357,12806,12807],{},[36,12808,12809],{},"Network Security Devices",[2357,12811,12812],{},[36,12813,12814],{},"Stitch Holders",[2357,12816,12817],{},[36,12818,12819],{},"Bicycle Pegs",[2357,12821,12822],{},[36,12823,12824],{},"Outdoor Daybeds",[2357,12826,12827],{},[36,12828,12829],{},"Party Favors",[2357,12831,12832],{},[36,12833,12834],{},"Canning Kits",[2357,12836,12837],{},[36,12838,12839],{},"Molding & Casting Materials & Kits",[2357,12841,12842],{},[36,12843,12844],{},"Musical Instrument Bodies",[2357,12846,12847],{},[36,12848,12849],{},"Other Games",[2357,12851,12852],{},[36,12853,12854],{},"Electrolyte Solutions",[2357,12856,12857],{},[36,12858,12859],{},"Fruit & Wine Crushers & Destemmers",[2357,12861,12862],{},[36,12863,12864],{},"Power Inverters",[2357,12866,12867],{},[36,12868,12869],{},"Jewelry Jump Rings & Split Rings",[2357,12871,12872],{},[36,12873,12874],{},"Table Tennis Paddles",[2357,12876,12877],{},[36,12878,12879],{},"SIM Card Backup Devices",[2357,12881,12882],{},[36,12883,12884],{},"Tie Pins",[2357,12886,12887],{},[36,12888,12889],{},"Billiard Tables",[2357,12891,12892],{},[36,12893,12894],{},"Archery Broadheads",[2357,12896,12897],{},[36,12898,12899],{},"Vehicle Windshields",[2357,12901,12902],{},[36,12903,12904],{},"Jock Straps",[2357,12906,12907],{},[36,12908,12909],{},"Pet Live Animals",[2357,12911,12912],{},[36,12913,12914],{},"DC-to-DC Converters",[2357,12916,12917],{},[36,12918,12919],{},"Transport Drums",[2357,12921,12922],{},[36,12923,12924],{},"Vinyl Figures",[2357,12926,12927],{},[36,12928,12929],{},"Entertainment Centers",[2357,12931,12932],{},[36,12933,12934],{},"Fireplace Tools",[2357,12936,12937],{},[36,12938,12939],{},"Serving Forks",[2357,12941,12942],{},[36,12943,12944],{},"Nut Splitters",[2357,12946,12947],{},[36,12948,12949],{},"Blasters & Foam Play",[2357,12951,12952],{},[36,12953,12954],{},"Garden Border Edging",[2357,12956,12957],{},[36,12958,12959],{},"Gun Holsters & Holders",[2357,12961,12962],{},[36,12963,12964],{},"Spice Racks & Organizers",[2357,12966,12967],{},[36,12968,12969],{},"Stamps & Stamp Sets",[2357,12971,12972],{},[36,12973,12974],{},"Udu Drums",[2357,12976,12977],{},[36,12978,12979],{},"Reception Chairs & Seating",[2357,12981,12982],{},[36,12983,12984],{},"Pepper & Peppercorns",[2357,12986,12987],{},[36,12988,12989],{},"Golf Drivers",[2357,12991,12992],{},[36,12993,12994],{},"CC Cream",[2357,12996,12997],{},[36,12998,12999],{},"Yoga Socks",[2357,13001,13002],{},[36,13003,13004],{},"Vacuum Cleaner Attachments",[2357,13006,13007],{},[36,13008,13009],{},"Planter Liners",[2357,13011,13012],{},[36,13013,13014],{},"Pie & Pastry Fillings",[2357,13016,13017],{},[36,13018,13019],{},"Bed Skirts",[2357,13021,13022],{},[36,13023,13024],{},"Dart Carrying Cases & Wallets",[2357,13026,13027],{},[36,13028,13029],{},"Pizza Ovens",[2357,13031,13032],{},[36,13033,13034],{},"Crepe Spreaders",[2357,13036,13037],{},[36,13038,13039],{},"Hex Tools",[2357,13041,13042],{},[36,13043,13044],{},"Stretch Film & Shrink Wrap",[2357,13046,13047],{},[36,13048,13049],{},"Massage Headrests",[2357,13051,13052],{},[36,13053,13054],{},"Electronics Carrying Cases",[2357,13056,13057],{},[36,13058,13059],{},"Dust Collectors",[2357,13061,13062],{},[36,13063,13064],{},"Decorative Stones",[2357,13066,13067],{},[36,13068,13069],{},"Yoga Straps",[2357,13071,13072],{},[36,13073,13074],{},"Espresso Machines",[2357,13076,13077],{},[36,13078,13079],{},"Lab Face Masks & Shields",[2357,13081,13082],{},[36,13083,13084],{},"Guitar Effects Pedals",[2357,13086,13087],{},[36,13088,13089],{},"Hockey Hip Pads",[2357,13091,13092],{},[36,13093,13094],{},"Pressure Cookers & Canners",[2357,13096,13097],{},[36,13098,13099],{},"Diabetic Foot Care",[2357,13101,13102],{},[36,13103,13104],{},"Nail Top Coat",[2357,13106,13107],{},[36,13108,13109],{},"Wax Molding Materials",[2357,13111,13112],{},[36,13113,13114],{},"Dock Guards",[2357,13116,13117],{},[36,13118,13119],{},"Decoupage Tools & Sets",[2357,13121,13122],{},[36,13123,13124],{},"Rugby Balls",[2357,13126,13127],{},[36,13128,13129],{},"Bra Back Adapters",[2357,13131,13132],{},[36,13133,13134],{},"Other Backyard Wildlife Supplies",[2357,13136,13137],{},[36,13138,13139],{},"Food Peelers",[2357,13141,13142],{},[36,13143,13144],{},"Modular Synthesizers",[2357,13146,13147],{},[36,13148,13149],{},"Mirror Balls",[2357,13151,13152],{},[36,13153,13154],{},"Cricket Wickets",[2357,13156,13157],{},[36,13158,13159],{},"Snatch Rigging Blocks",[2357,13161,13162],{},[36,13163,13164],{},"Rowing Shells",[2357,13166,13167],{},[36,13168,13169],{},"Staple Gun Staples",[2357,13171,13172],{},[36,13173,13174],{},"Golf Rangefinders",[2357,13176,13177],{},[36,13178,13179],{},"Waterbed Liners",[2357,13181,13182],{},[36,13183,13184],{},"Beer Glasses",[2357,13186,13187],{},[36,13188,13189],{},"KVM Switches",[2357,13191,13192],{},[36,13193,13194],{},"Panel Carriers",[2357,13196,13197],{},[36,13198,13199],{},"Sanding Frames",[2357,13201,13202],{},[36,13203,13204],{},"First Aid Tape",[2357,13206,13207],{},[36,13208,13209],{},"Hand Pruners & Loppers",[2357,13211,13212],{},[36,13213,13214],{},"Reusable Training Pants",[2357,13216,13217],{},[36,13218,13219],{},"Outdoor Spas",[2357,13221,13222],{},[36,13223,13224],{},"Air Hockey Pucks",[2357,13226,13227],{},[36,13228,13229],{},"Cat Trees",[2357,13231,13232],{},[36,13233,13234],{},"Surgical Gowns",[2357,13236,13237],{},[36,13238,13239],{},"Baseball Protective Screens",[2357,13241,13242],{},[36,13243,13244],{},"Artificial Plants",[2357,13246,13247],{},[36,13248,13249],{},"Basting Brushes",[2357,13251,13252],{},[36,13253,13254],{},"Archery Arrows",[2357,13256,13257],{},[36,13258,13259],{},"Calibration Weights",[2357,13261,13262],{},[36,13263,13264],{},"Laptop Computers",[2357,13266,13267],{},[36,13268,13269],{},"Chalkboard Chalk",[2357,13271,13272],{},[36,13273,13274],{},"Nasal Aspirators",[2357,13276,13277],{},[36,13278,13279],{},"Instant Coffee",[2357,13281,13282],{},[36,13283,13284],{},"Vanity Tables & Table & Bench Sets",[2357,13286,13287],{},[36,13288,13289],{},"Printer Drums",[2357,13291,13292],{},[36,13293,13294],{},"Automotive Body Paint",[2357,13296,13297],{},[36,13298,13299],{},"Paraffin Treatment Hand & Foot Mitts",[2357,13301,13302],{},[36,13303,13304],{},"Stovetop Espresso Pots",[2357,13306,13307],{},[36,13308,13309],{},"Robotic Lawn Mowers",[2357,13311,13312],{},[36,13313,13314],{},"Phone Grips",[2357,13316,13317],{},[36,13318,13319],{},"Hammock Chairs",[2357,13321,13322],{},[36,13323,13324],{},"Home Brewing Kegs & Keg Supplies",[2357,13326,13327],{},[36,13328,13329],{},"Dishwasher Rack Adjusters",[2357,13331,13332],{},[36,13333,13334],{},"Sculpting Tools & Kits",[2357,13336,13337],{},[36,13338,13339],{},"Mattocks & Pickaxes",[2357,13341,13342],{},[36,13343,13344],{},"Watch & Clock Hands",[2357,13346,13347],{},[36,13348,13349],{},"Umpire Bags",[2357,13351,13352],{},[36,13353,13354],{},"Other Lighting Accessories",[2357,13356,13357],{},[36,13358,13359],{},"Lab Shaker Accessories",[2357,13361,13362],{},[36,13363,13364],{},"Print Servers",[2357,13366,13367],{},[36,13368,13369],{},"Home Brewing Beer Bottle Trees",[2357,13371,13372],{},[36,13373,13374],{},"Football Hand Warmers",[2357,13376,13377],{},[36,13378,13379],{},"Spectrum Analyzers",[2357,13381,13382],{},[36,13383,13384],{},"Hair Perms & Texturizers",[2357,13386,13387],{},[36,13388,13389],{},"Lab Glassware Washers",[2357,13391,13392],{},[36,13393,13394],{},"Trailer Weight Distributing Systems",[2357,13396,13397],{},[36,13398,13399],{},"Digital Cameras",[2357,13401,13402],{},[36,13403,13404],{},"Drum & Pail Mixers",[2357,13406,13407],{},[36,13408,13409],{},"Porch Swings",[2357,13411,13412],{},[36,13413,13414],{},"Gun Choke Tubes",[2357,13416,13417],{},[36,13418,13419],{},"Pet Milk Replacers",[2357,13421,13422],{},[36,13423,13424],{},"Fabric Paints",[2357,13426,13427],{},[36,13428,13429],{},"Other Kiteboarding Accessories",[2357,13431,13432],{},[36,13433,13434],{},"Paper Cups",[2357,13436,13437],{},[36,13438,13439],{},"Bottle Pourers",[2357,13441,13442],{},[36,13443,13444],{},"Golf Divot Tools",[2357,13446,13447],{},[36,13448,13449],{},"Aquarium Cleaning Tools",[2357,13451,13452],{},[36,13453,13454],{},"Fishing Vest & Packs",[2357,13456,13457],{},[36,13458,13459],{},"Die-Cut Cartridges",[2357,13461,13462],{},[36,13463,13464],{},"Kiteboard Control Bars",[2357,13466,13467],{},[36,13468,13469],{},"Welding Tips",[2357,13471,13472],{},[36,13473,13474],{},"Food Tongs",[2357,13476,13477],{},[36,13478,13479],{},"Corn & Callus Remover Cushions",[2357,13481,13482],{},[36,13483,13484],{},"Cocktail Shakers",[2357,13486,13487],{},[36,13488,13489],{},"Inspection Mirrors",[2357,13491,13492],{},[36,13493,13494],{},"Fruit Snacks",[2357,13496,13497],{},[36,13498,13499],{},"Kayak Storage Racks",[2357,13501,13502],{},[36,13503,13504],{},"Cycling Vests",[2357,13506,13507],{},[36,13508,13509],{},"Field Hockey Goggles",[2357,13511,13512],{},[36,13513,13514],{},"Breathalyzer Alcohol Monitors",[2357,13516,13517],{},[36,13518,13519],{},"Dry Erase Markers",[2357,13521,13522],{},[36,13523,13524],{},"Racquet Sport Stringing Machines",[2357,13526,13527],{},[36,13528,13529],{},"Gun Swivels",[2357,13531,13532],{},[36,13533,13534],{},"Power Tool Chargers",[2357,13536,13537],{},[36,13538,13539],{},"Home Brewing Sanitization Kits",[2357,13541,13542],{},[36,13543,13544],{},"Ice Cream, Sorbet & Frozen Yogurt",[2357,13546,13547],{},[36,13548,13549],{},"Underwater Cameras",[2357,13551,13552],{},[36,13553,13554],{},"Hair Color Stain Shields",[2357,13556,13557],{},[36,13558,13559],{},"Roof Gutter Accessories",[2357,13561,13562],{},[36,13563,13564],{},"Bicycle Brake Rotors",[2357,13566,13567],{},[36,13568,13569],{},"Repinique Drums",[2357,13571,13572],{},[36,13573,13574],{},"Camera Film Backs & Holders",[2357,13576,13577],{},[36,13578,13579],{},"Automotive Cigarette Lighters & Plugs",[2357,13581,13582],{},[36,13583,13584],{},"Meal Kits",[2357,13586,13587],{},[36,13588,13589],{},"Lathe Cole Jaws",[2357,13591,13592],{},[36,13593,13594],{},"PBX Phone Systems",[2357,13596,13597],{},[36,13598,13599],{},"Face Serums",[2357,13601,13602],{},[36,13603,13604],{},"Exercise Treadmills",[2357,13606,13607],{},[36,13608,13609],{},"Lawn Sweepers",[2357,13611,13612],{},[36,13613,13614],{},"Sunglasses Replacement Lenses",[2357,13616,13617],{},[36,13618,13619],{},"Pipe Fitting Reducers",[2357,13621,13622],{},[36,13623,13624],{},"Microphone Pop Filters",[2357,13626,13627],{},[36,13628,13629],{},"MiniDisc Players",[2357,13631,13632],{},[36,13633,13634],{},"Audio\u002FVideo Cables",[2357,13636,13637],{},[36,13638,13639],{},"Hand Sanitizers",[2357,13641,13642],{},[36,13643,13644],{},"Nail Pullers",[2357,13646,13647],{},[36,13648,13649],{},"Traditional Salwar Kameez",[2357,13651,13652],{},[36,13653,13654],{},"Other Air Tool Accessories",[2357,13656,13657],{},[36,13658,13659],{},"Cymbal Pads",[2357,13661,13662],{},[36,13663,13664],{},"Automotive Winch Mounting Systems",[2357,13666,13667],{},[36,13668,13669],{},"Laptop Bags",[2357,13671,13672],{},[36,13673,13674],{},"Contour Makeup Set",[2357,13676,13677],{},[36,13678,13679],{},"Puzzle Cubes",[2357,13681,13682],{},[36,13683,13684],{},"Plant Covers",[2357,13686,13687],{},[36,13688,13689],{},"Empty Paint Cans",[2357,13691,13692],{},[36,13693,13694],{},"Tableware Knives",[2357,13696,13697],{},[36,13698,13699],{},"Storage Sheds",[2357,13701,13702],{},[36,13703,13704],{},"Window & Door Frames",[2357,13706,13707],{},[36,13708,13709],{},"Paper Plates",[2357,13711,13712],{},[36,13713,13714],{},"Calculator Accessories",[2357,13716,13717],{},[36,13718,13719],{},"Shaving Sets",[2357,13721,13722],{},[36,13723,13724],{},"Microphone Preamplifiers",[2357,13726,13727],{},[36,13728,13729],{},"Baby Feeding Chairs",[2357,13731,13732],{},[36,13733,13734],{},"Rain Ponchos",[2357,13736,13737],{},[36,13738,13739],{},"Aquarium Thermometers",[2357,13741,13742],{},[36,13743,13744],{},"Mini Helmets",[2357,13746,13747],{},[36,13748,13749],{},"RV Awnings",[2357,13751,13752],{},[36,13753,13754],{},"Lawn & Garden Sprayers",[2357,13756,13757],{},[36,13758,13759],{},"Car CD Changers",[2357,13761,13762],{},[36,13763,13764],{},"Selfie Sticks",[2357,13766,13767],{},[36,13768,13769],{},"Calibration Standard Rods",[2357,13771,13772],{},[36,13773,13774],{},"Lab Chromatography TLC Developing Tanks",[2357,13776,13777],{},[36,13778,13779],{},"Poultry Treats",[2357,13781,13782],{},[36,13783,13784],{},"Mechanical Pencil Refills",[2357,13786,13787],{},[36,13788,13789],{},"Dip Stands",[2357,13791,13792],{},[36,13793,13794],{},"Drinkware Accessories",[2357,13796,13797],{},[36,13798,13799],{},"Artist Manikins",[2357,13801,13802],{},[36,13803,13804],{},"Leathercraft Kits",[2357,13806,13807],{},[36,13808,13809],{},"Metalworking Spring Plungers",[2357,13811,13812],{},[36,13813,13814],{},"Marquee Signs",[2357,13816,13817],{},[36,13818,13819],{},"Craft Dyes",[2357,13821,13822],{},[36,13823,13824],{},"Wakesurf Boards",[2357,13826,13827],{},[36,13828,13829],{},"Pool Safety Supplies",[2357,13831,13832],{},[36,13833,13834],{},"Pedal Boats",[2357,13836,13837],{},[36,13838,13839],{},"Snack Crackers",[2357,13841,13842],{},[36,13843,13844],{},"Jewelry Cleaning Machines",[2357,13846,13847],{},[36,13848,13849],{},"Party Supply Sets",[2357,13851,13852],{},[36,13853,13854],{},"Other Decking & Fencing Hardware",[2357,13856,13857],{},[36,13858,13859],{},"Motorcycle Glasses",[2357,13861,13862],{},[36,13863,13864],{},"Art Smocks",[2357,13866,13867],{},[36,13868,13869],{},"Archery Nocks",[2357,13871,13872],{},[36,13873,13874],{},"Diving Regulators",[2357,13876,13877],{},[36,13878,13879],{},"Camera Flash Snoots",[2357,13881,13882],{},[36,13883,13884],{},"Martial Arts Weapon Stands",[2357,13886,13887],{},[36,13888,13889],{},"Automotive Wiper Nozzles",[2357,13891,13892],{},[36,13893,13894],{},"Tea Cozies",[2357,13896,13897],{},[36,13898,13899],{},"Stadium Seats & Cushions",[2357,13901,13902],{},[36,13903,13904],{},"Bear Protection",[2357,13906,13907],{},[36,13908,13909],{},"Flagpole Brackets & Mounts",[2357,13911,13912],{},[36,13913,13914],{},"Patio Umbrella Base Weights",[2357,13916,13917],{},[36,13918,13919],{},"Stretch Film & Shrink Wrap Dispensers",[2357,13921,13922],{},[36,13923,13924],{},"Punching Bag Hangers",[2357,13926,13927],{},[36,13928,13929],{},"Track Lighting Sets",[2357,13931,13932],{},[36,13933,13934],{},"Wheel Chocks & Stops",[2357,13936,13937],{},[36,13938,13939],{},"Itching & Rash Treatments",[2357,13941,13942],{},[36,13943,13944],{},"Automotive Rims",[2357,13946,13947],{},[36,13948,13949],{},"Tire Pressure Gauges",[2357,13951,13952],{},[36,13953,13954],{},"Hair Crimping Irons",[2357,13956,13957],{},[36,13958,13959],{},"Baker",[2357,13961,13962],{},[36,13963,13964],{},"s Helmets",[2357,13966,13967],{},[36,13968,13969],{},"Curtains & Valances",[2357,13971,13972],{},[36,13973,13974],{},"Aquarium Starter Kits",[2357,13976,13977],{},[36,13978,13979],{},"Body Muds",[2357,13981,13982],{},[36,13983,13984],{},"Body Piercing Retainers",[2357,13986,13987],{},[36,13988,13989],{},"Hockey Chest Protectors",[2357,13991,13992],{},[36,13993,13994],{},"Diving Boards",[2357,13996,13997],{},[36,13998,13999],{},"Small Engines",[2357,14001,14002],{},[36,14003,14004],{},"Pet Sofa & Chair Protectors",[2357,14006,14007],{},[36,14008,14009],{},"Tent Accessories",[2357,14011,14012],{},[36,14013,14014],{},"Pedal Covers",[2357,14016,14017],{},[36,14018,14019],{},"Appliance Covers",[2357,14021,14022],{},[36,14023,14024],{},"Vegetable Dips",[2357,14026,14027],{},[36,14028,14029],{},"Hockey Shin Pads",[2357,14031,14032],{},[36,14033,14034],{},"Acne Creams",[2357,14036,14037],{},[36,14038,14039],{},"Mobility Aid Steps",[2357,14041,14042],{},[36,14043,14044],{},"Quilting Frames",[2357,14046,14047],{},[36,14048,14049],{},"Water Heaters",[2357,14051,14052],{},[36,14053,14054],{},"Sound Pressure Level Meters",[2357,14056,14057],{},[36,14058,14059],{},"Glider Rocking Chairs",[2357,14061,14062],{},[36,14063,14064],{},"Punching Bags",[2357,14066,14067],{},[36,14068,14069],{},"Nail Ridge Filler",[2357,14071,14072],{},[36,14073,14074],{},"Yoga Gloves",[2357,14076,14077],{},[36,14078,14079],{},"Jewelry Stringing Materials",[2357,14081,14082],{},[36,14083,14084],{},"Dishwasher Rack Rollers",[2357,14086,14087],{},[36,14088,14089],{},"Other Hair Removal Supplies",[2357,14091,14092],{},[36,14093,14094],{},"Agility Ladders",[2357,14096,14097],{},[36,14098,14099],{},"Watch Winders",[2357,14101,14102],{},[36,14103,14104],{},"Blender Pitchers",[2357,14106,14107],{},[36,14108,14109],{},"Hand Tampers",[2357,14111,14112],{},[36,14113,14114],{},"Dehumidifier Accessories",[2357,14116,14117],{},[36,14118,14119],{},"Punch Bowl Sets",[2357,14121,14122],{},[36,14123,14124],{},"Mini Projectors",[2357,14126,14127],{},[36,14128,14129],{},"Drinkware Sets",[2357,14131,14132],{},[36,14133,14134],{},"Evaporated Milks",[2357,14136,14137],{},[36,14138,14139],{},"Spoon Rests",[2357,14141,14142],{},[36,14143,14144],{},"Juggling Toys",[2357,14146,14147],{},[36,14148,14149],{},"Mixed Spices & Seasonings",[2357,14151,14152],{},[36,14153,14154],{},"Bicycle Child Seats",[2357,14156,14157],{},[36,14158,14159],{},"Water Coolant Systems",[2357,14161,14162],{},[36,14163,14164],{},"Jai Alai Sets",[2357,14166,14167],{},[36,14168,14169],{},"Surveillance Camera Lenses",[2357,14171,14172],{},[36,14173,14174],{},"Chain Hoists",[2357,14176,14177],{},[36,14178,14179],{},"Snack Pudding & Gelatin",[2357,14181,14182],{},[36,14183,14184],{},"Hair Curling Wands",[2357,14186,14187],{},[36,14188,14189],{},"Spa Cover Lifts",[2357,14191,14192],{},[36,14193,14194],{},"Track Lighting Heads",[2357,14196,14197],{},[36,14198,14199],{},"Photo Enlargers",[2357,14201,14202],{},[36,14203,14204],{},"Photo Enlarger Lenses",[2357,14206,14207],{},[36,14208,14209],{},"Plant Cages",[2357,14211,14212],{},[36,14213,14214],{},"DJ Mixers",[2357,14216,14217],{},[36,14218,14219],{},"Condiment Servers",[2357,14221,14222],{},[36,14223,14224],{},"Electric Kettles",[2357,14226,14227],{},[36,14228,14229],{},"Glass Raw Materials",[2357,14231,14232],{},[36,14233,14234],{},"Radio Antennas",[2357,14236,14237],{},[36,14238,14239],{},"Bicycle Front & Rear Racks",[2357,14241,14242],{},[36,14243,14244],{},"Body Oils",[2357,14246,14247],{},[36,14248,14249],{},"ATV Tires",[2357,14251,14252],{},[36,14253,14254],{},"RAM Memory",[2357,14256,14257],{},[36,14258,14259],{},"Pet Toothpaste",[2357,14261,14262],{},[36,14263,14264],{},"Dressing Aid Sticks",[2357,14266,14267],{},[36,14268,14269],{},"Coconut Knives",[2357,14271,14272],{},[36,14273,14274],{},"Sports Pole Holders & Bases",[2357,14276,14277],{},[36,14278,14279],{},"Dock Steps",[2357,14281,14282],{},[36,14283,14284],{},"Bath Toy Storage",[2357,14286,14287],{},[36,14288,14289],{},"Martial Arts Belts",[2357,14291,14292],{},[36,14293,14294],{},"Currency Bands & Straps",[2357,14296,14297],{},[36,14298,14299],{},"Outdoor Playsets",[2357,14301,14302],{},[36,14303,14304],{},"Video Switchers",[2357,14306,14307],{},[36,14308,14309],{},"Brake System Replacement Parts & Hardware",[2357,14311,14312],{},[36,14313,14314],{},"Tennis Shorts",[2357,14316,14317],{},[36,14318,14319],{},"Facial Treatments",[2357,14321,14322],{},[36,14323,14324],{},"Athletic Compression Socks",[2357,14326,14327],{},[36,14328,14329],{},"Brake Booster Filters",[2357,14331,14332],{},[36,14333,14334],{},"Other Knitting & Crochet Supplies",[2357,14336,14337],{},[36,14338,14339],{},"Martini Glasses",[2357,14341,14342],{},[36,14343,14344],{},"Personal Organizers",[2357,14346,14347],{},[36,14348,14349],{},"pH Meters",[2357,14351,14352],{},[36,14353,14354],{},"Parchment Paper",[2357,14356,14357],{},[36,14358,14359],{},"Other Gift Wrapping Supplies",[2357,14361,14362],{},[36,14363,14364],{},"Leathercraft Accessories",[2357,14366,14367],{},[36,14368,14369],{},"Rod Hockey",[2357,14371,14372],{},[36,14373,14374],{},"House Numbers & Letters",[2357,14376,14377],{},[36,14378,14379],{},"Toaster Pastries",[2357,14381,14382],{},[36,14383,14384],{},"Anti-Chafing Creams",[2357,14386,14387],{},[36,14388,14389],{},"Sunshine Recorders",[2357,14391,14392],{},[36,14393,14394],{},"Makeup Sets",[2357,14396,14397],{},[36,14398,14399],{},"Baby Jumping Exercisers",[2357,14401,14402],{},[36,14403,14404],{},"Replacement Appliance Knobs",[2357,14406,14407],{},[36,14408,14409],{},"Hair Removal Waxing Strips",[2357,14411,14412],{},[36,14413,14414],{},"Toaster Ovens",[2357,14416,14417],{},[36,14418,14419],{},"Electric Crepe Makers",[2357,14421,14422],{},[36,14423,14424],{},"Kiteboard Control Lines",[2357,14426,14427],{},[36,14428,14429],{},"Camera Cleaning Equipment",[2357,14431,14432],{},[36,14433,14434],{},"Body Piercing Jewelry",[2357,14436,14437],{},[36,14438,14439],{},"Weatherproofing Pipe Coverings",[2357,14441,14442],{},[36,14443,14444],{},"Plant Misters",[2357,14446,14447],{},[36,14448,14449],{},"Rosin Bags",[2357,14451,14452],{},[36,14453,14454],{},"Plastic Cups",[2357,14456,14457],{},[36,14458,14459],{},"Baby Bouncer & Rocker Chairs",[2357,14461,14462],{},[36,14463,14464],{},"Washing Machines",[2357,14466,14467],{},[36,14468,14469],{},"Ground Coffee",[2357,14471,14472],{},[36,14473,14474],{},"Gun Mounts",[2357,14476,14477],{},[36,14478,14479],{},"Remote Controls",[2357,14481,14482],{},[36,14483,14484],{},"Medicine Dosing Containers",[2357,14486,14487],{},[36,14488,14489],{},"Chainsaw Chains",[2357,14491,14492],{},[36,14493,14494],{},"Climbing Slings",[2357,14496,14497],{},[36,14498,14499],{},"Basketball Storage",[2357,14501,14502],{},[36,14503,14504],{},"Writing Notebooks & Sketch Books",[2357,14506,14507],{},[36,14508,14509],{},"Thermometer Probe Covers",[2357,14511,14512],{},[36,14513,14514],{},"Wall Calendars",[2357,14516,14517],{},[36,14518,14519],{},"Power Tool Batteries",[2357,14521,14522],{},[36,14523,14524],{},"Corded Phones",[2357,14526,14527],{},[36,14528,14529],{},"Desk Lamps",[2357,14531,14532],{},[36,14533,14534],{},"Network-Attached Storage Servers",[2357,14536,14537],{},[36,14538,14539],{},"Slatwall Panels",[2357,14541,14542],{},[36,14543,14544],{},"Golf Push & Pull Carts",[2357,14546,14547],{},[36,14548,14549],{},"Media Storage Cabinets",[2357,14551,14552],{},[36,14553,14554],{},"Stovetop Waffle Irons",[2357,14556,14557],{},[36,14558,14559],{},"Pet Tie-Outs",[2357,14561,14562],{},[36,14563,14564],{},"Toilet Paper Holders",[2357,14566,14567],{},[36,14568,14569],{},"Boating Heads",[2357,14571,14572],{},[36,14573,14574],{},"Movie Cameras",[2357,14576,14577],{},[36,14578,14579],{},"Vanity Lights",[2357,14581,14582],{},[36,14583,14584],{},"Plaques & Signs",[2357,14586,14587],{},[36,14588,14589],{},"Decorative Bottles",[2357,14591,14592],{},[36,14593,14594],{},"Art Paint Sponges",[2357,14596,14597],{},[36,14598,14599],{},"Kayak Carts",[2357,14601,14602],{},[36,14603,14604],{},"Radar Detectors",[2357,14606,14607],{},[36,14608,14609],{},"Outdoor Bar Stools",[2357,14611,14612],{},[36,14613,14614],{},"Piggy Banks & Money Jars",[2357,14616,14617],{},[36,14618,14619],{},"Fog Machines",[2357,14621,14622],{},[36,14623,14624],{},"Food Storage Jars & Containers",[2357,14626,14627],{},[36,14628,14629],{},"Pet ID Tags",[2357,14631,14632],{},[36,14633,14634],{},"Salad Serving Utensils",[2357,14636,14637],{},[36,14638,14639],{},"Bath Rugs",[2357,14641,14642],{},[36,14643,14644],{},"Water Distillers",[2357,14646,14647],{},[36,14648,14649],{},"Sewing Bias Tape",[2357,14651,14652],{},[36,14653,14654],{},"Racquet Vibration Dampeners",[2357,14656,14657],{},[36,14658,14659],{},"Live Shrubs",[2357,14661,14662],{},[36,14663,14664],{},"Cable Tie Guns",[2357,14666,14667],{},[36,14668,14669],{},"Floating Shelves",[2357,14671,14672],{},[36,14673,14674],{},"Empty Camping Stove Fuel Bottles",[2357,14676,14677],{},[36,14678,14679],{},"Toy Billiards",[2357,14681,14682],{},[36,14683,14684],{},"Water Diverters",[2357,14686,14687],{},[36,14688,14689],{},"Powdered Baking Cocoa",[2357,14691,14692],{},[36,14693,14694],{},"Card Shufflers",[2357,14696,14697],{},[36,14698,14699],{},"Tool Sets",[2357,14701,14702],{},[36,14703,14704],{},"Paper Holders & Dispensers",[2357,14706,14707],{},[36,14708,14709],{},"Bed-in-a-Bag",[2357,14711,14712],{},[36,14713,14714],{},"Rail Planters",[2357,14716,14717],{},[36,14718,14719],{},"Glass Markers & Stemware Charms",[2357,14721,14722],{},[36,14723,14724],{},"Poison Ingestion Treatments",[2357,14726,14727],{},[36,14728,14729],{},"Sewing Baskets",[2357,14731,14732],{},[36,14733,14734],{},"Decorative Boxes",[2357,14736,14737],{},[36,14738,14739],{},"Play Tents",[2357,14741,14742],{},[36,14743,14744],{},"Oke Daiko Drums",[2357,14746,14747],{},[36,14748,14749],{},"One-Piece Swimsuits",[2357,14751,14752],{},[36,14753,14754],{},"Bicycle Stands",[2357,14756,14757],{},[36,14758,14759],{},"Photography Flash Heads",[2357,14761,14762],{},[36,14763,14764],{},"Yogurt Makers",[2357,14766,14767],{},[36,14768,14769],{},"Field Hockey Goalie Hand Protectors",[2357,14771,14772],{},[36,14773,14774],{},"Window Shades",[2357,14776,14777],{},[36,14778,14779],{},"Camera Battery Grips",[2357,14781,14782],{},[36,14783,14784],{},"Hunting Game Hoists & Gambrels",[2357,14786,14787],{},[36,14788,14789],{},"Sunglass Visor Clips",[2357,14791,14792],{},[36,14793,14794],{},"Christmas Trees",[2357,14796,14797],{},[36,14798,14799],{},"Edge & Corner Guards",[2357,14801,14802],{},[36,14803,14804],{},"Golf Carts",[2357,14806,14807],{},[36,14808,14809],{},"Screen Houses",[2357,14811,14812],{},[36,14813,14814],{},"Tent Poles",[2357,14816,14817],{},[36,14818,14819],{},"Fish Cleaning Tables",[2357,14821,14822],{},[36,14823,14824],{},"Bicycle Saddle Covers",[2357,14826,14827],{},[36,14828,14829],{},"Plant Seeds",[2357,14831,14832],{},[36,14833,14834],{},"Geographic Globes",[2357,14836,14837],{},[36,14838,14839],{},"Jewelry Making Chain",[2357,14841,14842],{},[36,14843,14844],{},"Figurines & Knick-Knacks",[2357,14846,14847],{},[36,14848,14849],{},"Binder Insert Strips",[2357,14851,14852],{},[36,14853,14854],{},"Hair Clipper Blades",[2357,14856,14857],{},[36,14858,14859],{},"Nutrition Drinks",[2357,14861,14862],{},[36,14863,14864],{},"Musical Bow Cases",[2357,14866,14867],{},[36,14868,14869],{},"Glue Guns",[2357,14871,14872],{},[36,14873,14874],{},"Breast Tape",[2357,14876,14877],{},[36,14878,14879],{},"Automotive Lift Supports",[2357,14881,14882],{},[36,14883,14884],{},"Acoustic Guitars",[2357,14886,14887],{},[36,14888,14889],{},"Therapeutic Light Boxes",[2357,14891,14892],{},[36,14893,14894],{},"Stovetop Espresso Pot Replacement Gaskets & Filters",[2357,14896,14897],{},[36,14898,14899],{},"Beverage Tubs",[2357,14901,14902],{},[36,14903,14904],{},"Lifeguard Swimsuits",[2357,14906,14907],{},[36,14908,14909],{},"Other Backpacking & Camping Supplies",[2357,14911,14912],{},[36,14913,14914],{},"Napkin Rings",[2357,14916,14917],{},[36,14918,14919],{},"Staple Removers",[2357,14921,14922],{},[36,14923,14924],{},"Gravy Boats, Stands & Sets",[2357,14926,14927],{},[36,14928,14929],{},"Bath Pillows",[2357,14931,14932],{},[36,14933,14934],{},"Easter Eggs",[2357,14936,14937],{},[36,14938,14939],{},"Cut Flowers",[2357,14941,14942],{},[36,14943,14944],{},"Traditional Abayas",[2357,14946,14947],{},[36,14948,14949],{},"Air Guns",[2357,14951,14952],{},[36,14953,14954],{},"Electric Fence Insulators",[2357,14956,14957],{},[36,14958,14959],{},"SIM Cards",[2357,14961,14962],{},[36,14963,14964],{},"Oven Mitts",[2357,14966,14967],{},[36,14968,14969],{},"Gun Barrels",[2357,14971,14972],{},[36,14973,14974],{},"Automotive Skid Plates",[2357,14976,14977],{},[36,14978,14979],{},"Sport Starter Pistols",[2357,14981,14982],{},[36,14983,14984],{},"Personal Misters",[2357,14986,14987],{},[36,14988,14989],{},"Telescope Eyepiece & Filter Sets",[2357,14991,14992],{},[36,14993,14994],{},"Cell Phone Radiation Guards",[2357,14996,14997],{},[36,14998,14999],{},"Snowmobile Riser Blocks",[2357,15001,15002],{},[36,15003,15004],{},"Football Target Nets",[2357,15006,15007],{},[36,15008,15009],{},"Memory Card Adapters",[2357,15011,15012],{},[36,15013,15014],{},"Mobility Walkers",[2357,15016,15017],{},[36,15018,15019],{},"Ice Buckets",[2357,15021,15022],{},[36,15023,15024],{},"Skins for Vape Pens",[2357,15026,15027],{},[36,15028,15029],{},"Electrical Ballasts",[2357,15031,15032],{},[36,15033,15034],{},"Bicycle Frames",[2357,15036,15037],{},[36,15038,15039],{},"Cheese Wax",[2357,15041,15042],{},[36,15043,15044],{},"Whole Bean Coffee",[2357,15046,15047],{},[36,15048,15049],{},"Tennis Rebounders",[2357,15051,15052],{},[36,15053,15054],{},"Plaster Hawks",[2357,15056,15057],{},[36,15058,15059],{},"Dance Shoes",[2357,15061,15062],{},[36,15063,15064],{},"Pizza Crusts",[2357,15066,15067],{},[36,15068,15069],{},"Other Fireplaces Accessories",[2357,15071,15072],{},[36,15073,15074],{},"Epoxy Coatings",[2357,15076,15077],{},[36,15078,15079],{},"Automotive Trailers",[2357,15081,15082],{},[36,15083,15084],{},"Gift Wrap Paper",[2357,15086,15087],{},[36,15088,15089],{},"Material Handling Securing Straps",[2357,15091,15092],{},[36,15093,15094],{},"Disposable Cameras",[2357,15096,15097],{},[36,15098,15099],{},"Small Animal Exercise Wheels",[2357,15101,15102],{},[36,15103,15104],{},"Hall Trees",[2357,15106,15107],{},[36,15108,15109],{},"Cash Boxes",[2357,15111,15112],{},[36,15113,15114],{},"Sprinkler Valves",[2357,15116,15117],{},[36,15118,15119],{},"Renewable Energy Controllers",[2357,15121,15122],{},[36,15123,15124],{},"Impact Drivers",[2357,15126,15127],{},[36,15128,15129],{},"Home Brewing Grain & Hop Bags",[2357,15131,15132],{},[36,15133,15134],{},"ATV Cargo Storage",[2357,15136,15137],{},[36,15138,15139],{},"Bicycle Derailleurs",[2357,15141,15142],{},[36,15143,15144],{},"Darkroom Squeegees",[2357,15146,15147],{},[36,15148,15149],{},"Lens Supports",[2357,15151,15152],{},[36,15153,15154],{},"Roller Stands",[2357,15156,15157],{},[36,15158,15159],{},"Breath Fresheners",[2357,15161,15162],{},[36,15163,15164],{},"Leaf & Plant Cleaner",[2357,15166,15167],{},[36,15168,15169],{},"Cricket Balls",[2357,15171,15172],{},[36,15173,15174],{},"Automotive Bumpers",[2357,15176,15177],{},[36,15178,15179],{},"Other Baby Safety Supplies",[2357,15181,15182],{},[36,15183,15184],{},"Confetti Poppers",[2357,15186,15187],{},[36,15188,15189],{},"Swimsuit Sets",[2357,15191,15192],{},[36,15193,15194],{},"Manual Pencil Sharpeners",[2357,15196,15197],{},[36,15198,15199],{},"Toilet Bowls",[2357,15201,15202],{},[36,15203,15204],{},"Art & Blueprint Tubes",[2357,15206,15207],{},[36,15208,15209],{},"Air Fryer Liners",[2357,15211,15212],{},[36,15213,15214],{},"Other Bicycle Parts",[2357,15216,15217],{},[36,15218,15219],{},"Gymnastics Hand Grips",[2357,15221,15222],{},[36,15223,15224],{},"Garlic Presses",[2357,15226,15227],{},[36,15228,15229],{},"GPS Software",[2357,15231,15232],{},[36,15233,15234],{},"Banana Hangers",[2357,15236,15237],{},[36,15238,15239],{},"Animal Grooming Scissors",[2357,15241,15242],{},[36,15243,15244],{},"Dining Tables",[2357,15246,15247],{},[36,15248,15249],{},"DAT Recorders",[2357,15251,15252],{},[36,15253,15254],{},"Decorative Bowls",[2357,15256,15257],{},[36,15258,15259],{},"Dustpans & Dustpan & Brush Sets",[2357,15261,15262],{},[36,15263,15264],{},"Racquet Sport Racquets",[2357,15266,15267],{},[36,15268,15269],{},"Lap Guitars",[2357,15271,15272],{},[36,15273,15274],{},"Construction Siding",[2357,15276,15277],{},[36,15278,15279],{},"Baking Cups",[2357,15281,15282],{},[36,15283,15284],{},"Hair Extensions",[2357,15286,15287],{},[36,15288,15289],{},"Starting Fluid",[2357,15291,15292],{},[36,15293,15294],{},"Chemical Solvents",[2357,15296,15297],{},[36,15298,15299],{},"Pet Training Pad Trays",[2357,15301,15302],{},[36,15303,15304],{},"Fishing Hook Sharpeners",[2357,15306,15307],{},[36,15308,15309],{},"Other Construction Heating & Cooling Supplies",[2357,15311,15312],{},[36,15313,15314],{},"Air Press Coffee Makers",[2357,15316,15317],{},[36,15318,15319],{},"Playground Merry-Go-Rounds",[2357,15321,15322],{},[36,15323,15324],{},"Clothes Iron Rests",[2357,15326,15327],{},[36,15328,15329],{},"Coffee Drippers",[2357,15331,15332],{},[36,15333,15334],{},"Microscope Mechanical Stages",[2357,15336,15337],{},[36,15338,15339],{},"Makeup Palettes",[2357,15341,15342],{},[36,15343,15344],{},"Fish Poachers & Bakers",[2357,15346,15347],{},[36,15348,15349],{},"Power Screwdrivers",[2357,15351,15352],{},[36,15353,15354],{},"Other Bowling Supplies",[2357,15356,15357],{},[36,15358,15359],{},"Hardware Bolts",[2357,15361,15362],{},[36,15363,15364],{},"Gymnastics Rings",[2357,15366,15367],{},[36,15368,15369],{},"Other Occupational Health",[2357,15371,15372],{},[36,15373,15374],{},"Automotive Glow Plugs",[2357,15376,15377],{},[36,15378,15379],{},"Gun Stocks",[2357,15381,15382],{},[36,15383,15384],{},"Ice Fishing Spearing Equipment",[2357,15386,15387],{},[36,15388,15389],{},"Light Timers",[2357,15391,15392],{},[36,15393,15394],{},"Plant Pots & Planters",[2357,15396,15397],{},[36,15398,15399],{},"Camera Rain Covers",[2357,15401,15402],{},[36,15403,15404],{},"Table Place Cards",[2357,15406,15407],{},[36,15408,15409],{},"Door Closers",[2357,15411,15412],{},[36,15413,15414],{},"Commercial Refrigerators",[2357,15416,15417],{},[36,15418,15419],{},"Home Brewing Beer Bottle Caps",[2357,15421,15422],{},[36,15423,15424],{},"Badge & ID Holders",[2357,15426,15427],{},[36,15428,15429],{},"Interdental Brushes",[2357,15431,15432],{},[36,15433,15434],{},"Facial Self-Tanners",[2357,15436,15437],{},[36,15438,15439],{},"Archery Finger Tabs",[2357,15441,15442],{},[36,15443,15444],{},"Hand Drills",[2357,15446,15447],{},[36,15448,15449],{},"Cooking Sauces & Marinades",[2357,15451,15452],{},[36,15453,15454],{},"Conductor",[19,15456],{},[55,15458,15460],{"id":15459},"walmart-category-metadata-field-mapping","Walmart Category Metadata Field Mapping",[22,15462,15463,15464,15466],{},"Use this table to understand what metadata fields are allowed for each ",[36,15465,3397],{},"  when creating items via Unified. Please note that these metadata fields are optional, while some categories do need specific metadata fields",[22,15468,15469],{},[41,15470,15473],{"href":15471,"rel":15472},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fcreating_walmart_items_via_unified-file-0-walmart_schema_fields.md",[45],"file",[19,15475],{},[3629,15477,15479],{"id":15478},"sample-payload","Sample Payload",[2584,15481,15483],{"className":7323,"code":15482,"language":7325,"meta":2433,"style":2433},"{\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:\u002F\u002Fi5.walmartimages.com\u002Fseo\u002Fonn-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:\u002F\u002Fi5.walmartimages.com\u002Fseo\u002Fonn-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",[36,15484,15485,15489,15500,15512,15524,15536,15548,15555,15560,15570,15574,15579,15591,15598,15602,15613,15625,15632,15636,15646,15650,15654,15658,15662,15669,15680,15691,15698,15705,15712,15719,15724,15728,15740,15751,15763,15775,15787,15794,15805,15815,15819,15826,15831,15835,15842,15854,15864,15868,15875,15885,15893,15897,15904,15914,15923,15927,15934,15945,15953,15957,15968,15979,15991,16002,16014,16026,16038,16048,16053,16061],{"__ignoreMap":2433},[414,15486,15487],{"class":2593,"line":2594},[414,15488,8916],{"class":2705},[414,15490,15491,15493,15495,15498],{"class":2593,"line":2434},[414,15492,8945],{"class":2607},[414,15494,7340],{"class":2705},[414,15496,15497],{"class":2601},"\"Wireless Earphones with Advanced Features\"",[414,15499,2757],{"class":2705},[414,15501,15502,15505,15507,15510],{"class":2593,"line":2613},[414,15503,15504],{"class":2607},"  \"slug\"",[414,15506,7340],{"class":2705},[414,15508,15509],{"class":2601},"\"09876543210987\"",[414,15511,2757],{"class":2705},[414,15513,15514,15517,15519,15522],{"class":2593,"line":2625},[414,15515,15516],{"class":2607},"  \"global_code\"",[414,15518,7340],{"class":2705},[414,15520,15521],{"class":2601},"\"06146190200012\"",[414,15523,2757],{"class":2705},[414,15525,15526,15529,15531,15534],{"class":2593,"line":2677},[414,15527,15528],{"class":2607},"  \"type\"",[414,15530,7340],{"class":2705},[414,15532,15533],{"class":2601},"\"Exterior Automotive Accessories\"",[414,15535,2757],{"class":2705},[414,15537,15538,15541,15543,15546],{"class":2593,"line":2751},[414,15539,15540],{"class":2607},"  \"description\"",[414,15542,7340],{"class":2705},[414,15544,15545],{"class":2601},"\"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.\"",[414,15547,2757],{"class":2705},[414,15549,15550,15553],{"class":2593,"line":2760},[414,15551,15552],{"class":2607},"  \"media\"",[414,15554,8960],{"class":2705},[414,15556,15557],{"class":2593,"line":2768},[414,15558,15559],{"class":2705},"    {\n",[414,15561,15562,15565,15567],{"class":2593,"line":2776},[414,15563,15564],{"class":2607},"      \"url\"",[414,15566,7340],{"class":2705},[414,15568,15569],{"class":2601},"\"https:\u002F\u002Fi5.walmartimages.com\u002Fseo\u002Fonn-Wireless-Bluetooth-on-Ear-Headphones-Black-New_07de2d93-505b-4902-8366-388a3f30e3b4.9375c5690645733ec080eef3f4895f7b.jpeg\"\n",[414,15571,15572],{"class":2593,"line":2784},[414,15573,10535],{"class":2705},[414,15575,15576],{"class":2593,"line":2792},[414,15577,15578],{"class":2705},"  ],\n",[414,15580,15581,15584,15586,15589],{"class":2593,"line":2804},[414,15582,15583],{"class":2607},"  \"vendor_name\"",[414,15585,7340],{"class":2705},[414,15587,15588],{"class":2601},"\"Walmart\"",[414,15590,2757],{"class":2705},[414,15592,15593,15596],{"class":2593,"line":2809},[414,15594,15595],{"class":2607},"  \"variants\"",[414,15597,8960],{"class":2705},[414,15599,15600],{"class":2593,"line":2829},[414,15601,15559],{"class":2705},[414,15603,15604,15607,15609,15611],{"class":2593,"line":2843},[414,15605,15606],{"class":2607},"      \"sku\"",[414,15608,7340],{"class":2705},[414,15610,15509],{"class":2601},[414,15612,2757],{"class":2705},[414,15614,15615,15618,15620,15623],{"class":2593,"line":2849},[414,15616,15617],{"class":2607},"      \"weight\"",[414,15619,7340],{"class":2705},[414,15621,15622],{"class":2607},"0.57",[414,15624,2757],{"class":2705},[414,15626,15627,15630],{"class":2593,"line":2854},[414,15628,15629],{"class":2607},"      \"prices\"",[414,15631,8960],{"class":2705},[414,15633,15634],{"class":2593,"line":2880},[414,15635,10590],{"class":2705},[414,15637,15638,15641,15643],{"class":2593,"line":3253},[414,15639,15640],{"class":2607},"          \"price\"",[414,15642,7340],{"class":2705},[414,15644,15645],{"class":2607},"249.99\n",[414,15647,15648],{"class":2593,"line":3261},[414,15649,10641],{"class":2705},[414,15651,15652],{"class":2593,"line":3279},[414,15653,10530],{"class":2705},[414,15655,15656],{"class":2593,"line":3313},[414,15657,10535],{"class":2705},[414,15659,15660],{"class":2593,"line":3326},[414,15661,15578],{"class":2705},[414,15663,15664,15667],{"class":2593,"line":3339},[414,15665,15666],{"class":2607},"  \"metadata\"",[414,15668,10477],{"class":2705},[414,15670,15671,15674,15676,15678],{"class":2593,"line":3359},[414,15672,15673],{"class":2607},"    \"productName\"",[414,15675,7340],{"class":2705},[414,15677,15497],{"class":2601},[414,15679,2757],{"class":2705},[414,15681,15682,15685,15687,15689],{"class":2593,"line":6453},[414,15683,15684],{"class":2607},"    \"brand\"",[414,15686,7340],{"class":2705},[414,15688,15588],{"class":2601},[414,15690,2757],{"class":2705},[414,15692,15693,15696],{"class":2593,"line":6459},[414,15694,15695],{"class":2607},"    \"keyFeatures\"",[414,15697,8960],{"class":2705},[414,15699,15700,15703],{"class":2593,"line":6465},[414,15701,15702],{"class":2601},"      \"Designed to keep up with your workouts\"",[414,15704,2757],{"class":2705},[414,15706,15707,15710],{"class":2593,"line":6471},[414,15708,15709],{"class":2601},"      \"Reinforced design for sweat and water resistance with adjustable, secure-fit earhooks for added comfort and stability.\"",[414,15711,2757],{"class":2705},[414,15713,15714,15717],{"class":2593,"line":6477},[414,15715,15716],{"class":2601},"      \"Stay connected from a distance with Bluetooth technology, these wireless earphones deliver extended range and fewer dropouts.\"",[414,15718,2757],{"class":2705},[414,15720,15721],{"class":2593,"line":6483},[414,15722,15723],{"class":2601},"      \"Powers through long hours of training\"\n",[414,15725,15726],{"class":2593,"line":6489},[414,15727,3778],{"class":2705},[414,15729,15730,15733,15735,15738],{"class":2593,"line":6495},[414,15731,15732],{"class":2607},"    \"countPerPack\"",[414,15734,7340],{"class":2705},[414,15736,15737],{"class":2607},"1",[414,15739,2757],{"class":2705},[414,15741,15742,15745,15747,15749],{"class":2593,"line":6501},[414,15743,15744],{"class":2607},"    \"multipackQuantity\"",[414,15746,7340],{"class":2705},[414,15748,15737],{"class":2607},[414,15750,2757],{"class":2705},[414,15752,15753,15756,15758,15761],{"class":2593,"line":6507},[414,15754,15755],{"class":2607},"    \"isProp65WarningRequired\"",[414,15757,7340],{"class":2705},[414,15759,15760],{"class":2601},"\"No\"",[414,15762,2757],{"class":2705},[414,15764,15765,15768,15770,15773],{"class":2593,"line":6513},[414,15766,15767],{"class":2607},"    \"condition\"",[414,15769,7340],{"class":2705},[414,15771,15772],{"class":2601},"\"New\"",[414,15774,2757],{"class":2705},[414,15776,15777,15780,15782,15785],{"class":2593,"line":6519},[414,15778,15779],{"class":2607},"    \"has_written_warranty\"",[414,15781,7340],{"class":2705},[414,15783,15784],{"class":2601},"\"Yes - Warranty Text\"",[414,15786,2757],{"class":2705},[414,15788,15789,15792],{"class":2593,"line":6525},[414,15790,15791],{"class":2607},"    \"netContent\"",[414,15793,10477],{"class":2705},[414,15795,15796,15799,15801,15803],{"class":2593,"line":6531},[414,15797,15798],{"class":2607},"      \"productNetContentMeasure\"",[414,15800,7340],{"class":2705},[414,15802,15737],{"class":2607},[414,15804,2757],{"class":2705},[414,15806,15807,15810,15812],{"class":2593,"line":6537},[414,15808,15809],{"class":2607},"      \"productNetContentUnit\"",[414,15811,7340],{"class":2705},[414,15813,15814],{"class":2601},"\"Each\"\n",[414,15816,15817],{"class":2593,"line":6543},[414,15818,3548],{"class":2705},[414,15820,15821,15824],{"class":2593,"line":6549},[414,15822,15823],{"class":2607},"    \"productSecondaryImageURL\"",[414,15825,8960],{"class":2705},[414,15827,15828],{"class":2593,"line":6555},[414,15829,15830],{"class":2601},"      \"https:\u002F\u002Fi5.walmartimages.com\u002Fseo\u002Fonn-Wireless-Bluetooth-on-Ear-Headphones-Black-New_07de2d93-505b-4902-8366-388a3f30e3b4.9375c5690645733ec080eef3f4895f7b.jpeg\"\n",[414,15832,15833],{"class":2593,"line":6561},[414,15834,3778],{"class":2705},[414,15836,15837,15840],{"class":2593,"line":6567},[414,15838,15839],{"class":2607},"    \"assembledProductLength\"",[414,15841,10477],{"class":2705},[414,15843,15844,15847,15849,15852],{"class":2593,"line":6573},[414,15845,15846],{"class":2607},"      \"measure\"",[414,15848,7340],{"class":2705},[414,15850,15851],{"class":2607},"4.33",[414,15853,2757],{"class":2705},[414,15855,15856,15859,15861],{"class":2593,"line":6579},[414,15857,15858],{"class":2607},"      \"unit\"",[414,15860,7340],{"class":2705},[414,15862,15863],{"class":2601},"\"in\"\n",[414,15865,15866],{"class":2593,"line":6585},[414,15867,3548],{"class":2705},[414,15869,15870,15873],{"class":2593,"line":6591},[414,15871,15872],{"class":2607},"    \"assembledProductHeight\"",[414,15874,10477],{"class":2705},[414,15876,15877,15879,15881,15883],{"class":2593,"line":6597},[414,15878,15846],{"class":2607},[414,15880,7340],{"class":2705},[414,15882,15851],{"class":2607},[414,15884,2757],{"class":2705},[414,15886,15887,15889,15891],{"class":2593,"line":6603},[414,15888,15858],{"class":2607},[414,15890,7340],{"class":2705},[414,15892,15863],{"class":2601},[414,15894,15895],{"class":2593,"line":6609},[414,15896,3548],{"class":2705},[414,15898,15899,15902],{"class":2593,"line":6615},[414,15900,15901],{"class":2607},"    \"assembledProductWeight\"",[414,15903,10477],{"class":2705},[414,15905,15906,15908,15910,15912],{"class":2593,"line":6621},[414,15907,15846],{"class":2607},[414,15909,7340],{"class":2705},[414,15911,15622],{"class":2607},[414,15913,2757],{"class":2705},[414,15915,15916,15918,15920],{"class":2593,"line":6627},[414,15917,15858],{"class":2607},[414,15919,7340],{"class":2705},[414,15921,15922],{"class":2601},"\"lb\"\n",[414,15924,15925],{"class":2593,"line":6633},[414,15926,3548],{"class":2705},[414,15928,15929,15932],{"class":2593,"line":6639},[414,15930,15931],{"class":2607},"    \"assembledProductWidth\"",[414,15933,10477],{"class":2705},[414,15935,15936,15938,15940,15943],{"class":2593,"line":6645},[414,15937,15846],{"class":2607},[414,15939,7340],{"class":2705},[414,15941,15942],{"class":2607},"3.15",[414,15944,2757],{"class":2705},[414,15946,15947,15949,15951],{"class":2593,"line":6651},[414,15948,15858],{"class":2607},[414,15950,7340],{"class":2705},[414,15952,15863],{"class":2601},[414,15954,15955],{"class":2593,"line":6657},[414,15956,3548],{"class":2705},[414,15958,15959,15962,15964,15966],{"class":2593,"line":6663},[414,15960,15961],{"class":2607},"    \"prop65WarningText\"",[414,15963,7340],{"class":2705},[414,15965,15760],{"class":2601},[414,15967,2757],{"class":2705},[414,15969,15970,15973,15975,15977],{"class":2593,"line":6669},[414,15971,15972],{"class":2607},"    \"manufacturer\"",[414,15974,7340],{"class":2705},[414,15976,15588],{"class":2601},[414,15978,2757],{"class":2705},[414,15980,15981,15984,15986,15989],{"class":2593,"line":6675},[414,15982,15983],{"class":2607},"    \"manufacturerPartNumber\"",[414,15985,7340],{"class":2705},[414,15987,15988],{"class":2601},"\"WM123456\"",[414,15990,2757],{"class":2705},[414,15992,15993,15996,15998,16000],{"class":2593,"line":6681},[414,15994,15995],{"class":2607},"    \"count\"",[414,15997,7340],{"class":2705},[414,15999,15737],{"class":2607},[414,16001,2757],{"class":2705},[414,16003,16004,16007,16009,16012],{"class":2593,"line":6687},[414,16005,16006],{"class":2607},"    \"warrantyText\"",[414,16008,7340],{"class":2705},[414,16010,16011],{"class":2601},"\"1 Year\"",[414,16013,2757],{"class":2705},[414,16015,16016,16019,16021,16024],{"class":2593,"line":6693},[414,16017,16018],{"class":2607},"    \"color\"",[414,16020,7340],{"class":2705},[414,16022,16023],{"class":2601},"\"Blue\"",[414,16025,2757],{"class":2705},[414,16027,16028,16031,16033,16036],{"class":2593,"line":6699},[414,16029,16030],{"class":2607},"    \"aaiaBrandID\"",[414,16032,7340],{"class":2705},[414,16034,16035],{"class":2601},"\"WMTB\"",[414,16037,2757],{"class":2705},[414,16039,16040,16043,16045],{"class":2593,"line":6705},[414,16041,16042],{"class":2607},"    \"vehicle_fitment_type\"",[414,16044,7340],{"class":2705},[414,16046,16047],{"class":2601},"\"Specific\"\n",[414,16049,16050],{"class":2593,"line":6711},[414,16051,16052],{"class":2705},"  },\n",[414,16054,16055,16058],{"class":2593,"line":6717},[414,16056,16057],{"class":2607},"  \"options\"",[414,16059,16060],{"class":2705},": {}\n",[414,16062,16063],{"class":2593,"line":6723},[414,16064,3035],{"class":2705},[22,16066,16067,16070,16071,16074,16075,16078,16079,16084,16085,16090],{},[31,16068,16069],{},"NOTE",": If item creation ",[31,16072,16073],{},"fails"," or takes ",[31,16076,16077],{},"too long"," to process, the ",[31,16080,16081],{},[36,16082,16083],{},"feed ID"," and any ",[31,16086,16087],{},[36,16088,16089],{},"error details"," will be returned in the error response.",[22,16092,16093,16094,34,16097,34,16101],{},"⚠️ ",[31,16095,16096],{},"Important Note on Reading",[31,16098,16099],{},[36,16100,11161],{},[31,16102,16103],{},"Data via Walmart's GET and LIST APIs",[22,16105,16106,16107,4149,16109,16112,16113,16115,16116,16119],{},"When using Walmart's ",[31,16108,9294],{},[31,16110,16111],{},"LIST"," endpoints to retrieve ",[36,16114,11161],{}," records (i.e., your catalog items), ",[31,16117,16118],{},"you will only receive a subset of the full item",". This limitation is imposed by Walmart's public Marketplace APIs and is not configurable.",[3629,16121,16123],{"id":16122},"whats-missing","What's Missing?",[2354,16125,16126,16152],{},[2357,16127,16128,16129,16134,16135,319,16138,319,16141,319,16144,16147,16148,16151],{},"Fields defined in the ",[31,16130,16131],{},[36,16132,16133],{},"Visible"," section of your original item feed (e.g., ",[36,16136,16137],{},"animalLifestage",[36,16139,16140],{},"assembledProductWeight",[36,16142,16143],{},"features",[36,16145,16146],{},"fabricContent",", etc.) will ",[31,16149,16150],{},"not be returned"," in full.",[2357,16153,16154,16155,97],{},"Walmart truncates or omits many ",[31,16156,16157],{},"category-specific structured attributes",[3629,16159,16161],{"id":16160},"why-this-happens","Why This Happens:",[22,16163,16164],{},"Walmart's GET\u002FLIST endpoints are designed for high-level overviews or simple listing needs, not for reconstructing detailed item payloads. They surface:",[2354,16166,16167,16170,16173],{},[2357,16168,16169],{},"Basic identifiers (e.g., SKU, productName)",[2357,16171,16172],{},"Core logistics info (e.g., price, inventory, brand)",[2357,16174,2553,16175,16178],{},[25,16176,16177],{},"limited set"," of visible attributes",[4156,16180,16181],{},"html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":2433,"searchDepth":2434,"depth":2434,"links":16183},[16184,16185,16186,16188],{"id":11171,"depth":2613,"text":11172},{"id":11232,"depth":2613,"text":11233},{"id":11649,"depth":2613,"text":16187},"Supported type Values for Walmart Items (commerce_item)",{"id":15459,"depth":2434,"text":15460,"children":16189},[16190,16191,16192],{"id":15478,"depth":2613,"text":15479},{"id":16122,"depth":2613,"text":16123},{"id":16160,"depth":2613,"text":16161},"Unified allows you to create structured product listings on Walmart Marketplace via our Unified data model `commerceitem`. This guide explains the critical...",{"img":16195,"date":16196,"updated":16197,"tag":2457,"integrations":16198},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fcreating_walmart_items_via_unified-icon.png","2025-07-31T00:00:00.000Z","2026-08-23T14:53:45.675Z","walmart","\u002Fguides\u002Fcreating_walmart_items_via_unified",{"title":11139,"description":16193},"guides\u002Fcreating_walmart_items_via_unified","_lPlkA08BtkOmv-b9wsMDNW0E411bpcBEoaEnNrgcgI",{"id":16204,"title":16205,"body":16206,"description":16803,"extension":2452,"meta":16804,"navigation":2459,"path":16808,"seo":16809,"stem":16810,"__hash__":16811},"guides\u002Fguides\u002Fend_users_integrations_and_connections.md","End-Users, Integrations, and Connections",{"type":12,"value":16207,"toc":16780},[16208,16211,16213,16218,16225,16227,16230,16249,16255,16259,16262,16266,16296,16299,16306,16310,16313,16317,16324,16338,16341,16357,16361,16364,16367,16378,16381,16385,16388,16396,16403,16410,16414,16417,16421,16424,16446,16449,16453,16456,16480,16483,16577,16581,16584,16598,16606,16610,16671,16673,16676,16680,16691,16695,16706,16710,16744,16752,16756,16777],[15,16209,16205],{"id":16210},"end-users-integrations-and-connections",[19,16212],{},[22,16214,16215],{},[25,16216,16217],{},"April 18, 2024",[22,16219,16220,16221,16224],{},"This guide explains how connections work at ",[41,16222,123],{"href":121,"rel":16223},[45]," 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.",[55,16226,4426],{"id":4425},[22,16228,16229],{},"At Unified.to, there are three key concepts to understand:",[2510,16231,16232,16237,16243],{},[2357,16233,16234,16236],{},[31,16235,4433],{}," - These are the bridges between your application and third-party platforms (a.k.a SaaS apps). These are pre-built for you!",[2357,16238,16239,16242],{},[31,16240,16241],{},"Connections"," - These are the authorized links between your end-users and specific integrations",[2357,16244,16245,16248],{},[31,16246,16247],{},"End-users"," - These are your application's users whose data you will access from their accounts i.e. HubSpots, Salesforce, Shopify, and so on.",[22,16250,16251],{},[4201,16252],{"alt":16253,"src":16254},"Users_connections_and_integrations_%2810%29.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fend_users_integrations_and_connections-0.png",[55,16256,16258],{"id":16257},"understanding-integrations","Understanding integrations",[22,16260,16261],{},"Your application communicates with a SaaS application through an integration.",[3629,16263,16265],{"id":16264},"activating-an-integration-in-the-sandbox-environment","Activating an integration in the sandbox environment",[2510,16267,16268,16279,16282,16290],{},[2357,16269,16270,16271,16273,16274],{},"Navigate to ",[31,16272,4433],{}," at ",[41,16275,16278],{"href":16276,"rel":16277},"https:\u002F\u002Fapp.unified.to\u002Fintegrations",[45],"app.unified.to\u002Fintegrations",[2357,16280,16281],{},"Search for the integration you want to use",[2357,16283,16284,16285],{},"Click on the integration card to view its details\n",[2510,16286,16287],{},[2357,16288,16289],{},"For sandbox environment integrations, you don't need to enter any real credentials here.",[2357,16291,16292,16293],{},"Click ",[31,16294,16295],{},"Activate",[22,16297,16298],{},"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.",[22,16300,16301],{},[41,16302,16305],{"href":16303,"rel":16304},"https:\u002F\u002Fdocs.unified.to\u002Fconcepts\u002Fsandbox",[45],"Learn more about the sandbox environment →",[3629,16307,16309],{"id":16308},"activating-an-integration-in-production-environments","Activating an integration in production environments",[22,16311,16312],{},"To activate an integration in production environments, you'll need developer credentials from the platform you're integrating with.",[3629,16314,16316],{"id":16315},"developer-credentials","Developer credentials",[22,16318,16319,16320,16323],{},"When activating an integration, you'll be asked to provide credentials like API keys or OAuth 2.0 client IDs and secrets. These credentials should come from ",[31,16321,16322],{},"your developer account"," with the platform, not your end-users' accounts. Here's how it works:",[2510,16325,16326,16329,16332,16335],{},[2357,16327,16328],{},"You register your application with the platform (e.g., create a HubSpot developer account and register your app)",[2357,16330,16331],{},"You receive developer credentials that identify your application",[2357,16333,16334],{},"You enter these credentials when activating the integration on Unified.to",[2357,16336,16337],{},"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)",[22,16339,16340],{},"For example, if you're building an interview scheduling platform that needs to access your clients' Zoho CRM data:",[2354,16342,16343,16350],{},[2357,16344,16345,16346,16349],{},"You use ",[31,16347,16348],{},"your"," Zoho developer account credentials to activate the integration",[2357,16351,16352,16353,16356],{},"Your ",[31,16354,16355],{},"end-users"," will authorize access to their Zoho CRM accounts when creating connections by consenting to give you access to their data",[55,16358,16360],{"id":16359},"understanding-connections","Understanding connections",[22,16362,16363],{},"Your end-users are connected to integrations through connections_._",[22,16365,16366],{},"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:",[2510,16368,16369,16372,16375],{},[2357,16370,16371],{},"The HubSpot integration to be activated in your workspace",[2357,16373,16374],{},"A connection between that specific user and HubSpot",[2357,16376,16377],{},"The correct scope configuration for what data you need to access",[22,16379,16380],{},"Each user needs their own connection to each integration you want to use. This ensures proper authorization and data isolation between users.",[3629,16382,16384],{"id":16383},"about-scopes","About scopes",[22,16386,16387],{},"Scopes determine what data your application can access in your end-users' accounts. You need to:",[2510,16389,16390,16393],{},[2357,16391,16392],{},"Configure the correct scopes in your developer account with the platform",[2357,16394,16395],{},"Select the corresponding Unified.to scopes when setting up your integration",[22,16397,16398,16399,16402],{},"For example, if you need to read CRM contacts, you would request the ",[36,16400,16401],{},"crm_contact_read"," 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.",[22,16404,16405],{},[41,16406,16409],{"href":16407,"rel":16408},"https:\u002F\u002Fdocs.unified.to\u002Fconcepts\u002Fscopes",[45],"Learn more about configuring scopes →",[55,16411,16413],{"id":16412},"how-to-create-connections","How to create connections",[22,16415,16416],{},"There are three main ways to create connections in Unified.to, each suited for different scenarios:",[3629,16418,16420],{"id":16419},"_1-development-and-testing-create-test-connections-in-the-sandbox-environment","1. Development and testing: Create test connections in the sandbox environment",[22,16422,16423],{},"This is the fastest way to get started and test integrations:",[2510,16425,16426,16432,16438,16443],{},[2357,16427,16428,16429,16431],{},"Switch to the ",[31,16430,6091],{}," environment in the Unified.to app",[2357,16433,16434,16435,16437],{},"Go to the ",[31,16436,16241],{}," page",[2357,16439,16292,16440],{},[31,16441,16442],{},"Create test connection",[2357,16444,16445],{},"Select any activated integration you want to test",[22,16447,16448],{},"Test connections are created instantly with mock credentials, perfect for development and testing.",[3629,16450,16452],{"id":16451},"_2-production-ready-use-the-authorization-embedded-component","2. Production ready: Use the Authorization embedded component",[22,16454,16455],{},"This is the recommended approach for production-ready applications:",[2510,16457,16458,16468,16471,16474,16477],{},[2357,16459,16460,16461,16437],{},"Navigate to the ",[41,16462,16465],{"href":16463,"rel":16464},"https:\u002F\u002Fapp.unified.to\u002Fembed",[45],[31,16466,16467],{},"Embedded Authorization",[2357,16469,16470],{},"Configure your callback settings, permission scopes, and display options",[2357,16472,16473],{},"Copy the provided code snippet for your preferred tool (React, Angular, Vue, vanilla JavaScript, or an API call)",[2357,16475,16476],{},"Add the code to your application",[2357,16478,16479],{},"The Authorization component will be rendered on your app. When users click an integration's logo, they'll be guided through the authorization process",[22,16481,16482],{},"Example code for React:",[2584,16484,16488],{"className":16485,"code":16486,"language":16487,"meta":2433,"style":2433},"language-javascript shiki shiki-themes github-dark github-dark github-light","import UnifiedDirectory from '@unified-api\u002Freact-directory';\n\nfunction App() {\n  return (\n    \u003CUnifiedDirectory\n      workspace_id=\"{WORKSPACE_ID}\"\n      environment=\"{ENVIRONMENT}\"\n      success_redirect=\"{SUCCESS_URL}\"\n    \u002F>\n  );\n}\n","javascript",[36,16489,16490,16504,16508,16518,16525,16533,16543,16553,16563,16568,16573],{"__ignoreMap":2433},[414,16491,16492,16494,16497,16499,16502],{"class":2593,"line":2594},[414,16493,2699],{"class":2698},[414,16495,16496],{"class":2705}," UnifiedDirectory ",[414,16498,2716],{"class":2698},[414,16500,16501],{"class":2601}," '@unified-api\u002Freact-directory'",[414,16503,2706],{"class":2705},[414,16505,16506],{"class":2593,"line":2434},[414,16507,2740],{"emptyLinePlaceholder":2459},[414,16509,16510,16513,16516],{"class":2593,"line":2613},[414,16511,16512],{"class":2698},"function",[414,16514,16515],{"class":2597}," App",[414,16517,3936],{"class":2705},[414,16519,16520,16522],{"class":2593,"line":2625},[414,16521,2999],{"class":2698},[414,16523,16524],{"class":2705}," (\n",[414,16526,16527,16530],{"class":2593,"line":2677},[414,16528,16529],{"class":2705},"    \u003C",[414,16531,16532],{"class":2607},"UnifiedDirectory\n",[414,16534,16535,16538,16540],{"class":2593,"line":2751},[414,16536,16537],{"class":2597},"      workspace_id",[414,16539,2798],{"class":2698},[414,16541,16542],{"class":2601},"\"{WORKSPACE_ID}\"\n",[414,16544,16545,16548,16550],{"class":2593,"line":2760},[414,16546,16547],{"class":2597},"      environment",[414,16549,2798],{"class":2698},[414,16551,16552],{"class":2601},"\"{ENVIRONMENT}\"\n",[414,16554,16555,16558,16560],{"class":2593,"line":2768},[414,16556,16557],{"class":2597},"      success_redirect",[414,16559,2798],{"class":2698},[414,16561,16562],{"class":2601},"\"{SUCCESS_URL}\"\n",[414,16564,16565],{"class":2593,"line":2776},[414,16566,16567],{"class":2705},"    \u002F>\n",[414,16569,16570],{"class":2593,"line":2784},[414,16571,16572],{"class":2705},"  );\n",[414,16574,16575],{"class":2593,"line":2792},[414,16576,3035],{"class":2705},[3629,16578,16580],{"id":16579},"_3-custom-implementation-build-your-own-authorization-flow","3. Custom implementation: Build your own authorization flow",[22,16582,16583],{},"For greater control over the user experience:",[2510,16585,16586,16589,16592,16595],{},[2357,16587,16588],{},"Fetch available integrations using the Unified API",[2357,16590,16591],{},"Create authorization URLs for selected integrations",[2357,16593,16594],{},"Handle authorization callbacks",[2357,16596,16597],{},"Manage connection IDs",[22,16599,16600,16601,97],{},"This approach requires slightly more implementation work but offers more flexibility. You can find a ",[41,16602,16605],{"href":16603,"rel":16604},"https:\u002F\u002Fdocs.unified.to\u002Ftutorials\u002Fcustomize-auth-flow",[45],"complete tutorial for this approach in our documentation",[55,16607,16609],{"id":16608},"best-practices","Best practices",[2354,16611,16612,16618,16624,16635,16647,16659,16665],{},[2357,16613,16614,16617],{},[31,16615,16616],{},"Always test in Sandbox first",": Use test connections to validate your integration logic",[2357,16619,16620,16623],{},[31,16621,16622],{},"Store connection IDs securely",": Never store connection IDs in client-side storage in production",[2357,16625,16626,16629,16630,97],{},[31,16627,16628],{},"Handle authorization failures gracefully",": Provide clear feedback when connection attempts fail. Users will be redirected to the failure URL you specified during configuration. ",[41,16631,16634],{"href":16632,"rel":16633},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_troubleshoot_unhealthy_connections#handle-errors-during-connection-creation",[45],"Learn more about handling failure callbacks here",[2357,16636,16637,16640,16641,16646],{},[31,16638,16639],{},"Monitor connection health",": Set up ",[41,16642,16645],{"href":16643,"rel":16644},"https:\u002F\u002Fapp.unified.to\u002Fsettings\u002Fworkspace",[45],"webhook notifications"," for connection status changes",[2357,16648,16649,16652,16653,16658],{},[31,16650,16651],{},"Re-authorize instead of recreating",": When a connection becomes unhealthy, ask the end-user to ",[41,16654,16657],{"href":16655,"rel":16656},"https:\u002F\u002Fdocs.unified.to\u002Fconcepts\u002Fembedded-components#re-authorize-an-existing-connection",[45],"re-authorize the existing connection",". It keeps the same connection ID, so you don't end up with duplicate connections or need to update stored IDs and webhooks",[2357,16660,16661,16664],{},[31,16662,16663],{},"Configure scopes correctly",": Request only the permissions your application needs",[2357,16666,16667,16670],{},[31,16668,16669],{},"Use separate environments",": Keep your development and production environments separate",[55,16672,5622],{"id":5621},[22,16674,16675],{},"Common issues and solutions:",[3629,16677,16679],{"id":16678},"connection-creation-fails","Connection creation fails",[2354,16681,16682,16685,16688],{},[2357,16683,16684],{},"Verify your developer credentials are correct",[2357,16686,16687],{},"Check that required scopes are configured both in your platform developer account and Unified.to",[2357,16689,16690],{},"Ensure redirect URLs are properly set up in your platform developer settings",[3629,16692,16694],{"id":16693},"authorization-flow-issues","Authorization flow issues",[2354,16696,16697,16700,16703],{},[2357,16698,16699],{},"Confirm your integration is activated",[2357,16701,16702],{},"Verify environment settings (Sandbox vs Production)",[2357,16704,16705],{},"Check that scopes match between your platform developer account and Unified.to",[3629,16707,16709],{"id":16708},"a-working-connection-becomes-unhealthy","A working connection becomes unhealthy",[2354,16711,16712,16727,16730],{},[2357,16713,16714,16715,16720,16721,4149,16724,2980],{},"Check the ",[41,16716,16719],{"href":16717,"rel":16718},"https:\u002F\u002Fapp.unified.to\u002Flogs",[45],"API Call Logs"," for the connection to find the error (usually ",[36,16722,16723],{},"401",[36,16725,16726],{},"403",[2357,16728,16729],{},"Fix the cause (for example, restore your app's access or correct the scopes)",[2357,16731,16732,16736,16737,16740,16741,16743],{},[41,16733,16735],{"href":16655,"rel":16734},[45],"Re-authorize the existing connection"," rather than creating a new one. It keeps the connection's current permissions unless you pass ",[36,16738,16739],{},"scopes",", so include ",[36,16742,16739],{}," if you corrected them",[22,16745,16746,16747],{},"For more guidance, see: ",[41,16748,16751],{"href":16749,"rel":16750},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_troubleshoot_unhealthy_connections",[45],"How to troubleshoot unhealthy connections",[55,16753,16755],{"id":16754},"next-steps","Next steps",[2354,16757,16758,16761,16770],{},[2357,16759,16760],{},"Try creating your first test connection in the sandbox environment",[2357,16762,16763,16764,16769],{},"Explore our ",[41,16765,16768],{"href":16766,"rel":16767},"https:\u002F\u002Fdocs.unified.to\u002Fquick-start",[45],"Quickstart guide"," for a hands-on example",[2357,16771,16772,16773],{},"Read our detailed guide on ",[41,16774,16776],{"href":16407,"rel":16775},[45],"understanding and configuring scopes",[4156,16778,16779],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":2433,"searchDepth":2434,"depth":2434,"links":16781},[16782,16783,16788,16791,16796,16797,16802],{"id":4425,"depth":2434,"text":4426},{"id":16257,"depth":2434,"text":16258,"children":16784},[16785,16786,16787],{"id":16264,"depth":2613,"text":16265},{"id":16308,"depth":2613,"text":16309},{"id":16315,"depth":2613,"text":16316},{"id":16359,"depth":2434,"text":16360,"children":16789},[16790],{"id":16383,"depth":2613,"text":16384},{"id":16412,"depth":2434,"text":16413,"children":16792},[16793,16794,16795],{"id":16419,"depth":2613,"text":16420},{"id":16451,"depth":2613,"text":16452},{"id":16579,"depth":2613,"text":16580},{"id":16608,"depth":2434,"text":16609},{"id":5621,"depth":2434,"text":5622,"children":16798},[16799,16800,16801],{"id":16678,"depth":2613,"text":16679},{"id":16693,"depth":2613,"text":16694},{"id":16708,"depth":2613,"text":16709},{"id":16754,"depth":2434,"text":16755},"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...",{"img":16805,"date":16806,"updated":16807,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fend_users_integrations_and_connections-icon.png","2024-04-18T00:00:00.000Z","2026-10-06T18:13:50.860Z","\u002Fguides\u002Fend_users_integrations_and_connections",{"title":16205,"description":16803},"guides\u002Fend_users_integrations_and_connections","useBvEZE4ObF31GYj2kPzIjsZPlHXADdi-0GCwlh4hU",{"id":16813,"title":16814,"body":16815,"description":17858,"extension":2452,"meta":17859,"navigation":2459,"path":17863,"seo":17864,"stem":17865,"__hash__":17866},"guides\u002Fguides\u002Fenriching_unified_objects_with_custom_metadata.md","Enriching Unified Objects with Custom Metadata",{"type":12,"value":16816,"toc":17835},[16817,16820,16822,16827,16829,16844,16847,16849,16852,16864,16866,16870,17050,17052,17055,17060,17066,17086,17094,17096,17101,17104,17171,17173,17178,17184,17237,17240,17242,17246,17255,17262,17381,17383,17387,17394,17401,17425,17475,17477,17481,17484,17557,17559,17563,17634,17637,17641,17644,17746,17755,17757,17761,17771,17782,17784,17788,17832],[15,16818,16814],{"id":16819},"enriching-unified-objects-with-custom-metadata",[19,16821],{},[22,16823,16824],{},[25,16825,16826],{},"July 23, 2025",[55,16828,4426],{"id":4425},[22,16830,16831,16832,16835,16836,319,16838,319,16840,16843],{},"The metadata_metadata object is a powerful addition to the Unified data model. It enables the definition of ",[31,16833,16834],{},"metadata schemas (custom fields)"," that can be attached to various unified objects—such as ",[36,16837,11161],{},[36,16839,8005],{},[36,16841,16842],{},"hris_employee",", and more.",[22,16845,16846],{},"This document explains its structure, how to use it effectively, and best practices for managing dynamic metadata across models.",[19,16848],{},[55,16850,8629],{"id":16851},"purpose",[22,16853,16854,16856,16857,16860,16861,16863],{},[36,16855,5845],{}," serves as a ",[31,16858,16859],{},"schema registry"," 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 ",[36,16862,11221],{}," field of supported Unified objects.",[19,16865],{},[55,16867,16869],{"id":16868},"object-structure","Object Structure",[2584,16871,16873],{"className":2689,"code":16872,"language":2691,"meta":2433,"style":2433},"interface IMetadataMetadata {\n  id?: string;\n  created_at?: (string | Date | number);\n  updated_at?: (string | Date | number);\n  name: string; \u002F\u002F Required\n  slug?: string;\n  format?: string; \u002F\u002F One of the supported formats\n  original_format?: string;\n  options?: string[];\n  object_type: string; \u002F\u002F e.g. 'commerce_item', 'ats_job'\n  objects?: { [objectType: string]: string[] }; \u002F\u002F Map of object_type to object IDs\n}\n",[36,16874,16875,16885,16897,16919,16940,16954,16965,16979,16990,17002,17016,17046],{"__ignoreMap":2433},[414,16876,16877,16880,16883],{"class":2593,"line":2594},[414,16878,16879],{"class":2698},"interface",[414,16881,16882],{"class":2597}," IMetadataMetadata",[414,16884,2748],{"class":2705},[414,16886,16887,16890,16893,16895],{"class":2593,"line":2434},[414,16888,16889],{"class":2971},"  id",[414,16891,16892],{"class":2698},"?:",[414,16894,2977],{"class":2607},[414,16896,2706],{"class":2705},[414,16898,16899,16902,16904,16906,16908,16910,16913,16915,16917],{"class":2593,"line":2613},[414,16900,16901],{"class":2971},"  created_at",[414,16903,16892],{"class":2698},[414,16905,3970],{"class":2705},[414,16907,9031],{"class":2607},[414,16909,3447],{"class":2698},[414,16911,16912],{"class":2597}," Date",[414,16914,3447],{"class":2698},[414,16916,3679],{"class":2607},[414,16918,3156],{"class":2705},[414,16920,16921,16924,16926,16928,16930,16932,16934,16936,16938],{"class":2593,"line":2625},[414,16922,16923],{"class":2971},"  updated_at",[414,16925,16892],{"class":2698},[414,16927,3970],{"class":2705},[414,16929,9031],{"class":2607},[414,16931,3447],{"class":2698},[414,16933,16912],{"class":2597},[414,16935,3447],{"class":2698},[414,16937,3679],{"class":2607},[414,16939,3156],{"class":2705},[414,16941,16942,16945,16947,16949,16951],{"class":2593,"line":2677},[414,16943,16944],{"class":2971},"  name",[414,16946,2646],{"class":2698},[414,16948,2977],{"class":2607},[414,16950,3394],{"class":2705},[414,16952,16953],{"class":3527},"\u002F\u002F Required\n",[414,16955,16956,16959,16961,16963],{"class":2593,"line":2751},[414,16957,16958],{"class":2971},"  slug",[414,16960,16892],{"class":2698},[414,16962,2977],{"class":2607},[414,16964,2706],{"class":2705},[414,16966,16967,16970,16972,16974,16976],{"class":2593,"line":2760},[414,16968,16969],{"class":2971},"  format",[414,16971,16892],{"class":2698},[414,16973,2977],{"class":2607},[414,16975,3394],{"class":2705},[414,16977,16978],{"class":3527},"\u002F\u002F One of the supported formats\n",[414,16980,16981,16984,16986,16988],{"class":2593,"line":2768},[414,16982,16983],{"class":2971},"  original_format",[414,16985,16892],{"class":2698},[414,16987,2977],{"class":2607},[414,16989,2706],{"class":2705},[414,16991,16992,16995,16997,16999],{"class":2593,"line":2776},[414,16993,16994],{"class":2971},"  options",[414,16996,16892],{"class":2698},[414,16998,2977],{"class":2607},[414,17000,17001],{"class":2705},"[];\n",[414,17003,17004,17007,17009,17011,17013],{"class":2593,"line":2784},[414,17005,17006],{"class":2971},"  object_type",[414,17008,2646],{"class":2698},[414,17010,2977],{"class":2607},[414,17012,3394],{"class":2705},[414,17014,17015],{"class":3527},"\u002F\u002F e.g. 'commerce_item', 'ats_job'\n",[414,17017,17018,17021,17023,17026,17029,17031,17033,17036,17038,17040,17043],{"class":2593,"line":2792},[414,17019,17020],{"class":2971},"  objects",[414,17022,16892],{"class":2698},[414,17024,17025],{"class":2705}," { [",[414,17027,17028],{"class":2971},"objectType",[414,17030,2646],{"class":2698},[414,17032,2977],{"class":2607},[414,17034,17035],{"class":2705},"]",[414,17037,2646],{"class":2698},[414,17039,2977],{"class":2607},[414,17041,17042],{"class":2705},"[] }; ",[414,17044,17045],{"class":3527},"\u002F\u002F Map of object_type to object IDs\n",[414,17047,17048],{"class":2593,"line":2804},[414,17049,3035],{"class":2705},[19,17051],{},[55,17053,17054],{"id":11171},"Key Concepts",[3629,17056,17058],{"id":17057},"object_type",[36,17059,17057],{},[22,17061,11193,17062,17065],{},[31,17063,17064],{},"unified model"," the metadata is associated with. Examples include:",[2354,17067,17068,17073,17078,17083],{},[2357,17069,17070],{},[36,17071,17072],{},"\"commerce_item\"",[2357,17074,17075],{},[36,17076,17077],{},"\"ats_job\"",[2357,17079,17080],{},[36,17081,17082],{},"\"hris_employee\"",[2357,17084,17085],{},"Other Unified Objects",[4937,17087,17088],{},[22,17089,17090,17091,17093],{},"When listing metadata_metadata entries, you can filter by ",[31,17092,3397],{},", which corresponds to the object_type.",[19,17095],{},[3629,17097,17099],{"id":17098},"format",[36,17100,17098],{},[22,17102,17103],{},"Defines the data type for the metadata field. Supported formats include:",[2354,17105,17106,17111,17116,17121,17126,17131,17136,17141,17146,17151,17156,17161,17166],{},[2357,17107,17108],{},[36,17109,17110],{},"'TEXT'",[2357,17112,17113],{},[36,17114,17115],{},"'NUMBER'",[2357,17117,17118],{},[36,17119,17120],{},"'DATE'",[2357,17122,17123],{},[36,17124,17125],{},"'BOOLEAN'",[2357,17127,17128],{},[36,17129,17130],{},"'FILE'",[2357,17132,17133],{},[36,17134,17135],{},"'TEXTAREA'",[2357,17137,17138],{},[36,17139,17140],{},"'SINGLE_SELECT'",[2357,17142,17143],{},[36,17144,17145],{},"'MULTIPLE_SELECT'",[2357,17147,17148],{},[36,17149,17150],{},"'MEASUREMENT'",[2357,17152,17153],{},[36,17154,17155],{},"'PRICE'",[2357,17157,17158],{},[36,17159,17160],{},"'YES_NO'",[2357,17162,17163],{},[36,17164,17165],{},"'CURRENCY'",[2357,17167,17168],{},[36,17169,17170],{},"'URL'",[19,17172],{},[3629,17174,17176],{"id":17175},"objects",[36,17177,17175],{},[22,17179,17180,17181],{},"A mapping of object types to the specific object IDs where this metadata is currently applied.\n",[31,17182,17183],{},"Example:",[2584,17185,17187],{"className":7323,"code":17186,"language":7325,"meta":2433,"style":2433},"{\n  \"objects\": {\n    \"commerce_item\": [\"item1\", \"item2\"],\n    \"ats_job\": [\"job1\"]\n  }\n}\n",[36,17188,17189,17193,17200,17217,17229,17233],{"__ignoreMap":2433},[414,17190,17191],{"class":2593,"line":2594},[414,17192,8916],{"class":2705},[414,17194,17195,17198],{"class":2593,"line":2434},[414,17196,17197],{"class":2607},"  \"objects\"",[414,17199,10477],{"class":2705},[414,17201,17202,17205,17207,17210,17212,17215],{"class":2593,"line":2613},[414,17203,17204],{"class":2607},"    \"commerce_item\"",[414,17206,10492],{"class":2705},[414,17208,17209],{"class":2601},"\"item1\"",[414,17211,319],{"class":2705},[414,17213,17214],{"class":2601},"\"item2\"",[414,17216,10497],{"class":2705},[414,17218,17219,17222,17224,17227],{"class":2593,"line":2625},[414,17220,17221],{"class":2607},"    \"ats_job\"",[414,17223,10492],{"class":2705},[414,17225,17226],{"class":2601},"\"job1\"",[414,17228,9376],{"class":2705},[414,17230,17231],{"class":2593,"line":2677},[414,17232,4032],{"class":2705},[414,17234,17235],{"class":2593,"line":2751},[414,17236,3035],{"class":2705},[22,17238,17239],{},"This makes it easy to track which unified records are using each metadata definition.",[19,17241],{},[55,17243,17245],{"id":17244},"usage-in-unified-objects","Usage in Unified Objects",[22,17247,17248,17249,17251,17252,17254],{},"Each unified object includes a ",[36,17250,11221],{}," array, where each entry corresponds to a metadata definition from the ",[36,17253,5845],{}," registry.",[3629,17256,17258,17259],{"id":17257},"example-iatsjob","Example: ",[36,17260,17261],{},"IAtsJob",[2584,17263,17265],{"className":16485,"code":17264,"language":16487,"meta":2433,"style":2433},"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",[36,17266,17267,17276,17286,17296,17308,17319,17329,17340,17344,17348,17357,17362,17373,17377],{"__ignoreMap":2433},[414,17268,17269,17271,17274],{"class":2593,"line":2594},[414,17270,16879],{"class":2698},[414,17272,17273],{"class":2597}," IAtsMetadata",[414,17275,2748],{"class":2705},[414,17277,17278,17280,17282,17284],{"class":2593,"line":2434},[414,17279,16889],{"class":2971},[414,17281,16892],{"class":2698},[414,17283,2977],{"class":2607},[414,17285,2706],{"class":2705},[414,17287,17288,17290,17292,17294],{"class":2593,"line":2613},[414,17289,16958],{"class":2971},[414,17291,16892],{"class":2698},[414,17293,2977],{"class":2607},[414,17295,2706],{"class":2705},[414,17297,17298,17301,17303,17306],{"class":2593,"line":2625},[414,17299,17300],{"class":2971},"  value",[414,17302,16892],{"class":2698},[414,17304,17305],{"class":2607}," unknown",[414,17307,2706],{"class":2705},[414,17309,17310,17313,17315,17317],{"class":2593,"line":2677},[414,17311,17312],{"class":2971},"  namespace",[414,17314,16892],{"class":2698},[414,17316,2977],{"class":2607},[414,17318,2706],{"class":2705},[414,17320,17321,17323,17325,17327],{"class":2593,"line":2751},[414,17322,16969],{"class":2971},[414,17324,16892],{"class":2698},[414,17326,2977],{"class":2607},[414,17328,2706],{"class":2705},[414,17330,17331,17334,17336,17338],{"class":2593,"line":2760},[414,17332,17333],{"class":2971},"  extra_data",[414,17335,16892],{"class":2698},[414,17337,17305],{"class":2607},[414,17339,2706],{"class":2705},[414,17341,17342],{"class":2593,"line":2768},[414,17343,3035],{"class":2705},[414,17345,17346],{"class":2593,"line":2776},[414,17347,2740],{"emptyLinePlaceholder":2459},[414,17349,17350,17352,17355],{"class":2593,"line":2784},[414,17351,16879],{"class":2698},[414,17353,17354],{"class":2597}," IAtsJob",[414,17356,2748],{"class":2705},[414,17358,17359],{"class":2593,"line":2792},[414,17360,17361],{"class":2698},"  ...\n",[414,17363,17364,17367,17369,17371],{"class":2593,"line":2804},[414,17365,17366],{"class":2971},"  metadata",[414,17368,16892],{"class":2698},[414,17370,17273],{"class":2597},[414,17372,17001],{"class":2705},[414,17374,17375],{"class":2593,"line":2809},[414,17376,17361],{"class":2698},[414,17378,17379],{"class":2593,"line":2829},[414,17380,3035],{"class":2705},[19,17382],{},[55,17384,17386],{"id":17385},"workflow-example","Workflow Example",[3629,17388,17390,17391,17393],{"id":17389},"step-1-create-a-metadata_metadata-definition","Step 1: Create a ",[36,17392,5845],{}," Definition",[22,17395,17396,17397,17400],{},"To begin, define the metadata schema by providing ",[31,17398,17399],{},"only"," the following required fields:",[2354,17402,17403,17408,17414],{},[2357,17404,17405,17407],{},[36,17406,9043],{},": Human-friendly label",[2357,17409,17410,17413],{},[36,17411,17412],{},"slug",": Unique programmatic identifier (Picked up from name if not given)",[2357,17415,17416,17418,17419,319,17421,17424],{},[36,17417,17098],{},": Expected data format (e.g., ",[36,17420,11362],{},[36,17422,17423],{},"\"NUMBER\"",", etc.)",[2584,17426,17428],{"className":7323,"code":17427,"language":7325,"meta":2433,"style":2433},"POST \u002Fmetadata_metadata\n{\n  \"name\": \"Binding Mount\",\n  \"slug\": \"binding_mount\",\n  \"format\": \"TEXT\"\n}\n",[36,17429,17430,17435,17439,17450,17461,17471],{"__ignoreMap":2433},[414,17431,17432],{"class":2593,"line":2594},[414,17433,17434],{"class":2705},"POST \u002Fmetadata_metadata\n",[414,17436,17437],{"class":2593,"line":2434},[414,17438,8916],{"class":2705},[414,17440,17441,17443,17445,17448],{"class":2593,"line":2613},[414,17442,8945],{"class":2607},[414,17444,7340],{"class":2705},[414,17446,17447],{"class":2601},"\"Binding Mount\"",[414,17449,2757],{"class":2705},[414,17451,17452,17454,17456,17459],{"class":2593,"line":2625},[414,17453,15504],{"class":2607},[414,17455,7340],{"class":2705},[414,17457,17458],{"class":2601},"\"binding_mount\"",[414,17460,2757],{"class":2705},[414,17462,17463,17466,17468],{"class":2593,"line":2677},[414,17464,17465],{"class":2607},"  \"format\"",[414,17467,7340],{"class":2705},[414,17469,17470],{"class":2601},"\"TEXT\"\n",[414,17472,17473],{"class":2593,"line":2751},[414,17474,3035],{"class":2705},[19,17476],{},[3629,17478,17480],{"id":17479},"step-2-review-the-created-metadata","Step 2: Review the Created Metadata",[22,17482,17483],{},"Once the metadata is created, the full record might look like this (after automatic enrichment):",[2584,17485,17487],{"className":7323,"code":17486,"language":7325,"meta":2433,"style":2433},"GET \u002Fmetadata_metadata\u002F1\n{\n  \"id\": \"1\",\n  \"name\": \"Binding Mount\",\n  \"slug\": \"binding_mount\",\n  \"format\": \"TEXT\",\n  \"original_format\": \"single_line_text_field\"\n}\n",[36,17488,17489,17497,17501,17513,17523,17533,17543,17553],{"__ignoreMap":2433},[414,17490,17491,17494],{"class":2593,"line":2594},[414,17492,17493],{"class":2705},"GET \u002Fmetadata_metadata\u002F",[414,17495,17496],{"class":2607},"1\n",[414,17498,17499],{"class":2593,"line":2434},[414,17500,8916],{"class":2705},[414,17502,17503,17506,17508,17511],{"class":2593,"line":2613},[414,17504,17505],{"class":2607},"  \"id\"",[414,17507,7340],{"class":2705},[414,17509,17510],{"class":2601},"\"1\"",[414,17512,2757],{"class":2705},[414,17514,17515,17517,17519,17521],{"class":2593,"line":2625},[414,17516,8945],{"class":2607},[414,17518,7340],{"class":2705},[414,17520,17447],{"class":2601},[414,17522,2757],{"class":2705},[414,17524,17525,17527,17529,17531],{"class":2593,"line":2677},[414,17526,15504],{"class":2607},[414,17528,7340],{"class":2705},[414,17530,17458],{"class":2601},[414,17532,2757],{"class":2705},[414,17534,17535,17537,17539,17541],{"class":2593,"line":2751},[414,17536,17465],{"class":2607},[414,17538,7340],{"class":2705},[414,17540,11362],{"class":2601},[414,17542,2757],{"class":2705},[414,17544,17545,17548,17550],{"class":2593,"line":2760},[414,17546,17547],{"class":2607},"  \"original_format\"",[414,17549,7340],{"class":2705},[414,17551,17552],{"class":2601},"\"single_line_text_field\"\n",[414,17554,17555],{"class":2593,"line":2768},[414,17556,3035],{"class":2705},[19,17558],{},[3629,17560,17562],{"id":17561},"step-3-attach-metadata-to-a-unified-object","Step 3: Attach Metadata to a Unified Object",[2584,17564,17566],{"className":7323,"code":17565,"language":7325,"meta":2433,"style":2433},"PATCH \u002Fcommerce_item\u002F7\n{\n  \"metadata\": [\n    {\n      \"id\": \"1\",\n      \"slug\": \"binding_mount\",\n      \"value\": \"Optimistic\"\n    }\n  ]\n}\n",[36,17567,17568,17576,17580,17586,17590,17601,17612,17622,17626,17630],{"__ignoreMap":2433},[414,17569,17570,17573],{"class":2593,"line":2594},[414,17571,17572],{"class":2705},"PATCH \u002Fcommerce_item\u002F",[414,17574,17575],{"class":2607},"7\n",[414,17577,17578],{"class":2593,"line":2434},[414,17579,8916],{"class":2705},[414,17581,17582,17584],{"class":2593,"line":2613},[414,17583,15666],{"class":2607},[414,17585,8960],{"class":2705},[414,17587,17588],{"class":2593,"line":2625},[414,17589,15559],{"class":2705},[414,17591,17592,17595,17597,17599],{"class":2593,"line":2677},[414,17593,17594],{"class":2607},"      \"id\"",[414,17596,7340],{"class":2705},[414,17598,17510],{"class":2601},[414,17600,2757],{"class":2705},[414,17602,17603,17606,17608,17610],{"class":2593,"line":2751},[414,17604,17605],{"class":2607},"      \"slug\"",[414,17607,7340],{"class":2705},[414,17609,17458],{"class":2601},[414,17611,2757],{"class":2705},[414,17613,17614,17617,17619],{"class":2593,"line":2760},[414,17615,17616],{"class":2607},"      \"value\"",[414,17618,7340],{"class":2705},[414,17620,17621],{"class":2601},"\"Optimistic\"\n",[414,17623,17624],{"class":2593,"line":2768},[414,17625,10535],{"class":2705},[414,17627,17628],{"class":2593,"line":2776},[414,17629,8991],{"class":2705},[414,17631,17632],{"class":2593,"line":2784},[414,17633,3035],{"class":2705},[22,17635,17636],{},"Make sure the id \u002F  slug match the schema created in Step 1.",[3629,17638,17640],{"id":17639},"step-4-review-the-metadata-again","Step 4: Review the Metadata Again",[22,17642,17643],{},"Once the metadata is used in a Unified object, the full record might be updated to look like this:",[2584,17645,17647],{"className":7323,"code":17646,"language":7325,"meta":2433,"style":2433},"GET \u002Fmetadata_metadata\u002F1\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",[36,17648,17649,17655,17659,17669,17679,17689,17699,17710,17721,17727,17738,17742],{"__ignoreMap":2433},[414,17650,17651,17653],{"class":2593,"line":2594},[414,17652,17493],{"class":2705},[414,17654,17496],{"class":2607},[414,17656,17657],{"class":2593,"line":2434},[414,17658,8916],{"class":2705},[414,17660,17661,17663,17665,17667],{"class":2593,"line":2613},[414,17662,17505],{"class":2607},[414,17664,7340],{"class":2705},[414,17666,17510],{"class":2601},[414,17668,2757],{"class":2705},[414,17670,17671,17673,17675,17677],{"class":2593,"line":2625},[414,17672,8945],{"class":2607},[414,17674,7340],{"class":2705},[414,17676,17447],{"class":2601},[414,17678,2757],{"class":2705},[414,17680,17681,17683,17685,17687],{"class":2593,"line":2677},[414,17682,15504],{"class":2607},[414,17684,7340],{"class":2705},[414,17686,17458],{"class":2601},[414,17688,2757],{"class":2705},[414,17690,17691,17693,17695,17697],{"class":2593,"line":2751},[414,17692,17465],{"class":2607},[414,17694,7340],{"class":2705},[414,17696,11362],{"class":2601},[414,17698,2757],{"class":2705},[414,17700,17701,17703,17705,17708],{"class":2593,"line":2760},[414,17702,17547],{"class":2607},[414,17704,7340],{"class":2705},[414,17706,17707],{"class":2601},"\"single_line_text_field\"",[414,17709,2757],{"class":2705},[414,17711,17712,17715,17717,17719],{"class":2593,"line":2768},[414,17713,17714],{"class":2607},"  \"object_type\"",[414,17716,7340],{"class":2705},[414,17718,17072],{"class":2601},[414,17720,2757],{"class":2705},[414,17722,17723,17725],{"class":2593,"line":2776},[414,17724,17197],{"class":2607},[414,17726,10477],{"class":2705},[414,17728,17729,17731,17733,17736],{"class":2593,"line":2784},[414,17730,17204],{"class":2607},[414,17732,10492],{"class":2705},[414,17734,17735],{"class":2601},"\"7\"",[414,17737,9376],{"class":2705},[414,17739,17740],{"class":2593,"line":2792},[414,17741,4032],{"class":2705},[414,17743,17744],{"class":2593,"line":2804},[414,17745,3035],{"class":2705},[22,17747,17748,17749,17751,17752,97],{},"This shows the metadata definition has been associated with the unified object type ",[36,17750,11161],{}," and is linked to object with ID ",[36,17753,17754],{},"7",[19,17756],{},[55,17758,17760],{"id":17759},"crudl-support","CRUDL Support",[22,17762,17763,17764,17767,17768,17770],{},"Full ",[31,17765,17766],{},"Create, Read, Update, Delete, and List"," operations are supported on ",[36,17769,5845],{},". This enables:",[2354,17772,17773,17776,17779],{},[2357,17774,17775],{},"Schema-driven form builders",[2357,17777,17778],{},"Reusable definitions across multiple objects",[2357,17780,17781],{},"Consistent data validation and audit trails",[19,17783],{},[55,17785,17787],{"id":17786},"use-cases","Use Cases",[155,17789,17790,17800],{},[158,17791,17792],{},[161,17793,17794,17797],{},[164,17795,17796],{},"Use Case",[164,17798,17799],{},"Example",[174,17801,17802,17812,17822],{},[161,17803,17804,17807],{},[179,17805,17806],{},"Custom field on ATS Job",[179,17808,17809],{},[36,17810,17811],{},"\"interview_style\": \"technical panel\"",[161,17813,17814,17817],{},[179,17815,17816],{},"Enrich commerce item with specs",[179,17818,17819],{},[36,17820,17821],{},"\"binding_mount\": \"Optimistic\"",[161,17823,17824,17827],{},[179,17825,17826],{},"Add legal identifiers to employee",[179,17828,17829],{},[36,17830,17831],{},"\"national_id\": \"IN123456\"",[4156,17833,17834],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}",{"title":2433,"searchDepth":2434,"depth":2434,"links":17836},[17837,17838,17839,17840,17845,17849,17856,17857],{"id":4425,"depth":2434,"text":4426},{"id":16851,"depth":2434,"text":8629},{"id":16868,"depth":2434,"text":16869},{"id":11171,"depth":2434,"text":17054,"children":17841},[17842,17843,17844],{"id":17057,"depth":2613,"text":17057},{"id":17098,"depth":2613,"text":17098},{"id":17175,"depth":2613,"text":17175},{"id":17244,"depth":2434,"text":17245,"children":17846},[17847],{"id":17257,"depth":2613,"text":17848},"Example: IAtsJob",{"id":17385,"depth":2434,"text":17386,"children":17850},[17851,17853,17854,17855],{"id":17389,"depth":2613,"text":17852},"Step 1: Create a metadata_metadata Definition",{"id":17479,"depth":2613,"text":17480},{"id":17561,"depth":2613,"text":17562},{"id":17639,"depth":2613,"text":17640},{"id":17759,"depth":2434,"text":17760},{"id":17786,"depth":2434,"text":17787},"The metadatametadata object is a powerful addition to the Unified data model. It enables the definition of metadata schemas (custom fields) that can be...",{"img":17860,"date":17861,"updated":17862,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fenriching_unified_objects_with_custom_metadata-icon.webp","2025-07-23T00:00:00.000Z","2026-05-28T13:29:49.639Z","\u002Fguides\u002Fenriching_unified_objects_with_custom_metadata",{"title":16814,"description":17858},"guides\u002Fenriching_unified_objects_with_custom_metadata","4u85FSn1h_d-9fzqji136BRGEiK7FKdVSuhlxoJ1xXg",{"id":17868,"title":17869,"body":17870,"description":18679,"extension":2452,"meta":18680,"navigation":2459,"path":18684,"seo":18685,"stem":18686,"__hash__":18687},"guides\u002Fguides\u002Fenterprise_managed_authorization_ema_with_a_static_key.md","Enterprise-managed authorization (EMA) with a static key",{"type":12,"value":17871,"toc":18666},[17872,17875,17877,17882,17885,17890,17894,17905,17909,17912,17918,17921,17925,17932,17986,17992,18012,18016,18019,18049,18055,18061,18064,18157,18160,18164,18167,18382,18385,18412,18416,18419,18422,18472,18476,18479,18538,18541,18546,18550,18553,18570,18601,18646,18649,18653,18656,18660,18663],[15,17873,17869],{"id":17874},"enterprise-managed-authorization-ema-with-a-static-key",[19,17876],{},[22,17878,17879],{},[25,17880,17881],{},"September 22, 2026",[22,17883,17884],{},"Use a key pair that you generate yourself to sign enterprise-managed authorization assertions. Register only the public key on the trusted issuer, with key source Static Key. Keep the private key on your backend. Unified.to verifies each assertion against that one public key.",[4937,17886,17887],{},[22,17888,17889],{},"⚠️ Paste a PEM that starts with -----BEGIN PUBLIC KEY-----. A PKCS#1 block (-----BEGIN RSA PUBLIC KEY-----) or a private key will fail verification. There is only one registered key, so replacing it stops the previous private key immediately.",[55,17891,17893],{"id":17892},"before-you-start","Before you start",[2354,17895,17896,17899,17902],{},[2357,17897,17898],{},"You are a workspace admin.",[2357,17900,17901],{},"This key source is for assertions you sign. It does not use the workspace secret or a JWKS URL.",[2357,17903,17904],{},"Supported algorithms: RS256, RS384, RS512, PS256, PS384, PS512, ES256, ES384, and ES512. RS256 is the usual choice. HS256 is only for the Workspace secret key source.",[55,17906,17908],{"id":17907},"_1-turn-the-feature-on","1. Turn the feature on",[22,17910,17911],{},"In the app, open Settings, then Enterprise Auth. Turn Enterprise-Managed Authorization on and save.",[22,17913,17914],{},[4201,17915],{"alt":17916,"src":17917},"Screenshot_2026-09-22_at_5.03.31_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fenterprise_managed_authorization_ema_with_a_static_key-0.png",[22,17919,17920],{},"On EU or AU, use api-eu.unified.to or api-au.unified.to. The audience and resource claims later in this guide must use that same host.",[55,17922,17924],{"id":17923},"_2-generate-a-key-pair","2. Generate a key pair",[22,17926,17927,17928,17931],{},"Generate an RSA key on your backend and export the public key in SPKI form. Store ",[36,17929,17930],{},"private.pem"," where your signing code can read it. Do not send it to Unified.to.",[2584,17933,17937],{"className":17934,"code":17935,"language":17936,"meta":2433,"style":2433},"language-shell shiki shiki-themes github-dark github-dark github-light","openssl genpkey -algorithm RSA -pkeyopt rsa_keygen_bits:2048 -out private.pem\nopenssl pkey -in private.pem -pubout -out public.pem\n","shell",[36,17938,17939,17965],{"__ignoreMap":2433},[414,17940,17941,17944,17947,17950,17953,17956,17959,17962],{"class":2593,"line":2594},[414,17942,17943],{"class":2597},"openssl",[414,17945,17946],{"class":2601}," genpkey",[414,17948,17949],{"class":2607}," -algorithm",[414,17951,17952],{"class":2601}," RSA",[414,17954,17955],{"class":2607}," -pkeyopt",[414,17957,17958],{"class":2601}," rsa_keygen_bits:2048",[414,17960,17961],{"class":2607}," -out",[414,17963,17964],{"class":2601}," private.pem\n",[414,17966,17967,17969,17972,17975,17978,17981,17983],{"class":2593,"line":2434},[414,17968,17943],{"class":2597},[414,17970,17971],{"class":2601}," pkey",[414,17973,17974],{"class":2607}," -in",[414,17976,17977],{"class":2601}," private.pem",[414,17979,17980],{"class":2607}," -pubout",[414,17982,17961],{"class":2607},[414,17984,17985],{"class":2601}," public.pem\n",[22,17987,17988,17991],{},[36,17989,17990],{},"public.pem"," is the value you will paste as the static public key. It looks like this:",[2584,17993,17995],{"className":2649,"code":17994,"language":2651,"meta":2652,"style":2433},"-----BEGIN PUBLIC KEY-----\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A...\n-----END PUBLIC KEY-----\n",[36,17996,17997,18002,18007],{"__ignoreMap":2433},[414,17998,17999],{"class":2593,"line":2594},[414,18000,18001],{},"-----BEGIN PUBLIC KEY-----\n",[414,18003,18004],{"class":2593,"line":2434},[414,18005,18006],{},"MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A...\n",[414,18008,18009],{"class":2593,"line":2613},[414,18010,18011],{},"-----END PUBLIC KEY-----\n",[55,18013,18015],{"id":18014},"_3-add-a-trusted-issuer","3. Add a trusted issuer",[22,18017,18018],{},"On Enterprise Auth, choose 'Add trusted issuer' and set:",[2354,18020,18021,18024,18031,18034,18037,18040,18043,18046],{},[2357,18022,18023],{},"Topology: Brokered (ISV)",[2357,18025,18026,18027],{},"Issuer (iss): the exact issuer string you will put in the assertion, for example ",[41,18028,18029],{"href":18029,"rel":18030},"https:\u002F\u002Fyour-app.example",[45],[2357,18032,18033],{},"Key source: Static key",[2357,18035,18036],{},"Static public key (PEM): the full contents of public.pem, including the BEGIN and END lines",[2357,18038,18039],{},"Allowed client IDs: leave blank for a brokered issuer",[2357,18041,18042],{},"Default scopes: the categories the token should receive when the assertion has no scope, for example crm.read",[2357,18044,18045],{},"Just-in-time identity mapping: on, if you want Unified.to to match the assertion email to a workspace user",[2357,18047,18048],{},"Enabled: on",[22,18050,18051],{},[4201,18052],{"alt":18053,"src":18054},"Screenshot_2026-09-22_at_5.13.56_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fenterprise_managed_authorization_ema_with_a_static_key-1.png",[22,18056,18057],{},[4201,18058],{"alt":18059,"src":18060},"Screenshot_2026-09-22_at_5.12.26_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fenterprise_managed_authorization_ema_with_a_static_key-2.png",[22,18062,18063],{},"The same record over the API. Put the PEM in static_public_key as one string, with newline characters:",[2584,18065,18067],{"className":17934,"code":18066,"language":17936,"meta":2433,"style":2433},"curl -X POST https:\u002F\u002Fapi.unified.to\u002Funified\u002Fenterprise-auth\u002Ftrusted-issuers \\\n  -H \"Authorization: Bearer $UNIFIED_WORKSPACE_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"mode\": \"isv_brokered\",\n    \"issuer\": \"https:\u002F\u002Fyour-app.example\",\n    \"key_source\": \"static_key\",\n    \"static_public_key\": \"-----BEGIN PUBLIC KEY-----\\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A...\\n-----END PUBLIC KEY-----\\n\",\n    \"default_scopes\": [\"crm.read\"],\n    \"jit_enabled\": true,\n    \"enabled\": true\n  }'\n",[36,18068,18069,18086,18101,18110,18118,18123,18128,18133,18138,18143,18148,18153],{"__ignoreMap":2433},[414,18070,18071,18074,18077,18080,18083],{"class":2593,"line":2594},[414,18072,18073],{"class":2597},"curl",[414,18075,18076],{"class":2607}," -X",[414,18078,18079],{"class":2601}," POST",[414,18081,18082],{"class":2601}," https:\u002F\u002Fapi.unified.to\u002Funified\u002Fenterprise-auth\u002Ftrusted-issuers",[414,18084,18085],{"class":2607}," \\\n",[414,18087,18088,18091,18094,18097,18099],{"class":2593,"line":2434},[414,18089,18090],{"class":2607},"  -H",[414,18092,18093],{"class":2601}," \"Authorization: Bearer ",[414,18095,18096],{"class":2705},"$UNIFIED_WORKSPACE_API_KEY",[414,18098,7395],{"class":2601},[414,18100,18085],{"class":2607},[414,18102,18103,18105,18108],{"class":2593,"line":2613},[414,18104,18090],{"class":2607},[414,18106,18107],{"class":2601}," \"Content-Type: application\u002Fjson\"",[414,18109,18085],{"class":2607},[414,18111,18112,18115],{"class":2593,"line":2625},[414,18113,18114],{"class":2607},"  -d",[414,18116,18117],{"class":2601}," '{\n",[414,18119,18120],{"class":2593,"line":2677},[414,18121,18122],{"class":2601},"    \"mode\": \"isv_brokered\",\n",[414,18124,18125],{"class":2593,"line":2751},[414,18126,18127],{"class":2601},"    \"issuer\": \"https:\u002F\u002Fyour-app.example\",\n",[414,18129,18130],{"class":2593,"line":2760},[414,18131,18132],{"class":2601},"    \"key_source\": \"static_key\",\n",[414,18134,18135],{"class":2593,"line":2768},[414,18136,18137],{"class":2601},"    \"static_public_key\": \"-----BEGIN PUBLIC KEY-----\\nMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8A...\\n-----END PUBLIC KEY-----\\n\",\n",[414,18139,18140],{"class":2593,"line":2776},[414,18141,18142],{"class":2601},"    \"default_scopes\": [\"crm.read\"],\n",[414,18144,18145],{"class":2593,"line":2784},[414,18146,18147],{"class":2601},"    \"jit_enabled\": true,\n",[414,18149,18150],{"class":2593,"line":2792},[414,18151,18152],{"class":2601},"    \"enabled\": true\n",[414,18154,18155],{"class":2593,"line":2804},[414,18156,5047],{"class":2601},[22,18158,18159],{},"A Direct (XAA) issuer can also use Static key. It still needs a non-empty Allowed client IDs list, and each assertion must include a client_id from that list.",[55,18161,18163],{"id":18162},"_4-sign-an-assertion","4. Sign an assertion",[22,18165,18166],{},"Sign with the private key. The header typ must be oauth-id-jag+jwt. The alg must be one of the algorithms listed above and must match the key (RS256 for the RSA key from step 2).",[2584,18168,18170],{"className":16485,"code":18169,"language":16487,"meta":2433,"style":2433},"const fs = require('fs');\nconst jwt = require('jsonwebtoken');\n\nconst assertion = jwt.sign(\n  {\n    resource: 'https:\u002F\u002Fapi.unified.to',\n    email: 'user@your-customer.com',\n    scope: 'crm.read crm.write',\n    jti: 'assertion-' + Date.now(),\n  },\n  fs.readFileSync('private.pem'),\n  {\n    algorithm: 'RS256',\n    issuer: 'https:\u002F\u002Fyour-app.example',\n    audience: 'https:\u002F\u002Fapi.unified.to',\n    subject: 'customer-user-1',\n    expiresIn: '5m',\n    header: { alg: 'RS256', typ: 'oauth-id-jag+jwt' },\n  }\n);\n",[36,18171,18172,18191,18209,18213,18231,18236,18246,18256,18266,18286,18290,18306,18310,18320,18330,18339,18349,18359,18374,18378],{"__ignoreMap":2433},[414,18173,18174,18176,18179,18181,18184,18186,18189],{"class":2593,"line":2594},[414,18175,2745],{"class":2698},[414,18177,18178],{"class":2607}," fs",[414,18180,2817],{"class":2698},[414,18182,18183],{"class":2597}," require",[414,18185,2968],{"class":2705},[414,18187,18188],{"class":2601},"'fs'",[414,18190,3156],{"class":2705},[414,18192,18193,18195,18198,18200,18202,18204,18207],{"class":2593,"line":2434},[414,18194,2745],{"class":2698},[414,18196,18197],{"class":2607}," jwt",[414,18199,2817],{"class":2698},[414,18201,18183],{"class":2597},[414,18203,2968],{"class":2705},[414,18205,18206],{"class":2601},"'jsonwebtoken'",[414,18208,3156],{"class":2705},[414,18210,18211],{"class":2593,"line":2613},[414,18212,2740],{"emptyLinePlaceholder":2459},[414,18214,18215,18217,18220,18222,18225,18228],{"class":2593,"line":2625},[414,18216,2745],{"class":2698},[414,18218,18219],{"class":2607}," assertion",[414,18221,2817],{"class":2698},[414,18223,18224],{"class":2705}," jwt.",[414,18226,18227],{"class":2597},"sign",[414,18229,18230],{"class":2705},"(\n",[414,18232,18233],{"class":2593,"line":2677},[414,18234,18235],{"class":2705},"  {\n",[414,18237,18238,18241,18244],{"class":2593,"line":2751},[414,18239,18240],{"class":2705},"    resource: ",[414,18242,18243],{"class":2601},"'https:\u002F\u002Fapi.unified.to'",[414,18245,2757],{"class":2705},[414,18247,18248,18251,18254],{"class":2593,"line":2760},[414,18249,18250],{"class":2705},"    email: ",[414,18252,18253],{"class":2601},"'user@your-customer.com'",[414,18255,2757],{"class":2705},[414,18257,18258,18261,18264],{"class":2593,"line":2768},[414,18259,18260],{"class":2705},"    scope: ",[414,18262,18263],{"class":2601},"'crm.read crm.write'",[414,18265,2757],{"class":2705},[414,18267,18268,18271,18274,18277,18280,18283],{"class":2593,"line":2776},[414,18269,18270],{"class":2705},"    jti: ",[414,18272,18273],{"class":2601},"'assertion-'",[414,18275,18276],{"class":2698}," +",[414,18278,18279],{"class":2705}," Date.",[414,18281,18282],{"class":2597},"now",[414,18284,18285],{"class":2705},"(),\n",[414,18287,18288],{"class":2593,"line":2784},[414,18289,16052],{"class":2705},[414,18291,18292,18295,18298,18300,18303],{"class":2593,"line":2792},[414,18293,18294],{"class":2705},"  fs.",[414,18296,18297],{"class":2597},"readFileSync",[414,18299,2968],{"class":2705},[414,18301,18302],{"class":2601},"'private.pem'",[414,18304,18305],{"class":2705},"),\n",[414,18307,18308],{"class":2593,"line":2804},[414,18309,18235],{"class":2705},[414,18311,18312,18315,18318],{"class":2593,"line":2809},[414,18313,18314],{"class":2705},"    algorithm: ",[414,18316,18317],{"class":2601},"'RS256'",[414,18319,2757],{"class":2705},[414,18321,18322,18325,18328],{"class":2593,"line":2829},[414,18323,18324],{"class":2705},"    issuer: ",[414,18326,18327],{"class":2601},"'https:\u002F\u002Fyour-app.example'",[414,18329,2757],{"class":2705},[414,18331,18332,18335,18337],{"class":2593,"line":2843},[414,18333,18334],{"class":2705},"    audience: ",[414,18336,18243],{"class":2601},[414,18338,2757],{"class":2705},[414,18340,18341,18344,18347],{"class":2593,"line":2849},[414,18342,18343],{"class":2705},"    subject: ",[414,18345,18346],{"class":2601},"'customer-user-1'",[414,18348,2757],{"class":2705},[414,18350,18351,18354,18357],{"class":2593,"line":2854},[414,18352,18353],{"class":2705},"    expiresIn: ",[414,18355,18356],{"class":2601},"'5m'",[414,18358,2757],{"class":2705},[414,18360,18361,18364,18366,18369,18372],{"class":2593,"line":2880},[414,18362,18363],{"class":2705},"    header: { alg: ",[414,18365,18317],{"class":2601},[414,18367,18368],{"class":2705},", typ: ",[414,18370,18371],{"class":2601},"'oauth-id-jag+jwt'",[414,18373,2840],{"class":2705},[414,18375,18376],{"class":2593,"line":3253},[414,18377,4032],{"class":2705},[414,18379,18380],{"class":2593,"line":3261},[414,18381,3156],{"class":2705},[22,18383,18384],{},"Required claims:",[2354,18386,18387,18390,18397,18400,18403,18406,18409],{},[2357,18388,18389],{},"iss matches the trusted issuer string exactly",[2357,18391,18392,18393],{},"aud is the API origin, such as ",[41,18394,18395],{"href":18395,"rel":18396},"https:\u002F\u002Fapi.unified.to",[45],[2357,18398,18399],{},"resource is that same origin for REST calls, or that origin plus \u002Fmcp for MCP calls. A token for one resource is rejected by the other",[2357,18401,18402],{},"sub is the end user id in your app",[2357,18404,18405],{},"jti is unique for each redemption. The test panel does not consume jti",[2357,18407,18408],{},"scope is space-separated, such as crm.read crm.write. A comma-separated list is treated as one unknown scope and dropped",[2357,18410,18411],{},"email is a user who already belongs to the workspace, when just-in-time mapping is on",[55,18413,18415],{"id":18414},"_5-test-then-exchange","5. Test, then exchange",[22,18417,18418],{},"On the issuer row, choose Test and paste the assertion. A passing trace means the signature, issuer, audience, resource, and identity checks succeeded. Test does not issue a token.",[22,18420,18421],{},"Exchange the assertion once at the token endpoint. The access_token starts with ema_. Send it as Authorization: Bearer on integration data routes. It can call only the categories in its scopes. It cannot manage the workspace or create API keys.",[2584,18423,18425],{"className":17934,"code":18424,"language":17936,"meta":2433,"style":2433},"curl -X POST https:\u002F\u002Fapi.unified.to\u002Foauth\u002Ftoken \\\n  -H \"Content-Type: application\u002Fx-www-form-urlencoded\" \\\n  -d \"grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer\" \\\n  --data-urlencode \"assertion=$ASSERTION\"\n",[36,18426,18427,18440,18449,18458],{"__ignoreMap":2433},[414,18428,18429,18431,18433,18435,18438],{"class":2593,"line":2594},[414,18430,18073],{"class":2597},[414,18432,18076],{"class":2607},[414,18434,18079],{"class":2601},[414,18436,18437],{"class":2601}," https:\u002F\u002Fapi.unified.to\u002Foauth\u002Ftoken",[414,18439,18085],{"class":2607},[414,18441,18442,18444,18447],{"class":2593,"line":2434},[414,18443,18090],{"class":2607},[414,18445,18446],{"class":2601}," \"Content-Type: application\u002Fx-www-form-urlencoded\"",[414,18448,18085],{"class":2607},[414,18450,18451,18453,18456],{"class":2593,"line":2613},[414,18452,18114],{"class":2607},[414,18454,18455],{"class":2601}," \"grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer\"",[414,18457,18085],{"class":2607},[414,18459,18460,18463,18466,18469],{"class":2593,"line":2625},[414,18461,18462],{"class":2607},"  --data-urlencode",[414,18464,18465],{"class":2601}," \"assertion=",[414,18467,18468],{"class":2705},"$ASSERTION",[414,18470,18471],{"class":2601},"\"\n",[3629,18473,18475],{"id":18474},"what-comes-back","What comes back",[22,18477,18478],{},"The signed JWT is only the assertion. Do not put ema_ in front of it. Unified.to mints a separate opaque access token and returns it already prefixed.",[2584,18480,18482],{"className":7323,"code":18481,"language":7325,"meta":2433,"style":2433},"{\n  \"access_token\": \"ema_…\",\n  \"token_type\": \"Bearer\",\n  \"expires_in\": 3600,\n  \"scope\": \"crm.read crm.write\"\n}\n",[36,18483,18484,18488,18500,18512,18524,18534],{"__ignoreMap":2433},[414,18485,18486],{"class":2593,"line":2594},[414,18487,8916],{"class":2705},[414,18489,18490,18493,18495,18498],{"class":2593,"line":2434},[414,18491,18492],{"class":2607},"  \"access_token\"",[414,18494,7340],{"class":2705},[414,18496,18497],{"class":2601},"\"ema_…\"",[414,18499,2757],{"class":2705},[414,18501,18502,18505,18507,18510],{"class":2593,"line":2613},[414,18503,18504],{"class":2607},"  \"token_type\"",[414,18506,7340],{"class":2705},[414,18508,18509],{"class":2601},"\"Bearer\"",[414,18511,2757],{"class":2705},[414,18513,18514,18517,18519,18522],{"class":2593,"line":2625},[414,18515,18516],{"class":2607},"  \"expires_in\"",[414,18518,7340],{"class":2705},[414,18520,18521],{"class":2607},"3600",[414,18523,2757],{"class":2705},[414,18525,18526,18529,18531],{"class":2593,"line":2677},[414,18527,18528],{"class":2607},"  \"scope\"",[414,18530,7340],{"class":2705},[414,18532,18533],{"class":2601},"\"crm.read crm.write\"\n",[414,18535,18536],{"class":2593,"line":2751},[414,18537,3035],{"class":2705},[22,18539,18540],{},"Sign a new assertion for every exchange. The same jti is rejected as a replay. The Test button checks the assertion and does not return an access token, and it does not consume jti.",[4937,18542,18543],{},[22,18544,18545],{},"⚠️ The token endpoint requires the workspace Enterprise Auth switch to be on. Test still runs when that switch is off. A disabled switch returns issuer not trusted.",[3629,18547,18549],{"id":18548},"call-the-api-or-mcp","Call the API or MCP",[22,18551,18552],{},"The resource claim on the assertion chooses where this access token works. One token does not work for both. Send it as Authorization: Bearer followed by the access_token value.",[2354,18554,18555,18562],{},[2357,18556,18557,18558,18561],{},"REST API: set resource to ",[41,18559,18395],{"href":18395,"rel":18560},[45]," (or the EU or AU host). The token is accepted only on integration data routes such as GET \u002Fstorage\u002F{connection_id}\u002Ffile, and only when the scope matches the category and the method (storage.read for GET, storage.write for writes).",[2357,18563,18564,18565,18569],{},"MCP: set resource to that same origin plus \u002Fmcp, for example ",[41,18566,18567],{"href":18567,"rel":18568},"https:\u002F\u002Fapi.unified.to\u002Fmcp",[45],". Send the bearer token to the MCP server. Add ?connection={connection_id} to run the call against one connection in the workspace.",[2584,18571,18573],{"className":17934,"code":18572,"language":17936,"meta":2433,"style":2433},"curl https:\u002F\u002Fapi.unified.to\u002Fstorage\u002F$CONNECTION_ID\u002Ffile \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\"\n",[36,18574,18575,18590],{"__ignoreMap":2433},[414,18576,18577,18579,18582,18585,18588],{"class":2593,"line":2594},[414,18578,18073],{"class":2597},[414,18580,18581],{"class":2601}," https:\u002F\u002Fapi.unified.to\u002Fstorage\u002F",[414,18583,18584],{"class":2705},"$CONNECTION_ID",[414,18586,18587],{"class":2601},"\u002Ffile",[414,18589,18085],{"class":2607},[414,18591,18592,18594,18596,18599],{"class":2593,"line":2434},[414,18593,18090],{"class":2607},[414,18595,18093],{"class":2601},[414,18597,18598],{"class":2705},"$ACCESS_TOKEN",[414,18600,18471],{"class":2601},[2584,18602,18604],{"className":17934,"code":18603,"language":17936,"meta":2433,"style":2433},"curl \"https:\u002F\u002Fapi.unified.to\u002Fmcp?connection=$CONNECTION_ID\" \\\n  -H \"Authorization: Bearer $ACCESS_TOKEN\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{ \"jsonrpc\": \"2.0\", \"id\": 1, \"method\": \"tools\u002Flist\" }'\n",[36,18605,18606,18619,18631,18639],{"__ignoreMap":2433},[414,18607,18608,18610,18613,18615,18617],{"class":2593,"line":2594},[414,18609,18073],{"class":2597},[414,18611,18612],{"class":2601}," \"https:\u002F\u002Fapi.unified.to\u002Fmcp?connection=",[414,18614,18584],{"class":2705},[414,18616,7395],{"class":2601},[414,18618,18085],{"class":2607},[414,18620,18621,18623,18625,18627,18629],{"class":2593,"line":2434},[414,18622,18090],{"class":2607},[414,18624,18093],{"class":2601},[414,18626,18598],{"class":2705},[414,18628,7395],{"class":2601},[414,18630,18085],{"class":2607},[414,18632,18633,18635,18637],{"class":2593,"line":2613},[414,18634,18090],{"class":2607},[414,18636,18107],{"class":2601},[414,18638,18085],{"class":2607},[414,18640,18641,18643],{"class":2593,"line":2625},[414,18642,18114],{"class":2607},[414,18644,18645],{"class":2601}," '{ \"jsonrpc\": \"2.0\", \"id\": 1, \"method\": \"tools\u002Flist\" }'\n",[22,18647,18648],{},"A REST token sent to MCP is refused, and an MCP token sent to the REST API returns token issued for another resource. These tokens cannot manage the workspace, create API keys, or change enterprise-auth settings.",[55,18650,18652],{"id":18651},"_6-map-the-user","6. Map the user",[22,18654,18655],{},"The trusted issuer does not store a user id. Each assertion subject gets an identity row. With just-in-time mapping on, Unified.to sets the workspace user id when email matches a user in the workspace. Otherwise the row stays unmapped. Open Identities, choose Map on that subject, and enter the workspace user id. The identity row is created only after an assertion passes signature verification.",[55,18657,18659],{"id":18658},"rotating-the-key","Rotating the key",[22,18661,18662],{},"Generate a new pair, then edit the trusted issuer and replace Static public key with the new public PEM. Assertions signed by the old private key fail as soon as you save. To rotate without a gap, switch the issuer to key source JWKS and publish both keys at jwks_uri.",[4156,18664,18665],{},"html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}",{"title":2433,"searchDepth":2434,"depth":2434,"links":18667},[18668,18669,18670,18671,18672,18673,18677,18678],{"id":17892,"depth":2434,"text":17893},{"id":17907,"depth":2434,"text":17908},{"id":17923,"depth":2434,"text":17924},{"id":18014,"depth":2434,"text":18015},{"id":18162,"depth":2434,"text":18163},{"id":18414,"depth":2434,"text":18415,"children":18674},[18675,18676],{"id":18474,"depth":2613,"text":18475},{"id":18548,"depth":2613,"text":18549},{"id":18651,"depth":2434,"text":18652},{"id":18658,"depth":2434,"text":18659},"Use a key pair that you generate yourself to sign enterprise-managed authorization assertions. Register only the public key on the trusted issuer, with key...",{"img":18681,"date":18682,"updated":18683,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fenterprise_managed_authorization_ema_with_a_static_key-icon.png","2026-09-22T00:00:00.000Z","2026-10-02T16:57:40.654Z","\u002Fguides\u002Fenterprise_managed_authorization_ema_with_a_static_key",{"title":17869,"description":18679},"guides\u002Fenterprise_managed_authorization_ema_with_a_static_key","T_wuyvlE0UI-hsKU4RQwtHv__NsiMNEfZSrSyM6mvOE",{"id":18689,"title":18690,"body":18691,"description":19305,"extension":2452,"meta":19306,"navigation":2459,"path":19308,"seo":19309,"stem":19310,"__hash__":19311},"guides\u002Fguides\u002Fenterprise_managed_authorization_ema_with_a_workspace_secret.md","Enterprise-managed authorization (EMA) with a workspace secret",{"type":12,"value":18692,"toc":19294},[18693,18696,18698,18702,18705,18710,18712,18726,18728,18730,18735,18745,18749,18752,18794,18799,18802,18874,18878,18892,19052,19054,19089,19093,19095,19097,19139,19141,19143,19193,19195,19199,19201,19203,19215,19241,19283,19285,19289,19291],[15,18694,18690],{"id":18695},"enterprise-managed-authorization-ema-with-a-workspace-secret",[19,18697],{},[22,18699,18700],{},[25,18701,17881],{},[22,18703,18704],{},"Use your workspace signing secret to sign enterprise-managed authorization assertions. This is the brokered setup: your app signs a short-lived JWT, and Unified.to checks it with the workspace jwt_secret. Your customers do not configure Unified.to in their identity provider.",[4937,18706,18707],{},[22,18708,18709],{},"⚠️ The secret shown by Copy on the API keys page is not the signing key. That value is a JWT used for webhook signatures. Assertions must be signed with jwt_secret, a separate hex string on the workspace.",[55,18711,17893],{"id":17892},[2354,18713,18714,18716,18719],{},[2357,18715,17898],{},[2357,18717,18718],{},"Enterprise-managed authorization is for brokered issuers. Direct (XAA) issuers use a JWKS URL and a client ID allowlist, not the workspace secret.",[2357,18720,18721,18722,18725],{},"Regenerating the workspace secret creates ",[36,18723,18724],{},"jwt_secret",". It also rotates the webhook signing secret, so existing webhook signature checks must be updated.",[55,18727,17908],{"id":17907},[22,18729,17911],{},[22,18731,18732],{},[4201,18733],{"alt":17916,"src":18734},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fenterprise_managed_authorization_ema_with_a_workspace_secret-0.png",[22,18736,18737,18738,4149,18741,18744],{},"On EU or AU, use ",[36,18739,18740],{},"api-eu.unified.to",[36,18742,18743],{},"api-au.unified.to",". The audience and resource claims later in this guide must use that same host.",[55,18746,18748],{"id":18747},"_2-add-a-trusted-issuer","2. Add a trusted issuer",[22,18750,18751],{},"On Enterprise Auth, choose Add trusted issuer and set:",[2354,18753,18754,18760,18769,18775,18778,18784,18786],{},[2357,18755,18756,18757],{},"Topology: ",[36,18758,18759],{},"Brokered (ISV)",[2357,18761,18762,18763,18766,18767],{},"Issuer (",[36,18764,18765],{},"iss","): the exact issuer string you will put in the assertion, for example ",[36,18768,18029],{},[2357,18770,18771,18772],{},"Key source: ",[36,18773,18774],{},"Workspace secret",[2357,18776,18777],{},"Allowed client IDs: leave blank",[2357,18779,18780,18781],{},"Default scopes: the categories the token should receive when the assertion has no scope, for example ",[36,18782,18783],{},"crm.read",[2357,18785,18045],{},[2357,18787,18048,18788,18790],{},[5888,18789],{},[4201,18791],{"alt":18792,"src":18793},"Screenshot_2026-10-01_at_11.02.09_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fenterprise_managed_authorization_ema_with_a_workspace_secret-1.png",[22,18795,18796],{},[4201,18797],{"alt":18059,"src":18798},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fenterprise_managed_authorization_ema_with_a_workspace_secret-2.png",[22,18800,18801],{},"The same record over the API:",[2584,18803,18805],{"className":17934,"code":18804,"language":17936,"meta":2433,"style":2433},"curl -X POST https:\u002F\u002Fapi.unified.to\u002Funified\u002Fenterprise-auth\u002Ftrusted-issuers \\\n  -H \"Authorization: Bearer $UNIFIED_WORKSPACE_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"mode\": \"isv_brokered\",\n    \"issuer\": \"https:\u002F\u002Fyour-app.example\",\n    \"key_source\": \"workspace_secret\",\n    \"default_scopes\": [\"crm.read\"],\n    \"jit_enabled\": true,\n    \"enabled\": true\n  }'\n",[36,18806,18807,18819,18831,18839,18845,18849,18853,18858,18862,18866,18870],{"__ignoreMap":2433},[414,18808,18809,18811,18813,18815,18817],{"class":2593,"line":2594},[414,18810,18073],{"class":2597},[414,18812,18076],{"class":2607},[414,18814,18079],{"class":2601},[414,18816,18082],{"class":2601},[414,18818,18085],{"class":2607},[414,18820,18821,18823,18825,18827,18829],{"class":2593,"line":2434},[414,18822,18090],{"class":2607},[414,18824,18093],{"class":2601},[414,18826,18096],{"class":2705},[414,18828,7395],{"class":2601},[414,18830,18085],{"class":2607},[414,18832,18833,18835,18837],{"class":2593,"line":2613},[414,18834,18090],{"class":2607},[414,18836,18107],{"class":2601},[414,18838,18085],{"class":2607},[414,18840,18841,18843],{"class":2593,"line":2625},[414,18842,18114],{"class":2607},[414,18844,18117],{"class":2601},[414,18846,18847],{"class":2593,"line":2677},[414,18848,18122],{"class":2601},[414,18850,18851],{"class":2593,"line":2751},[414,18852,18127],{"class":2601},[414,18854,18855],{"class":2593,"line":2760},[414,18856,18857],{"class":2601},"    \"key_source\": \"workspace_secret\",\n",[414,18859,18860],{"class":2593,"line":2768},[414,18861,18142],{"class":2601},[414,18863,18864],{"class":2593,"line":2776},[414,18865,18147],{"class":2601},[414,18867,18868],{"class":2593,"line":2784},[414,18869,18152],{"class":2601},[414,18871,18872],{"class":2593,"line":2792},[414,18873,5047],{"class":2601},[55,18875,18877],{"id":18876},"_3-sign-an-assertion","3. Sign an assertion",[22,18879,18880,18881,18883,18884,18887,18888,18891],{},"Sign with HS256 and ",[36,18882,18724],{},". The header ",[36,18885,18886],{},"typ"," must be ",[36,18889,18890],{},"oauth-id-jag+jwt",". A plain JWT type is rejected.",[2584,18893,18895],{"className":16485,"code":18894,"language":16487,"meta":2433,"style":2433},"const jwt = require('jsonwebtoken');\n\nconst assertion = jwt.sign(\n  {\n    resource: 'https:\u002F\u002Fapi.unified.to',\n    email: 'user@your-customer.com',\n    scope: 'crm.read crm.write',\n    jti: 'assertion-' + Date.now(),\n  },\n  process.env.WORKSPACE_JWT_SECRET,\n  {\n    algorithm: 'HS256',\n    issuer: 'https:\u002F\u002Fyour-app.example',\n    audience: 'https:\u002F\u002Fapi.unified.to',\n    subject: 'customer-user-1',\n    expiresIn: '5m',\n    header: { alg: 'HS256', typ: 'oauth-id-jag+jwt' },\n  }\n);\n",[36,18896,18897,18913,18917,18931,18935,18943,18951,18959,18973,18977,18987,18991,19000,19008,19016,19024,19032,19044,19048],{"__ignoreMap":2433},[414,18898,18899,18901,18903,18905,18907,18909,18911],{"class":2593,"line":2594},[414,18900,2745],{"class":2698},[414,18902,18197],{"class":2607},[414,18904,2817],{"class":2698},[414,18906,18183],{"class":2597},[414,18908,2968],{"class":2705},[414,18910,18206],{"class":2601},[414,18912,3156],{"class":2705},[414,18914,18915],{"class":2593,"line":2434},[414,18916,2740],{"emptyLinePlaceholder":2459},[414,18918,18919,18921,18923,18925,18927,18929],{"class":2593,"line":2613},[414,18920,2745],{"class":2698},[414,18922,18219],{"class":2607},[414,18924,2817],{"class":2698},[414,18926,18224],{"class":2705},[414,18928,18227],{"class":2597},[414,18930,18230],{"class":2705},[414,18932,18933],{"class":2593,"line":2625},[414,18934,18235],{"class":2705},[414,18936,18937,18939,18941],{"class":2593,"line":2677},[414,18938,18240],{"class":2705},[414,18940,18243],{"class":2601},[414,18942,2757],{"class":2705},[414,18944,18945,18947,18949],{"class":2593,"line":2751},[414,18946,18250],{"class":2705},[414,18948,18253],{"class":2601},[414,18950,2757],{"class":2705},[414,18952,18953,18955,18957],{"class":2593,"line":2760},[414,18954,18260],{"class":2705},[414,18956,18263],{"class":2601},[414,18958,2757],{"class":2705},[414,18960,18961,18963,18965,18967,18969,18971],{"class":2593,"line":2768},[414,18962,18270],{"class":2705},[414,18964,18273],{"class":2601},[414,18966,18276],{"class":2698},[414,18968,18279],{"class":2705},[414,18970,18282],{"class":2597},[414,18972,18285],{"class":2705},[414,18974,18975],{"class":2593,"line":2776},[414,18976,16052],{"class":2705},[414,18978,18979,18982,18985],{"class":2593,"line":2784},[414,18980,18981],{"class":2705},"  process.env.",[414,18983,18984],{"class":2607},"WORKSPACE_JWT_SECRET",[414,18986,2757],{"class":2705},[414,18988,18989],{"class":2593,"line":2792},[414,18990,18235],{"class":2705},[414,18992,18993,18995,18998],{"class":2593,"line":2804},[414,18994,18314],{"class":2705},[414,18996,18997],{"class":2601},"'HS256'",[414,18999,2757],{"class":2705},[414,19001,19002,19004,19006],{"class":2593,"line":2809},[414,19003,18324],{"class":2705},[414,19005,18327],{"class":2601},[414,19007,2757],{"class":2705},[414,19009,19010,19012,19014],{"class":2593,"line":2829},[414,19011,18334],{"class":2705},[414,19013,18243],{"class":2601},[414,19015,2757],{"class":2705},[414,19017,19018,19020,19022],{"class":2593,"line":2843},[414,19019,18343],{"class":2705},[414,19021,18346],{"class":2601},[414,19023,2757],{"class":2705},[414,19025,19026,19028,19030],{"class":2593,"line":2849},[414,19027,18353],{"class":2705},[414,19029,18356],{"class":2601},[414,19031,2757],{"class":2705},[414,19033,19034,19036,19038,19040,19042],{"class":2593,"line":2854},[414,19035,18363],{"class":2705},[414,19037,18997],{"class":2601},[414,19039,18368],{"class":2705},[414,19041,18371],{"class":2601},[414,19043,2840],{"class":2705},[414,19045,19046],{"class":2593,"line":2880},[414,19047,4032],{"class":2705},[414,19049,19050],{"class":2593,"line":3253},[414,19051,3156],{"class":2705},[22,19053,18384],{},[2354,19055,19056,19061,19070,19072,19074,19080,19087],{},[2357,19057,19058,19060],{},[36,19059,18765],{}," matches the trusted issuer string exactly",[2357,19062,19063,19066,19067],{},[36,19064,19065],{},"aud"," is the API origin, such as ",[41,19068,18395],{"href":18395,"rel":19069},[45],[2357,19071,18399],{},[2357,19073,18402],{},[2357,19075,19076,19079],{},[36,19077,19078],{},"jti"," is unique for each redemption. The test panel does not consume jti",[2357,19081,19082,19083,19086],{},"scope is space-separated, such as ",[36,19084,19085],{},"crm.read crm.write",". A comma-separated list is treated as one unknown scope and dropped",[2357,19088,18411],{},[55,19090,19092],{"id":19091},"_4-test-then-exchange","4. Test, then exchange",[22,19094,18418],{},[22,19096,18421],{},[2584,19098,19099],{"className":17934,"code":18424,"language":17936,"meta":2433,"style":2433},[36,19100,19101,19113,19121,19129],{"__ignoreMap":2433},[414,19102,19103,19105,19107,19109,19111],{"class":2593,"line":2594},[414,19104,18073],{"class":2597},[414,19106,18076],{"class":2607},[414,19108,18079],{"class":2601},[414,19110,18437],{"class":2601},[414,19112,18085],{"class":2607},[414,19114,19115,19117,19119],{"class":2593,"line":2434},[414,19116,18090],{"class":2607},[414,19118,18446],{"class":2601},[414,19120,18085],{"class":2607},[414,19122,19123,19125,19127],{"class":2593,"line":2613},[414,19124,18114],{"class":2607},[414,19126,18455],{"class":2601},[414,19128,18085],{"class":2607},[414,19130,19131,19133,19135,19137],{"class":2593,"line":2625},[414,19132,18462],{"class":2607},[414,19134,18465],{"class":2601},[414,19136,18468],{"class":2705},[414,19138,18471],{"class":2601},[3629,19140,18475],{"id":18474},[22,19142,18478],{},[2584,19144,19145],{"className":7323,"code":18481,"language":7325,"meta":2433,"style":2433},[36,19146,19147,19151,19161,19171,19181,19189],{"__ignoreMap":2433},[414,19148,19149],{"class":2593,"line":2594},[414,19150,8916],{"class":2705},[414,19152,19153,19155,19157,19159],{"class":2593,"line":2434},[414,19154,18492],{"class":2607},[414,19156,7340],{"class":2705},[414,19158,18497],{"class":2601},[414,19160,2757],{"class":2705},[414,19162,19163,19165,19167,19169],{"class":2593,"line":2613},[414,19164,18504],{"class":2607},[414,19166,7340],{"class":2705},[414,19168,18509],{"class":2601},[414,19170,2757],{"class":2705},[414,19172,19173,19175,19177,19179],{"class":2593,"line":2625},[414,19174,18516],{"class":2607},[414,19176,7340],{"class":2705},[414,19178,18521],{"class":2607},[414,19180,2757],{"class":2705},[414,19182,19183,19185,19187],{"class":2593,"line":2677},[414,19184,18528],{"class":2607},[414,19186,7340],{"class":2705},[414,19188,18533],{"class":2601},[414,19190,19191],{"class":2593,"line":2751},[414,19192,3035],{"class":2705},[22,19194,18540],{},[4937,19196,19197],{},[22,19198,18545],{},[3629,19200,18549],{"id":18548},[22,19202,18552],{},[2354,19204,19205,19210],{},[2357,19206,18557,19207,18561],{},[41,19208,18395],{"href":18395,"rel":19209},[45],[2357,19211,18564,19212,18569],{},[41,19213,18567],{"href":18567,"rel":19214},[45],[2584,19216,19217],{"className":17934,"code":18572,"language":17936,"meta":2433,"style":2433},[36,19218,19219,19231],{"__ignoreMap":2433},[414,19220,19221,19223,19225,19227,19229],{"class":2593,"line":2594},[414,19222,18073],{"class":2597},[414,19224,18581],{"class":2601},[414,19226,18584],{"class":2705},[414,19228,18587],{"class":2601},[414,19230,18085],{"class":2607},[414,19232,19233,19235,19237,19239],{"class":2593,"line":2434},[414,19234,18090],{"class":2607},[414,19236,18093],{"class":2601},[414,19238,18598],{"class":2705},[414,19240,18471],{"class":2601},[2584,19242,19243],{"className":17934,"code":18603,"language":17936,"meta":2433,"style":2433},[36,19244,19245,19257,19269,19277],{"__ignoreMap":2433},[414,19246,19247,19249,19251,19253,19255],{"class":2593,"line":2594},[414,19248,18073],{"class":2597},[414,19250,18612],{"class":2601},[414,19252,18584],{"class":2705},[414,19254,7395],{"class":2601},[414,19256,18085],{"class":2607},[414,19258,19259,19261,19263,19265,19267],{"class":2593,"line":2434},[414,19260,18090],{"class":2607},[414,19262,18093],{"class":2601},[414,19264,18598],{"class":2705},[414,19266,7395],{"class":2601},[414,19268,18085],{"class":2607},[414,19270,19271,19273,19275],{"class":2593,"line":2613},[414,19272,18090],{"class":2607},[414,19274,18107],{"class":2601},[414,19276,18085],{"class":2607},[414,19278,19279,19281],{"class":2593,"line":2625},[414,19280,18114],{"class":2607},[414,19282,18645],{"class":2601},[22,19284,18648],{},[55,19286,19288],{"id":19287},"_5-map-the-user","5. Map the user",[22,19290,18655],{},[4156,19292,19293],{},"html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}",{"title":2433,"searchDepth":2434,"depth":2434,"links":19295},[19296,19297,19298,19299,19300,19304],{"id":17892,"depth":2434,"text":17893},{"id":17907,"depth":2434,"text":17908},{"id":18747,"depth":2434,"text":18748},{"id":18876,"depth":2434,"text":18877},{"id":19091,"depth":2434,"text":19092,"children":19301},[19302,19303],{"id":18474,"depth":2613,"text":18475},{"id":18548,"depth":2613,"text":18549},{"id":19287,"depth":2434,"text":19288},"Use your workspace signing secret to sign enterprise-managed authorization assertions. This is the brokered setup, your app signs a short-lived JWT, and...",{"img":7949,"date":18682,"updated":19307,"tag":2457,"integrations":3},"2026-10-01T15:04:22.086Z","\u002Fguides\u002Fenterprise_managed_authorization_ema_with_a_workspace_secret",{"title":18690,"description":19305},"guides\u002Fenterprise_managed_authorization_ema_with_a_workspace_secret","1M3l8zhg-T7advf0u_PXUvcRDjk30Q1Yx1R5SoBkO_E",{"id":19313,"title":19314,"body":19315,"description":19847,"extension":2452,"meta":19848,"navigation":2459,"path":19852,"seo":19853,"stem":19854,"__hash__":19855},"guides\u002Fguides\u002Fenterprise_managed_authorization_ema_with_microsoft_entra_id.md","Enterprise-managed authorization (EMA) with Microsoft Entra ID",{"type":12,"value":19316,"toc":19833},[19317,19320,19322,19327,19330,19335,19337,19358,19360,19362,19365,19369,19372,19386,19389,19398,19400,19402,19441,19443,19519,19522,19526,19529,19554,19556,19559,19562,19615,19617,19620,19672,19676,19678,19680,19694,19697,19699,19702,19706,19709,19782,19786,19830],[15,19318,19314],{"id":19319},"enterprise-managed-authorization-ema-with-microsoft-entra-id",[19,19321],{},[22,19323,19324],{},[25,19325,19326],{},"September 24, 2026",[22,19328,19329],{},"Register a Microsoft Entra ID tenant as a trusted issuer so Entra signs the enterprise-managed authorization assertion. Unified.to checks that signature against the tenant's keys and returns an access token for the end user. Add one trusted issuer per Entra tenant.",[4937,19331,19332],{},[22,19333,19334],{},"⚠️ Direct mode accepts an ID-JAG only. The JWT header typ must be oauth-id-jag+jwt. A normal Entra access token or ID token is rejected. Entra does not generally issue that grant yet. If you only have ordinary Entra sign-in, use the brokered setup at the end of this guide. In that setup Entra is the login directory, and your own issuer is the trusted issuer.",[55,19336,17893],{"id":17892},[2354,19338,19339,19341,19344,19347],{},[2357,19340,17898],{},[2357,19342,19343],{},"You can open the Entra admin center for the customer tenant.",[2357,19345,19346],{},"You have the tenant (directory) id and the application (client) id of the app that will request tokens. These are different ids.",[2357,19348,19349,19350,19354],{},"The issuer string is the Entra v2 issuer, including \u002Fv2.0. ",[41,19351,19352],{"href":19352,"rel":19353},"https:\u002F\u002Fsts.windows.net\u002F",[45],[19355,19356,19357],"tenant-id",{},"\u002F does not match.",[55,19359,17908],{"id":17907},[22,19361,17911],{},[22,19363,19364],{},"On EU or AU, use api-eu.unified.to or api-au.unified.to. The audience and resource claims later in this guide must use that same host. The examples below use the US host.",[55,19366,19368],{"id":19367},"_2-copy-the-ids-from-entra","2. Copy the ids from Entra",[22,19370,19371],{},"In the Entra admin center, open the tenant and the app registration that will request tokens for Unified.to.",[2354,19373,19374,19380],{},[2357,19375,19376,19379],{},[31,19377,19378],{},"Tenant id"," — Entra ID, Overview. This is the directory id. It goes in the issuer URL.",[2357,19381,19382,19385],{},[31,19383,19384],{},"Application (client) id"," — the requesting app. It goes in Allowed client IDs. A direct issuer with an empty list is rejected.",[22,19387,19388],{},"The issuer you will register is:",[2584,19390,19392],{"className":2649,"code":19391,"language":2651,"meta":2652,"style":2433},"https:\u002F\u002Flogin.microsoftonline.com\u002F\u003Ctenant-id>\u002Fv2.0\n",[36,19393,19394],{"__ignoreMap":2433},[414,19395,19396],{"class":2593,"line":2594},[414,19397,19391],{},[55,19399,18015],{"id":18014},[22,19401,18018],{},[2354,19403,19404,19407,19417,19420,19429,19432,19434,19437,19439],{},[2357,19405,19406],{},"Topology: Direct (XAA)",[2357,19408,19409,19410,19414],{},"Issuer (iss): ",[41,19411,19412],{"href":19412,"rel":19413},"https:\u002F\u002Flogin.microsoftonline.com\u002F",[45],[19355,19415,19416],{},"\u002Fv2.0",[2357,19418,19419],{},"Key source: JWKS",[2357,19421,19422,19423,19426],{},"JWKS URL: leave blank. Unified.to loads the keys from the tenant's OpenID configuration. To set it yourself, use ",[41,19424,19412],{"href":19412,"rel":19425},[45],[19355,19427,19428],{},"\u002Fdiscovery\u002Fv2.0\u002Fkeys",[2357,19430,19431],{},"Allowed client IDs: the Entra application (client) id. Required for a direct issuer.",[2357,19433,18042],{},[2357,19435,19436],{},"Environment: optional. Set it when tokens from this tenant must stay in one connection environment, such as Production",[2357,19438,18045],{},[2357,19440,18048],{},[22,19442,18801],{},[2584,19444,19446],{"className":17934,"code":19445,"language":17936,"meta":2433,"style":2433},"curl -X POST https:\u002F\u002Fapi.unified.to\u002Funified\u002Fenterprise-auth\u002Ftrusted-issuers \\\n  -H \"Authorization: Bearer $UNIFIED_WORKSPACE_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"mode\": \"direct_xaa\",\n    \"issuer\": \"https:\u002F\u002Flogin.microsoftonline.com\u002F\u003Ctenant-id>\u002Fv2.0\",\n    \"key_source\": \"jwks\",\n    \"client_ids\": [\"\u003Centra-application-client-id>\"],\n    \"default_scopes\": [\"crm.read\"],\n    \"jit_enabled\": true\n  }'\n",[36,19447,19448,19460,19472,19480,19486,19491,19496,19501,19506,19510,19515],{"__ignoreMap":2433},[414,19449,19450,19452,19454,19456,19458],{"class":2593,"line":2594},[414,19451,18073],{"class":2597},[414,19453,18076],{"class":2607},[414,19455,18079],{"class":2601},[414,19457,18082],{"class":2601},[414,19459,18085],{"class":2607},[414,19461,19462,19464,19466,19468,19470],{"class":2593,"line":2434},[414,19463,18090],{"class":2607},[414,19465,18093],{"class":2601},[414,19467,18096],{"class":2705},[414,19469,7395],{"class":2601},[414,19471,18085],{"class":2607},[414,19473,19474,19476,19478],{"class":2593,"line":2613},[414,19475,18090],{"class":2607},[414,19477,18107],{"class":2601},[414,19479,18085],{"class":2607},[414,19481,19482,19484],{"class":2593,"line":2625},[414,19483,18114],{"class":2607},[414,19485,18117],{"class":2601},[414,19487,19488],{"class":2593,"line":2677},[414,19489,19490],{"class":2601},"    \"mode\": \"direct_xaa\",\n",[414,19492,19493],{"class":2593,"line":2751},[414,19494,19495],{"class":2601},"    \"issuer\": \"https:\u002F\u002Flogin.microsoftonline.com\u002F\u003Ctenant-id>\u002Fv2.0\",\n",[414,19497,19498],{"class":2593,"line":2760},[414,19499,19500],{"class":2601},"    \"key_source\": \"jwks\",\n",[414,19502,19503],{"class":2593,"line":2768},[414,19504,19505],{"class":2601},"    \"client_ids\": [\"\u003Centra-application-client-id>\"],\n",[414,19507,19508],{"class":2593,"line":2776},[414,19509,18142],{"class":2601},[414,19511,19512],{"class":2593,"line":2784},[414,19513,19514],{"class":2601},"    \"jit_enabled\": true\n",[414,19516,19517],{"class":2593,"line":2792},[414,19518,5047],{"class":2601},[22,19520,19521],{},"Repeat this for each Entra tenant. The tenant id is part of iss, so two tenants cannot share one row.",[55,19523,19525],{"id":19524},"_4-what-entra-must-put-on-the-assertion","4. What Entra must put on the assertion",[22,19527,19528],{},"Entra signs the JWT. Your app redeems that JWT. It does not re-sign it. The header typ must be oauth-id-jag+jwt.",[2354,19530,19531,19534,19539,19541,19544,19547,19549,19551],{},[2357,19532,19533],{},"iss matches the trusted issuer string exactly, including \u002Fv2.0",[2357,19535,18392,19536],{},[41,19537,18395],{"href":18395,"rel":19538},[45],[2357,19540,18399],{},[2357,19542,19543],{},"sub is the end user. Entra's oid is the stable subject",[2357,19545,19546],{},"client_id is the application id in Allowed client IDs",[2357,19548,18405],{},[2357,19550,18408],{},[2357,19552,19553],{},"email is a user who already belongs to the workspace, when just-in-time mapping is on. Unified.to does not read preferred_username or upn",[55,19555,18415],{"id":18414},[22,19557,19558],{},"On the issuer row, choose Test and paste the assertion. A passing trace means the signature, issuer, audience, resource, client id, and identity checks succeeded. Test does not issue a token.",[22,19560,19561],{},"Exchange the assertion once at the token endpoint. The access_token starts with ema_. Send it as Authorization: Bearer on integration data routes. It can call only the categories in its scopes. It cannot manage the workspace, create API keys, or change enterprise-auth settings.",[2584,19563,19565],{"className":17934,"code":19564,"language":17936,"meta":2433,"style":2433},"curl -X POST https:\u002F\u002Fapi.unified.to\u002Foauth\u002Ftoken \\\n  -H \"Content-Type: application\u002Fx-www-form-urlencoded\" \\\n  --data-urlencode \"grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer\" \\\n  --data-urlencode \"assertion=$ASSERTION_JWT\" \\\n  --data-urlencode \"scope=crm.read\"\n",[36,19566,19567,19579,19587,19595,19608],{"__ignoreMap":2433},[414,19568,19569,19571,19573,19575,19577],{"class":2593,"line":2594},[414,19570,18073],{"class":2597},[414,19572,18076],{"class":2607},[414,19574,18079],{"class":2601},[414,19576,18437],{"class":2601},[414,19578,18085],{"class":2607},[414,19580,19581,19583,19585],{"class":2593,"line":2434},[414,19582,18090],{"class":2607},[414,19584,18446],{"class":2601},[414,19586,18085],{"class":2607},[414,19588,19589,19591,19593],{"class":2593,"line":2613},[414,19590,18462],{"class":2607},[414,19592,18455],{"class":2601},[414,19594,18085],{"class":2607},[414,19596,19597,19599,19601,19604,19606],{"class":2593,"line":2625},[414,19598,18462],{"class":2607},[414,19600,18465],{"class":2601},[414,19602,19603],{"class":2705},"$ASSERTION_JWT",[414,19605,7395],{"class":2601},[414,19607,18085],{"class":2607},[414,19609,19610,19612],{"class":2593,"line":2677},[414,19611,18462],{"class":2607},[414,19613,19614],{"class":2601}," \"scope=crm.read\"\n",[3629,19616,18475],{"id":18474},[22,19618,19619],{},"The signed JWT is only the assertion. Do not put ema_ in front of it. Unified.to mints a separate opaque access token and returns it already prefixed. There is no refresh token. When it expires, redeem a new assertion.",[2584,19621,19623],{"className":7323,"code":19622,"language":7325,"meta":2433,"style":2433},"{\n  \"access_token\": \"ema_…\",\n  \"token_type\": \"Bearer\",\n  \"expires_in\": 3600,\n  \"scope\": \"crm.read\"\n}\n",[36,19624,19625,19629,19639,19649,19659,19668],{"__ignoreMap":2433},[414,19626,19627],{"class":2593,"line":2594},[414,19628,8916],{"class":2705},[414,19630,19631,19633,19635,19637],{"class":2593,"line":2434},[414,19632,18492],{"class":2607},[414,19634,7340],{"class":2705},[414,19636,18497],{"class":2601},[414,19638,2757],{"class":2705},[414,19640,19641,19643,19645,19647],{"class":2593,"line":2613},[414,19642,18504],{"class":2607},[414,19644,7340],{"class":2705},[414,19646,18509],{"class":2601},[414,19648,2757],{"class":2705},[414,19650,19651,19653,19655,19657],{"class":2593,"line":2625},[414,19652,18516],{"class":2607},[414,19654,7340],{"class":2705},[414,19656,18521],{"class":2607},[414,19658,2757],{"class":2705},[414,19660,19661,19663,19665],{"class":2593,"line":2677},[414,19662,18528],{"class":2607},[414,19664,7340],{"class":2705},[414,19666,19667],{"class":2601},"\"crm.read\"\n",[414,19669,19670],{"class":2593,"line":2751},[414,19671,3035],{"class":2705},[4937,19673,19674],{},[22,19675,18545],{},[3629,19677,18549],{"id":18548},[22,19679,18552],{},[2354,19681,19682,19688],{},[2357,19683,18557,19684,19687],{},[41,19685,18395],{"href":18395,"rel":19686},[45]," (or the EU or AU host). The token is accepted only on integration data routes such as GET \u002Fcrm\u002F{connection_id}\u002Fcontact, and only when the scope matches the category and the method.",[2357,19689,18564,19690,19693],{},[41,19691,18567],{"href":18567,"rel":19692},[45],". Send the bearer token to the MCP server.",[22,19695,19696],{},"A REST token sent to MCP is refused, and an MCP token sent to the REST API returns token issued for another resource.",[55,19698,18652],{"id":18651},[22,19700,19701],{},"The trusted issuer does not store a user id. Each assertion subject gets an identity row. With just-in-time mapping on, Unified.to sets the workspace user id when the email claim matches a user in the workspace. Otherwise open the identity and set the workspace user yourself. No match and no just-in-time mapping returns identity not provisioned.",[55,19703,19705],{"id":19704},"when-entra-cannot-issue-an-id-jag","When Entra cannot issue an ID-JAG",[22,19707,19708],{},"Sign the user in with ordinary Entra sign-in, then register your own issuer as the trusted issuer. Topology is Brokered (ISV). Key source is JWKS (or Static key, or Workspace secret). Issuer (iss) is your issuer, not the Entra tenant. Put the Entra oid in sub and the user's email in the email claim. aud, resource, and a fresh jti are the same as above. A brokered assertion may omit typ. A direct assertion may not.",[2584,19710,19712],{"className":17934,"code":19711,"language":17936,"meta":2433,"style":2433},"curl -X POST https:\u002F\u002Fapi.unified.to\u002Funified\u002Fenterprise-auth\u002Ftrusted-issuers \\\n  -H \"Authorization: Bearer $UNIFIED_WORKSPACE_API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" \\\n  -d '{\n    \"mode\": \"isv_brokered\",\n    \"issuer\": \"https:\u002F\u002Fyour-issuer.example.com\",\n    \"key_source\": \"jwks\",\n    \"jwks_uri\": \"https:\u002F\u002Fyour-issuer.example.com\u002F.well-known\u002Fjwks.json\",\n    \"default_scopes\": [\"crm.read\"],\n    \"jit_enabled\": true\n  }'\n",[36,19713,19714,19726,19738,19746,19752,19756,19761,19765,19770,19774,19778],{"__ignoreMap":2433},[414,19715,19716,19718,19720,19722,19724],{"class":2593,"line":2594},[414,19717,18073],{"class":2597},[414,19719,18076],{"class":2607},[414,19721,18079],{"class":2601},[414,19723,18082],{"class":2601},[414,19725,18085],{"class":2607},[414,19727,19728,19730,19732,19734,19736],{"class":2593,"line":2434},[414,19729,18090],{"class":2607},[414,19731,18093],{"class":2601},[414,19733,18096],{"class":2705},[414,19735,7395],{"class":2601},[414,19737,18085],{"class":2607},[414,19739,19740,19742,19744],{"class":2593,"line":2613},[414,19741,18090],{"class":2607},[414,19743,18107],{"class":2601},[414,19745,18085],{"class":2607},[414,19747,19748,19750],{"class":2593,"line":2625},[414,19749,18114],{"class":2607},[414,19751,18117],{"class":2601},[414,19753,19754],{"class":2593,"line":2677},[414,19755,18122],{"class":2601},[414,19757,19758],{"class":2593,"line":2751},[414,19759,19760],{"class":2601},"    \"issuer\": \"https:\u002F\u002Fyour-issuer.example.com\",\n",[414,19762,19763],{"class":2593,"line":2760},[414,19764,19500],{"class":2601},[414,19766,19767],{"class":2593,"line":2768},[414,19768,19769],{"class":2601},"    \"jwks_uri\": \"https:\u002F\u002Fyour-issuer.example.com\u002F.well-known\u002Fjwks.json\",\n",[414,19771,19772],{"class":2593,"line":2776},[414,19773,18142],{"class":2601},[414,19775,19776],{"class":2593,"line":2784},[414,19777,19514],{"class":2601},[414,19779,19780],{"class":2593,"line":2792},[414,19781,5047],{"class":2601},[55,19783,19785],{"id":19784},"if-the-exchange-fails","If the exchange fails",[2354,19787,19788,19794,19800,19806,19812,19818,19824],{},[2357,19789,19790,19793],{},[31,19791,19792],{},"issuer not trusted"," — iss is not the v2 issuer, the row is disabled, or Enterprise Auth is off.",[2357,19795,19796,19799],{},[31,19797,19798],{},"direct_xaa requires typ oauth-id-jag+jwt"," — Entra sent an access token or ID token, not an ID-JAG. Use the brokered setup, or wait until Entra issues that grant.",[2357,19801,19802,19805],{},[31,19803,19804],{},"resource mismatch"," — resource is not this region's API host, or you set \u002Fmcp when the call is REST.",[2357,19807,19808,19811],{},[31,19809,19810],{},"client_id not allowed"," — the assertion client_id is not in Allowed client IDs.",[2357,19813,19814,19817],{},[31,19815,19816],{},"identity not provisioned"," — no email match, or just-in-time mapping is off and the subject is unmapped.",[2357,19819,19820,19823],{},[31,19821,19822],{},"assertion replayed"," — that jti was already exchanged. Sign a new one.",[2357,19825,19826,19829],{},[31,19827,19828],{},"insufficient_scope"," — the token's scopes do not cover that category and method.",[4156,19831,19832],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}",{"title":2433,"searchDepth":2434,"depth":2434,"links":19834},[19835,19836,19837,19838,19839,19840,19844,19845,19846],{"id":17892,"depth":2434,"text":17893},{"id":17907,"depth":2434,"text":17908},{"id":19367,"depth":2434,"text":19368},{"id":18014,"depth":2434,"text":18015},{"id":19524,"depth":2434,"text":19525},{"id":18414,"depth":2434,"text":18415,"children":19841},[19842,19843],{"id":18474,"depth":2613,"text":18475},{"id":18548,"depth":2613,"text":18549},{"id":18651,"depth":2434,"text":18652},{"id":19704,"depth":2434,"text":19705},{"id":19784,"depth":2434,"text":19785},"Register a Microsoft Entra ID tenant as a trusted issuer so Entra signs the enterprise-managed authorization assertion. Unified.to checks that signature...",{"img":19849,"date":19850,"updated":19851,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fenterprise_managed_authorization_ema_with_microsoft_entra_id-icon.png","2026-09-24T00:00:00.000Z","2026-10-02T16:57:39.139Z","\u002Fguides\u002Fenterprise_managed_authorization_ema_with_microsoft_entra_id",{"title":19314,"description":19847},"guides\u002Fenterprise_managed_authorization_ema_with_microsoft_entra_id","WdP1SMZb-Wtib_uhnVdlZwq7c81rk9O_3ABZal4XxK0",{"id":19857,"title":19858,"body":19859,"description":20323,"extension":2452,"meta":20324,"navigation":2459,"path":20328,"seo":20329,"stem":20330,"__hash__":20331},"guides\u002Fguides\u002Fextended_observability_pushing_api_logs_to_clickhouse.md","Extended observability — pushing API logs to ClickHouse",{"type":12,"value":19860,"toc":20310},[19861,19864,19866,19871,19889,19892,19896,19900,19910,19913,20023,20026,20057,20061,20064,20141,20145,20167,20170,20174,20185,20250,20263,20271,20274,20277,20284,20287,20290,20294,20308],[15,19862,19858],{"id":19863},"extended-observability-pushing-api-logs-to-clickhouse",[19,19865],{},[22,19867,19868],{},[25,19869,19870],{},"September 18, 2026",[22,19872,19873,19874,19877,19878,741,19883,19888],{},"You can send API call logs from ",[41,19875,123],{"href":121,"rel":19876},[45]," directly to your own ClickHouse instance. This is the same class of logs we support for ",[41,19879,19882],{"href":19880,"rel":19881},"https:\u002F\u002Funified.to\u002Fblog\u002Fextended_observability_pushing_api_logs_to_your_datadog_instance",[45],"Datadog",[41,19884,19887],{"href":19885,"rel":19886},"https:\u002F\u002Funified.to\u002Fblog\u002Fextended_observability_pushing_api_logs_to_grafana_loki",[45],"Grafana \u002F Loki","; you choose where they go in your workspace settings.",[22,19890,19891],{},"ClickHouse is commonly used for high-volume analytics and log-style querying with SQL. Unified writes each API-call log as a row into a table you choose in your cluster, over ClickHouse's HTTP interface.",[55,19893,19895],{"id":19894},"setting-it-up","Setting it up",[3629,19897,19899],{"id":19898},"_1-prepare-a-clickhouse-database-and-table","1. Prepare a ClickHouse database and table",[22,19901,19902,19903,4149,19906,19909],{},"Create a destination table in the database your credentials can write to. You choose the table name (for example ",[36,19904,19905],{},"unified_api_logs",[36,19907,19908],{},"observability.unified_api_logs",") and enter it in workspace settings.",[22,19911,19912],{},"A minimal schema that accepts Unified's inserts (replace the table name with yours):",[2584,19914,19918],{"className":19915,"code":19916,"language":19917,"meta":2433,"style":2433},"language-sql shiki shiki-themes github-dark github-dark github-light","CREATE TABLE IF NOT EXISTS unified_api_logs\n(\n    `id` String,\n    `created_at` DateTime,\n    `connection_id` String,\n    `workspace_id` String,\n    `integration_type` String,\n    `external_xref` String,\n    `name` String,\n    `path` String,\n    `size` UInt32,\n    `status` String,\n    `error` String,\n    `ip_address` String,\n    `type` String,\n    `method` String,\n    `environment` String,\n    `is_billable` Bool\n)\nENGINE = MergeTree\nORDER BY (workspace_id, created_at);\n","sql",[36,19919,19920,19925,19929,19934,19939,19944,19949,19954,19959,19964,19969,19974,19979,19984,19989,19994,19999,20004,20009,20013,20018],{"__ignoreMap":2433},[414,19921,19922],{"class":2593,"line":2594},[414,19923,19924],{},"CREATE TABLE IF NOT EXISTS unified_api_logs\n",[414,19926,19927],{"class":2593,"line":2434},[414,19928,18230],{},[414,19930,19931],{"class":2593,"line":2613},[414,19932,19933],{},"    `id` String,\n",[414,19935,19936],{"class":2593,"line":2625},[414,19937,19938],{},"    `created_at` DateTime,\n",[414,19940,19941],{"class":2593,"line":2677},[414,19942,19943],{},"    `connection_id` String,\n",[414,19945,19946],{"class":2593,"line":2751},[414,19947,19948],{},"    `workspace_id` String,\n",[414,19950,19951],{"class":2593,"line":2760},[414,19952,19953],{},"    `integration_type` String,\n",[414,19955,19956],{"class":2593,"line":2768},[414,19957,19958],{},"    `external_xref` String,\n",[414,19960,19961],{"class":2593,"line":2776},[414,19962,19963],{},"    `name` String,\n",[414,19965,19966],{"class":2593,"line":2784},[414,19967,19968],{},"    `path` String,\n",[414,19970,19971],{"class":2593,"line":2792},[414,19972,19973],{},"    `size` UInt32,\n",[414,19975,19976],{"class":2593,"line":2804},[414,19977,19978],{},"    `status` String,\n",[414,19980,19981],{"class":2593,"line":2809},[414,19982,19983],{},"    `error` String,\n",[414,19985,19986],{"class":2593,"line":2829},[414,19987,19988],{},"    `ip_address` String,\n",[414,19990,19991],{"class":2593,"line":2843},[414,19992,19993],{},"    `type` String,\n",[414,19995,19996],{"class":2593,"line":2849},[414,19997,19998],{},"    `method` String,\n",[414,20000,20001],{"class":2593,"line":2854},[414,20002,20003],{},"    `environment` String,\n",[414,20005,20006],{"class":2593,"line":2880},[414,20007,20008],{},"    `is_billable` Bool\n",[414,20010,20011],{"class":2593,"line":3253},[414,20012,3141],{},[414,20014,20015],{"class":2593,"line":3261},[414,20016,20017],{},"ENGINE = MergeTree\n",[414,20019,20020],{"class":2593,"line":3279},[414,20021,20022],{},"ORDER BY (workspace_id, created_at);\n",[22,20024,20025],{},"Notes:",[2354,20027,20028,20031,20038,20047,20050],{},[2357,20029,20030],{},"Use ClickHouse Cloud, self-hosted ClickHouse, or any compatible hosted service.",[2357,20032,20033,20034,20037],{},"Grant the user permission to ",[36,20035,20036],{},"INSERT"," into your chosen table.",[2357,20039,20040,20041,4149,20043,20046],{},"Table names may be ",[36,20042,155],{},[36,20044,20045],{},"database.table",", using letters, numbers, and underscores.",[2357,20048,20049],{},"You can add extra columns, indexes, or TTL policies for retention on your side. Unified only requires that the columns above can accept the values we send.",[2357,20051,20052,20053,20056],{},"Prefer HTTPS for the HTTP interface URL (ClickHouse Cloud typically exposes something like ",[36,20054,20055],{},"https:\u002F\u002F\u003Chost>:8443",").",[3629,20058,20060],{"id":20059},"_2-collect-connection-details","2. Collect connection details",[22,20062,20063],{},"You will need:",[155,20065,20066,20078],{},[158,20067,20068],{},[161,20069,20070,20073,20076],{},[164,20071,20072],{},"Setting",[164,20074,20075],{},"Workspace field",[164,20077,8469],{},[174,20079,20080,20093,20109,20122],{},[161,20081,20082,20085,20090],{},[179,20083,20084],{},"HTTP URL",[179,20086,20087],{},[36,20088,20089],{},"clickhouse_url",[179,20091,20092],{},"Base URL for the ClickHouse HTTP interface (include protocol and port when required)",[161,20094,20095,20098,20103],{},[179,20096,20097],{},"Username",[179,20099,20100],{},[36,20101,20102],{},"clickhouse_username",[179,20104,20105,20106],{},"Optional; if omitted, Unified uses ",[36,20107,20108],{},"default",[161,20110,20111,20114,20119],{},[179,20112,20113],{},"Password",[179,20115,20116],{},[36,20117,20118],{},"clickhouse_password",[179,20120,20121],{},"Optional; may be empty depending on your cluster",[161,20123,20124,20127,20132],{},[179,20125,20126],{},"Table",[179,20128,20129],{},[36,20130,20131],{},"clickhouse_table",[179,20133,20134,20135,4149,20138,2980],{},"Destination table (",[36,20136,20137],{},"my_logs",[36,20139,20140],{},"default.my_logs",[3629,20142,20144],{"id":20143},"_3-enter-values-in-workspace-settings","3. Enter values in workspace settings",[2510,20146,20147,20154,20164],{},[2357,20148,20149,20150,20153],{},"Open ",[31,20151,20152],{},"Workspace settings"," (workspace admins only), or update the workspace via the Workspace API.",[2357,20155,20156,20157,20160,20161,97],{},"Under ",[31,20158,20159],{},"External logging",", choose ",[31,20162,20163],{},"Clickhouse",[2357,20165,20166],{},"Enter the URL, username, password, and table name.",[22,20168,20169],{},"In the dashboard, external logging is one destination at a time (None, Datadog, Grafana, or ClickHouse).",[3629,20171,20173],{"id":20172},"_4-confirm-logs-are-flowing","4. Confirm logs are flowing",[2510,20175,20176,20179],{},[2357,20177,20178],{},"Make a sample call to the Unified API (for example, list an object on a connection), or trigger a webhook delivery.",[2357,20180,20181,20182,20184],{},"In ClickHouse, query ",[31,20183,16348],{}," table, for example:",[2584,20186,20188],{"className":19915,"code":20187,"language":19917,"meta":2433,"style":2433},"SELECT\n    created_at,\n    type,\n    method,\n    path,\n    integration_type,\n    status,\n    workspace_id,\n    connection_id\nFROM unified_api_logs\nORDER BY created_at DESC\nLIMIT 20;\n",[36,20189,20190,20195,20200,20205,20210,20215,20220,20225,20230,20235,20240,20245],{"__ignoreMap":2433},[414,20191,20192],{"class":2593,"line":2594},[414,20193,20194],{},"SELECT\n",[414,20196,20197],{"class":2593,"line":2434},[414,20198,20199],{},"    created_at,\n",[414,20201,20202],{"class":2593,"line":2613},[414,20203,20204],{},"    type,\n",[414,20206,20207],{"class":2593,"line":2625},[414,20208,20209],{},"    method,\n",[414,20211,20212],{"class":2593,"line":2677},[414,20213,20214],{},"    path,\n",[414,20216,20217],{"class":2593,"line":2751},[414,20218,20219],{},"    integration_type,\n",[414,20221,20222],{"class":2593,"line":2760},[414,20223,20224],{},"    status,\n",[414,20226,20227],{"class":2593,"line":2768},[414,20228,20229],{},"    workspace_id,\n",[414,20231,20232],{"class":2593,"line":2776},[414,20233,20234],{},"    connection_id\n",[414,20236,20237],{"class":2593,"line":2784},[414,20238,20239],{},"FROM unified_api_logs\n",[414,20241,20242],{"class":2593,"line":2792},[414,20243,20244],{},"ORDER BY created_at DESC\n",[414,20246,20247],{"class":2593,"line":2804},[414,20248,20249],{},"LIMIT 20;\n",[22,20251,20252,20253,319,20256,319,20259,20262],{},"You should see recent rows with route ",[36,20254,20255],{},"path",[36,20257,20258],{},"integration_type",[36,20260,20261],{},"status",", and related API-call fields.",[55,20264,20266,20267,20270],{"id":20265},"why-clickhouse-matters-for-unifiedto-users","Why ClickHouse matters for ",[41,20268,123],{"href":121,"rel":20269},[45]," users",[22,20272,20273],{},"By sending your logs directly to your own ClickHouse cluster, you get immediate visibility into what's happening in your environment. This allows you to quickly debug issues, get notified about errors, and more. Currently, we support both inbound API calls and webhook calls.",[22,20275,20276],{},"However, we're constantly improving our product, and we're looking forward to supporting more log types in the future. So, please send us feedback so we can better understand what you need.",[55,20278,20280,20281],{"id":20279},"about-unifiedto","About ",[41,20282,123],{"href":121,"rel":20283},[45],[22,20285,20286],{},"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.",[22,20288,20289],{},"We hope this new feature makes your life easier and your work more efficient!",[55,20291,20293],{"id":20292},"related-articles","Related articles",[2354,20295,20296,20302],{},[2357,20297,20298],{},[41,20299,20301],{"href":19880,"rel":20300},[45],"Extended Observability - Pushing API Logs to your Datadog Instance",[2357,20303,20304],{},[41,20305,20307],{"href":19885,"rel":20306},[45],"Extended observability — pushing API logs to Grafana \u002F Loki",[4156,20309,5736],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":20311},[20312,20318,20320,20322],{"id":19894,"depth":2434,"text":19895,"children":20313},[20314,20315,20316,20317],{"id":19898,"depth":2613,"text":19899},{"id":20059,"depth":2613,"text":20060},{"id":20143,"depth":2613,"text":20144},{"id":20172,"depth":2613,"text":20173},{"id":20265,"depth":2434,"text":20319},"Why ClickHouse matters for Unified.to users",{"id":20279,"depth":2434,"text":20321},"About Unified.to",{"id":20292,"depth":2434,"text":20293},"You can send API call logs from Unified.to directly to your own ClickHouse instance. This is the same class of logs we support for Datadog and Grafana \u002F Loki;...",{"img":20325,"date":20326,"updated":20327,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fextended_observability_pushing_api_logs_to_clickhouse-icon.svg","2026-09-18T13:19:00.000Z","2026-10-02T17:59:41.808Z","\u002Fguides\u002Fextended_observability_pushing_api_logs_to_clickhouse",{"title":19858,"description":20323},"guides\u002Fextended_observability_pushing_api_logs_to_clickhouse","voT9Pzu3vKqrFHdyfrcnRJTIIwXK5RL__BL_-BmkH68",{"id":20333,"title":20307,"body":20334,"description":20564,"extension":2452,"meta":20565,"navigation":2459,"path":20570,"seo":20571,"stem":20572,"__hash__":20573},"guides\u002Fguides\u002Fextended_observability_pushing_api_logs_to_grafana_loki.md",{"type":12,"value":20335,"toc":20559},[20336,20339,20341,20346,20373,20389,20392,20527,20535,20538,20547,20549,20551,20553],[15,20337,20307],{"id":20338},"extended-observability-pushing-api-logs-to-grafana-loki",[19,20340],{},[22,20342,20343],{},[25,20344,20345],{},"April 27, 2023",[22,20347,20348,20349,20352,20353,20356,20357,20360,20361,20363,20364,20368,20369,97],{},"We're excited to add another option for external observability: you can send ",[31,20350,20351],{},"API call logs"," from ",[41,20354,123],{"href":121,"rel":20355},[45]," directly to a ",[31,20358,20359],{},"Grafana Loki","–compatible endpoint. directly to a ",[31,20362,20359],{},"–compatible endpoint. This is the same class of logs we already support for ",[41,20365,19882],{"href":20366,"rel":20367},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fextended_observability_pushing_api_logs_to_your_datadog_instance",[45],"; you choose where they go in your ",[41,20370,20372],{"href":16643,"rel":20371},[45],"workspace settings",[22,20374,20375,741,20382,20388],{},[41,20376,20379],{"href":20377,"rel":20378},"https:\u002F\u002Fgrafana.com\u002Fproducts\u002Fcloud\u002F",[45],[31,20380,20381],{},"Grafana Cloud",[41,20383,20386],{"href":20384,"rel":20385},"https:\u002F\u002Fgrafana.com\u002Foss\u002Floki\u002F",[45],[31,20387,20359],{}," are commonly used for log aggregation and querying. Unified delivers logs using Loki's standard HTTP push API.",[22,20390,20391],{},"Setting it up is easy! Here's how:",[2354,20393,20394,20442,20500],{},[2357,20395,20396,20399],{},[31,20397,20398],{},"Prepare your endpoint and credentials",[2354,20400,20401,20423],{},[2357,20402,20403,20404,20410,20411,20414,20415,20418,20419,20422],{},"In ",[41,20405,20408],{"href":20406,"rel":20407},"https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fgrafana-cloud\u002F",[45],[31,20409,20381],{},", open your stack and note the ",[31,20412,20413],{},"logs \u002F Loki"," ingest base URL (no path) — often ",[36,20416,20417],{},"https:\u002F\u002Flogs-prod-XX.grafana.net"," (your region may differ). If you use ",[31,20420,20421],{},"self-hosted Loki",", use that base URL instead.",[2357,20424,20425,20426,20429,20430,34,20433,34,20438,20441],{},"Create or copy a ",[31,20427,20428],{},"logs token"," (or the username + token pair your provider documents for Basic auth). ",[31,20431,20432],{},"Set",[31,20434,20435],{},[36,20436,20437],{},"grafana_site",[31,20439,20440],{},"explicitly"," for EU\u002Fregional 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.",[2357,20443,20444,20447],{},[31,20445,20446],{},"Enter values in workspace settings",[2354,20448,20449],{},[2357,20450,20149,20451,20454,20455,20458,20459],{},[41,20452,20152],{"href":16643,"rel":20453},[45]," (or use the Workspace API) and choose ",[31,20456,20457],{},"Grafana"," under external logging. Configure:\n",[2354,20460,20461,20473,20487],{},[2357,20462,20463,3970,20466,20468,20469,2980],{},[31,20464,20465],{},"Loki base URL",[36,20467,20437],{},"): Base URL only (for example ",[41,20470,20417],{"href":20471,"rel":20472},"https:\u002F\u002Flogs-prod-xx.grafana.net\u002F",[45],[2357,20474,20475,20478,20479,20482,20483,20486],{},[31,20476,20477],{},"Authentication: Basic"," (Grafana Cloud: user\u002Finstance id + token), ",[31,20480,20481],{},"Bearer"," (if your gateway expects a bearer token), or ",[31,20484,20485],{},"Legacy"," (single field — see below).",[2357,20488,20489,3970,20492,20495,20496,20499],{},[31,20490,20491],{},"Token \u002F API key",[36,20493,20494],{},"grafana_apikey","): Your secret or legacy ",[36,20497,20498],{},"user:token"," string, depending on mode.",[2357,20501,20502,20505],{},[31,20503,20504],{},"Confirm logs are flowing",[2354,20506,20507],{},[2357,20508,20509,20510,20513,20514,20517,20518,319,20522,319,20524,20526],{},"Make a sample call to the Unified API (for example, list an object on a connection). In ",[31,20511,20512],{},"Grafana Explore"," (or any Loki client), run LogQL such as ",[36,20515,20516],{},"{job=\"unified-api\"}",". Log lines include JSON with the route ",[31,20519,20520],{},[36,20521,20255],{},[36,20523,20258],{},[36,20525,20261],{},", and other API-call fields.",[55,20528,20530,20531,20534],{"id":20529},"why-does-grafana-loki-matter-for-unifiedto-users","Why does Grafana \u002F Loki matter for ",[41,20532,123],{"href":121,"rel":20533},[45]," users?",[22,20536,20537],{},"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.",[22,20539,20540,20541,20546],{},"However, we're constantly improving our product, and we're looking forward to supporting more log types in the future. So, please ",[41,20542,20545],{"href":20543,"rel":20544},"https:\u002F\u002Funified.to\u002Fcontact",[45],"send us feedback"," so we can better understand what you need.",[55,20548,20321],{"id":20279},[22,20550,20286],{},[22,20552,20289],{},[22,20554,20555],{},[41,20556,20558],{"href":4146,"rel":20557},[45],"Get started with Unified.to",{"title":2433,"searchDepth":2434,"depth":2434,"links":20560},[20561,20563],{"id":20529,"depth":2434,"text":20562},"Why does Grafana \u002F Loki matter for Unified.to users?",{"id":20279,"depth":2434,"text":20321},"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....",{"img":20566,"date":20567,"updated":20568,"tag":2457,"integrations":20569},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fextended_observability_pushing_api_logs_to_grafana_loki-icon.png","2023-04-27T00:00:00.000Z","2026-08-23T14:53:24.152Z","grafana","\u002Fguides\u002Fextended_observability_pushing_api_logs_to_grafana_loki",{"title":20307,"description":20564},"guides\u002Fextended_observability_pushing_api_logs_to_grafana_loki","5Gwn3F5AqrcpMwBglTahRvbJD17iWpMM0Ez0mDqLDjw",{"id":20575,"title":20301,"body":20576,"description":20656,"extension":2452,"meta":20657,"navigation":2459,"path":20661,"seo":20662,"stem":20663,"__hash__":20664},"guides\u002Fguides\u002Fextended_observability_pushing_api_logs_to_your_datadog_instance.md",{"type":12,"value":20577,"toc":20652},[20578,20581,20583,20587,20594,20601,20603,20623,20629,20633,20636,20641,20643,20645,20647],[15,20579,20301],{"id":20580},"extended-observability-pushing-api-logs-to-your-datadog-instance",[19,20582],{},[22,20584,20585],{},[25,20586,20345],{},[22,20588,20589,20590,20593],{},"We're excited to announce the latest addition to increase observability for our customers — the ability to send API call logs within ",[41,20591,123],{"href":121,"rel":20592},[45]," directly to your Datadog instance.",[22,20595,20596,20600],{},[41,20597,19882],{"href":20598,"rel":20599},"https:\u002F\u002Fwww.datadoghq.com\u002F",[45]," is a cloud-based monitoring and analytics platform that provides real-time insights into the performance of IT infrastructure, applications, and logs.",[22,20602,20391],{},[2510,20604,20605,20614,20620],{},[2357,20606,20607,20608,20613],{},"Get your Datadog API key: To start sending logs to Datadog, you need to obtain your API key. Here's a ",[41,20609,20612],{"href":20610,"rel":20611},"https:\u002F\u002Fdocs.datadoghq.com\u002Faccount_management\u002Fapi-app-keys\u002F",[45],"detailed article"," that walks you through the process.",[2357,20615,20616,20617,97],{},"Once you have your API key, simply paste it into your Unified.to ",[41,20618,20372],{"href":16643,"rel":20619},[45],[2357,20621,20622],{},"Finally, make a sample API call to Unified API to confirm that logs are being sent to your Datadog instance.",[22,20624,20625],{},[4201,20626],{"alt":20627,"src":20628},"Untitled.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fextended_observability_pushing_api_logs_to_your_datadog_instance-0.png",[55,20630,20632],{"id":20631},"why-does-datadog-matter-for-unifiedto-users","Why does Datadog matter for Unified.to users?",[22,20634,20635],{},"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.",[22,20637,20540,20638,20546],{},[41,20639,20545],{"href":20543,"rel":20640},[45],[55,20642,20321],{"id":20279},[22,20644,20286],{},[22,20646,20289],{},[22,20648,20649],{},[41,20650,20558],{"href":4146,"rel":20651},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":20653},[20654,20655],{"id":20631,"depth":2434,"text":20632},{"id":20279,"depth":2434,"text":20321},"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...",{"img":20658,"date":20567,"updated":20659,"tag":2457,"integrations":20660},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fextended_observability_pushing_api_logs_to_your_datadog_instance-icon.png","2026-08-23T14:54:10.072Z","datadog","\u002Fguides\u002Fextended_observability_pushing_api_logs_to_your_datadog_instance",{"title":20301,"description":20656},"guides\u002Fextended_observability_pushing_api_logs_to_your_datadog_instance","S4fAEBxGWYuZ1JGAWa7d-qc4k-1BdwXPTUMTUIEXdFs",{"id":20666,"title":20667,"body":20668,"description":20803,"extension":2452,"meta":20804,"navigation":2459,"path":20808,"seo":20809,"stem":20810,"__hash__":20811},"guides\u002Fguides\u002Ffacebook_messenger_webhook_setup.md","Facebook Messenger Webhook Setup",{"type":12,"value":20669,"toc":20799},[20670,20673,20675,20680,20687,20691,20757,20761,20794],[15,20671,20667],{"id":20672},"facebook-messenger-webhook-setup",[19,20674],{},[22,20676,20677],{},[25,20678,20679],{},"August 24, 2026",[22,20681,20682,20683,20686],{},"Messenger delivers events to a single ",[31,20684,20685],{},"app-level"," callback URL. Configure it once in the Meta App\nDashboard; each connected Page is then subscribed programmatically by this integration.",[55,20688,20690],{"id":20689},"app-level-configuration-once-per-meta-app","App-level configuration (once per Meta App)",[2510,20692,20693,20700,20733,20745],{},[2357,20694,20695,20696,20699],{},"In the Meta App Dashboard, add the ",[31,20697,20698],{},"Messenger"," product.",[2357,20701,20156,20702,10279,20705,20708,20709,20712,20713],{},[31,20703,20704],{},"Messenger → Settings → Webhooks",[31,20706,20707],{},"App → Webhooks",", object ",[31,20710,20711],{},"Page","), set:\n",[2354,20714,20715,20723],{},[2357,20716,20717,7340,20720],{},[31,20718,20719],{},"Callback URL",[36,20721,20722],{},"https:\u002F\u002Fapi.unified.to\u002Fwebhook\u002Fworkspace\u002Ffacebookmessenger?workspace_id=\u003Cworkspace_id>",[2357,20724,20725,20728,20729,20732],{},[31,20726,20727],{},"Verify Token",": any non-empty string. The integration echoes ",[36,20730,20731],{},"hub.challenge","; token equality is not enforced.",[2357,20734,20735,20736,319,20739,319,20742,97],{},"Subscribe the Page object to these fields: ",[36,20737,20738],{},"messages",[36,20740,20741],{},"messaging_postbacks",[36,20743,20744],{},"message_reactions",[2357,20746,20747,20748,319,20751,322,20754,97],{},"Ensure the connection's OAuth scopes include ",[36,20749,20750],{},"pages_messaging",[36,20752,20753],{},"pages_manage_metadata",[36,20755,20756],{},"pages_read_engagement",[55,20758,20760],{"id":20759},"routing","Routing",[2354,20762,20763,20778,20786],{},[2357,20764,20765,20767,20768,20771,20772,34,20774,20777],{},[36,20766,20738],{}," (non-echo) → ",[36,20769,20770],{},"messaging_message"," (created) ",[31,20773,10047],{},[36,20775,20776],{},"messaging_event"," (MESSAGE_RECEIVED)",[2357,20779,20780,20782,20783,20785],{},[36,20781,20741],{}," \u002F quick replies → ",[36,20784,20776],{}," (BUTTON_CLICK)",[2357,20787,20788,20790,20791,20793],{},[36,20789,20744],{}," → ",[36,20792,20776],{}," (REACTION_ADDED \u002F REACTION_REMOVED)",[22,20795,5728,20796,97],{},[41,20797,5733],{"href":5731,"rel":20798},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":20800},[20801,20802],{"id":20689,"depth":2434,"text":20690},{"id":20759,"depth":2434,"text":20760},"Messenger delivers events to a single app-level callback URL. Configure it once in the Meta App",{"img":7949,"date":20805,"updated":20806,"tag":2457,"integrations":20807},"2026-08-24T02:20:00.000Z","2026-10-13T00:41:39.060Z","facebookmessenger","\u002Fguides\u002Ffacebook_messenger_webhook_setup",{"title":20667,"description":20803},"guides\u002Ffacebook_messenger_webhook_setup","y7s4CFe_juNB-kGUOkpdSH3w4t5YwCMwUEIP6L8Nn-A",{"id":20813,"title":20814,"body":20815,"description":21362,"extension":2452,"meta":21363,"navigation":2459,"path":21368,"seo":21369,"stem":21370,"__hash__":21371},"guides\u002Fguides\u002Ffireflies_integration_guide.md","Fireflies Integration Guide",{"type":12,"value":20816,"toc":21345},[20817,20820,20822,20827,20830,20846,20849,20851,20858,20865,20867,20870,20901,20908,20912,20919,20944,20947,20949,20953,20963,20974,20976,20980,20987,20992,21021,21023,21027,21056,21067,21069,21073,21080,21145,21147,21151,21154,21161,21186,21189,21196,21198,21202,21213,21215,21217,21281,21283,21286,21310,21312,21315,21338,21340],[15,20818,20814],{"id":20819},"fireflies-integration-guide",[19,20821],{},[22,20823,20824],{},[25,20825,20826],{},"November 5, 2025",[15,20828,20814],{"id":20829},"fireflies-integration-guide-1",[22,20831,20832,20833,20840,20841,97],{},"Learn how to connect an end-customer's ",[41,20834,20837],{"href":20835,"rel":20836},"https:\u002F\u002Ffireflies.ai\u002F",[45],[31,20838,20839],{},"Fireflies.ai"," account to your application using ",[41,20842,20844],{"href":121,"rel":20843},[45],[31,20845,123],{},[22,20847,20848],{},"This guide covers how to enable the integration, embed the authorization component, and verify the connection end-to-end.",[55,20850,4426],{"id":4425},[22,20852,20853,20854,20857],{},"The Fireflies integration allows your app's end users to authorize ",[41,20855,123],{"href":121,"rel":20856},[45]," to access their Fireflies accounts for meeting recordings and user data.",[22,20859,20860,20861,20864],{},"Once connected, your application can access the Fireflies API securely through ",[41,20862,123],{"href":121,"rel":20863},[45]," — without your users ever leaving your app.",[55,20866,2542],{"id":2541},[22,20868,20869],{},"Before getting started, ensure you have:",[2354,20871,20872,20883,20895,20898],{},[2357,20873,2553,20874,34,20879,20882],{},[41,20875,20877],{"href":121,"rel":20876},[45],[31,20878,123],{},[31,20880,20881],{},"developer account"," and active API credentials",[2357,20884,20885,20886,34,20891,20894],{},"Your end-customer has a ",[41,20887,20889],{"href":20835,"rel":20888},[45],[31,20890,20839],{},[31,20892,20893],{},"paid plan"," (API access required)",[2357,20896,20897],{},"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",[2357,20899,20900],{},"Optional: API Explorer or MCP Server for testing connections",[22,20902,20903,20904,20907],{},"Please note that the Fireflies API is only available to users on a ",[31,20905,20906],{},"paid Fireflies plan",".  Free-tier accounts cannot authorize API access.",[55,20909,20911],{"id":20910},"step-by-step-setup","Step-by-Step Setup",[3629,20913,20915,20916],{"id":20914},"_1-enable-the-fireflies-integration-in-unifiedto","1. Enable the Fireflies Integration in ",[41,20917,123],{"href":121,"rel":20918},[45],[2510,20920,20921,20928,20932,20939],{},[2357,20922,20923,20924,20927],{},"Log in to your ",[41,20925,123],{"href":121,"rel":20926},[45]," developer dashboard.",[2357,20929,16270,20930,97],{},[31,20931,4433],{},[2357,20933,20934,20935,20938],{},"Locate ",[31,20936,20937],{},"Fireflies"," in the catalog.",[2357,20940,16292,20941,97],{},[31,20942,20943],{},"Activate Integration",[22,20945,20946],{},"Once enabled, Fireflies becomes available for your end-customer to authorize within your own app.",[19,20948],{},[3629,20950,20952],{"id":20951},"_2-embed-the-authorization-component","2. Embed the Authorization Component",[22,20954,9188,20955,20958,20959,20962],{},[31,20956,20957],{},"Embedded Authorization (Authorize Optimization)"," component from ",[41,20960,123],{"href":121,"rel":20961},[45]," to create a seamless in-app experience.",[2510,20964,20965,20968,20971],{},[2357,20966,20967],{},"Add the component to your application UI where users connect integrations.",[2357,20969,20970],{},"Preview the embedded experience - this is what your customers see when connecting Fireflies.",[2357,20972,20973],{},"The component displays a button (e.g., 'Authorize Fireflies') and short instructions.",[19,20975],{},[3629,20977,20979],{"id":20978},"_3-obtain-the-fireflies-api-key","3. Obtain the Fireflies API Key",[22,20981,20982,20983,20986],{},"Your end-customers\u002Fusers will need their ",[31,20984,20985],{},"Fireflies API key"," to complete authorization.",[22,20988,20989],{},[31,20990,20991],{},"Steps for your end user:",[2510,20993,20994,21003,21009,21018],{},[2357,20995,20996,20997,21002],{},"Log in to their ",[41,20998,21000],{"href":20835,"rel":20999},[45],[31,21001,20839],{}," account.",[2357,21004,21005,21006,97],{},"Go to ",[31,21007,21008],{},"Settings → Integrations",[2357,21010,20934,21011,21014,21015,97],{},[31,21012,21013],{},"API Key"," and click ",[31,21016,21017],{},"Copy",[2357,21019,21020],{},"Return to your app's authorization screen and paste it into the field provided.",[19,21022],{},[3629,21024,21026],{"id":21025},"_4-authorize-access","4. Authorize Access",[2510,21028,21029,21032,21036],{},[2357,21030,21031],{},"In the authorization window, paste the Fireflies API key.",[2357,21033,16292,21034,97],{},[31,21035,6955],{},[2357,21037,21038,21041,21042],{},[41,21039,123],{"href":121,"rel":21040},[45]," will automatically:\n",[2354,21043,21044,21047,21050],{},[2357,21045,21046],{},"Validate the API key",[2357,21048,21049],{},"Connect to Fireflies",[2357,21051,21052,21053],{},"Run a ",[31,21054,21055],{},"test connection",[22,21057,21058,21059,21062,21063,21066],{},"If successful, ",[41,21060,123],{"href":121,"rel":21061},[45]," creates a new ",[31,21064,21065],{},"Connection Object"," linked to that customer.",[19,21068],{},[3629,21070,21072],{"id":21071},"_5-verify-the-connection","5. Verify the Connection",[22,21074,21075,21076,21079],{},"Once the test passes, a new connection record appears in your ",[41,21077,123],{"href":121,"rel":21078},[45]," dashboard.",[155,21081,21082,21090],{},[158,21083,21084],{},[161,21085,21086,21088],{},[164,21087,5244],{},[164,21089,8469],{},[174,21091,21092,21102,21113,21123,21133],{},[161,21093,21094,21099],{},[179,21095,21096],{},[31,21097,21098],{},"Connection ID",[179,21100,21101],{},"Unique identifier for API requests",[161,21103,21104,21108],{},[179,21105,21106],{},[31,21107,166],{},[179,21109,21110],{},[41,21111,20839],{"href":20835,"rel":21112},[45],[161,21114,21115,21120],{},[179,21116,21117],{},[31,21118,21119],{},"Status",[179,21121,21122],{},"Connected",[161,21124,21125,21130],{},[179,21126,21127],{},[31,21128,21129],{},"Created At",[179,21131,21132],{},"Timestamp of creation",[161,21134,21135,21143],{},[179,21136,9188,21137,21139,21140,97],{},[31,21138,21098],{}," to make authenticated API calls to Fireflies through ",[41,21141,123],{"href":121,"rel":21142},[45],[179,21144],{},[19,21146],{},[3629,21148,21150],{"id":21149},"_6-test-the-connection-optional","6. Test the Connection (Optional)",[22,21152,21153],{},"You can test the integration in two environments:",[22,21155,21156,21157,21160],{},"a) Using ",[41,21158,123],{"href":121,"rel":21159},[45]," API Explorer",[2354,21162,21163,21169],{},[2357,21164,20149,21165,21168],{},[31,21166,21167],{},"API Explorer"," in your dashboard.",[2357,21170,21171,21172],{},"Use your new Connection ID to query endpoints such as:\n",[2354,21173,21174,21180],{},[2357,21175,21176,21179],{},[36,21177,21178],{},"\u002Fhris\u002F{id}\u002Femployee"," – list Fireflies users",[2357,21181,21182,21185],{},[36,21183,21184],{},"\u002Fcalendar\u002F{id}\u002Frecording"," – retrieve meeting data",[22,21187,21188],{},"b) Using MCP Server (for AI Agents)",[22,21190,21191,21192,21195],{},"If your use case involves AI agents, test the connection within your ",[31,21193,21194],{},"MCP Server"," using the same Connection ID.",[19,21197],{},[55,21199,21201],{"id":21200},"example-use-cases","Example Use Cases",[2354,21203,21204,21207,21210],{},[2357,21205,21206],{},"Retrieve meeting recordings for transcription or analysis",[2357,21208,21209],{},"Sync Fireflies user data into your CRM or analytics system",[2357,21211,21212],{},"Feed Fireflies meeting data into AI summarization or tagging workflows",[19,21214],{},[55,21216,5622],{"id":5621},[155,21218,21219,21231],{},[158,21220,21221],{},[161,21222,21223,21226,21228],{},[164,21224,21225],{},"Issue",[164,21227,8469],{},[164,21229,21230],{},"Solution",[174,21232,21233,21246,21259,21272],{},[161,21234,21235,21240,21243],{},[179,21236,21237],{},[31,21238,21239],{},"Authorization failed",[179,21241,21242],{},"Invalid or expired API key",[179,21244,21245],{},"Re-copy the key from Fireflies and retry authorization.",[161,21247,21248,21253,21256],{},[179,21249,21250],{},[31,21251,21252],{},"Test connection failed",[179,21254,21255],{},"API access not enabled",[179,21257,21258],{},"Ensure user is on a paid Fireflies plan.",[161,21260,21261,21266,21269],{},[179,21262,21263],{},[31,21264,21265],{},"No data returned",[179,21267,21268],{},"Key valid but no accessible data",[179,21270,21271],{},"Check that the Fireflies workspace contains recordings.",[161,21273,21274,21277,21279],{},[179,21275,21276],{},"*Fireflies must have existing data (e.g., recorded meetings) to return results when testing API endpoints.",[179,21278],{},[179,21280],{},[19,21282],{},[55,21284,21285],{"id":16754},"Next Steps",[2354,21287,21288,21301,21307],{},[2357,21289,21290,21291,21296,21297,741,21299,97],{},"Explore the ",[41,21292,21295],{"href":21293,"rel":21294},"https:\u002F\u002Fwww.notion.so\u002Fapi-reference",[45],"Unified.to API Reference"," to interact with ",[36,21298,21178],{},[36,21300,21184],{},[2357,21302,21303,21304,21168],{},"Monitor performance and connection status under ",[31,21305,21306],{},"Integration Health",[2357,21308,21309],{},"Repeat these steps for other integrations or customer environments.",[19,21311],{},[55,21313,21314],{"id":20292},"Related Articles",[2354,21316,21317,21324,21331],{},[2357,21318,21319],{},[41,21320,21323],{"href":21321,"rel":21322},"https:\u002F\u002Fwww.notion.so\u002Fguides\u002Fembedded-authorization",[45],"Embedding the Authorization Component",[2357,21325,21326],{},[41,21327,21330],{"href":21328,"rel":21329},"https:\u002F\u002Fwww.notion.so\u002Fguides\u002Ftesting-connections",[45],"Testing Connections via API Explorer",[2357,21332,21333],{},[41,21334,21337],{"href":21335,"rel":21336},"https:\u002F\u002Fwww.notion.so\u002Fguides\u002Fmanage-connections",[45],"Managing Customer Connections",[19,21339],{},[22,21341,21342],{},[25,21343,21344],{},"Last updated: November 2025",{"title":2433,"searchDepth":2434,"depth":2434,"links":21346},[21347,21348,21349,21358,21359,21360,21361],{"id":4425,"depth":2434,"text":4426},{"id":2541,"depth":2434,"text":2542},{"id":20910,"depth":2434,"text":20911,"children":21350},[21351,21353,21354,21355,21356,21357],{"id":20914,"depth":2613,"text":21352},"1. Enable the Fireflies Integration in Unified.to",{"id":20951,"depth":2613,"text":20952},{"id":20978,"depth":2613,"text":20979},{"id":21025,"depth":2613,"text":21026},{"id":21071,"depth":2613,"text":21072},{"id":21149,"depth":2613,"text":21150},{"id":21200,"depth":2434,"text":21201},{"id":5621,"depth":2434,"text":5622},{"id":16754,"depth":2434,"text":21285},{"id":20292,"depth":2434,"text":21314},"Learn how to connect an end-customer's Fireflies.ai account to your application using Unified.to.",{"img":21364,"date":21365,"updated":21366,"tag":2457,"integrations":21367},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Ffireflies_integration_guide-icon.jpg","2025-11-05T00:00:00.000Z","2026-08-23T14:54:17.534Z","fireflies","\u002Fguides\u002Ffireflies_integration_guide",{"title":20814,"description":21362},"guides\u002Ffireflies_integration_guide","tYN8ZHEUB2YqmDjHLnGAEsVAe89-gG9vT1HJ4w1FGDw",{"id":21373,"title":21374,"body":21375,"description":22360,"extension":2452,"meta":22361,"navigation":2459,"path":22366,"seo":22367,"stem":22368,"__hash__":22369},"guides\u002Fguides\u002Fgetting_started_with_workable.md","Getting started with Workable",{"type":12,"value":21376,"toc":22345},[21377,21380,21382,21387,21404,21407,21411,21429,21432,21444,21448,21455,21549,21553,21564,21585,21588,21595,21704,21708,21717,21779,21789,21801,21808,21826,21832,21840,21846,21852,21859,21874,21880,21884,21891,22056,22065,22068,22072,22083,22098,22126,22130,22133,22156,22165,22181,22194,22198,22227,22235,22243,22250,22254,22273,22276,22292,22296,22304,22308,22334],[15,21378,21374],{"id":21379},"getting-started-with-workable",[19,21381],{},[22,21383,21384],{},[25,21385,21386],{},"January 11, 2024",[22,21388,21389,21390,21393,21394,21397,21398,21403],{},"To add Workable to your product with ",[41,21391,123],{"href":121,"rel":21392},[45],", activate the Workable integration in your workspace and choose how customers authorize it: a Workable API token plus the account subdomain, or OAuth 2 with credentials that Workable issues to partners. Then embed the Authorization component and store the connection ID each customer creates. Workable is one of 1663 integrations on ",[41,21395,123],{"href":121,"rel":21396},[45],". This guide is for developers and product teams adding Workable ATS and HR data to their product. It covers ",[41,21399,21402],{"href":21400,"rel":21401},"https:\u002F\u002Funified.to\u002Fintegrations\u002Fworkable",[45],"Unified.to's Workable integration"," from credentials to your first API call.",[22,21405,21406],{},"At the end of this guide, you will have everything you need to activate a Workable integration and begin creating customer connections in production.",[55,21408,21410],{"id":21409},"what-do-you-need-before-you-start","What do you need before you start?",[22,21412,21413,21414,21417,21418,21423,21424,97],{},"You need a ",[41,21415,123],{"href":121,"rel":21416},[45]," account. ",[41,21419,21422],{"href":21420,"rel":21421},"https:\u002F\u002Fapp.unified.to\u002Flogin",[45],"Start a 30-day free trial"," and follow the onboarding steps. Workable and all pre-built integrations are available on every ",[41,21425,21428],{"href":21426,"rel":21427},"https:\u002F\u002Funified.to\u002Fpricing",[45],"Unified.to plan",[22,21430,21431],{},"You also need to choose which Workable credential your customers will use. The API-token method needs nothing from Workable except a customer who is a Workable Admin. OAuth 2 needs partner credentials from Workable.",[22,21433,21434,21435,21440,21441,97],{},"This guide assumes you know ",[41,21436,21439],{"href":21437,"rel":21438},"https:\u002F\u002Fwww.workable.com\u002F",[45],"Workable"," and basic integration concepts. You don't need to be an expert in integration development or in ",[41,21442,123],{"href":121,"rel":21443},[45],[55,21445,21447],{"id":21446},"should-your-customers-use-a-workable-api-token-or-oauth-2","Should your customers use a Workable API token or OAuth 2?",[22,21449,21450,21451,21454],{},"Use the API token if you want to start now: each customer creates the token in their own Workable account. Use OAuth 2 once Workable has accepted you as a partner. Your customers then approve access on Workable's sign-in page, and Workable's API docs give OAuth tokens a higher rate limit. ",[41,21452,123],{"href":121,"rel":21453},[45],"'s Workable integration supports both methods.",[155,21456,21457,21468],{},[158,21458,21459],{},[161,21460,21461,21463,21466],{},[164,21462],{},[164,21464,21465],{},"API token and subdomain",[164,21467,6814],{},[174,21469,21470,21481,21492,21506,21521,21540],{},[161,21471,21472,21475,21478],{},[179,21473,21474],{},"Who issues the credential",[179,21476,21477],{},"Your customer, in their own Workable account (Admin users only)",[179,21479,21480],{},"Workable issues your client ID and client secret after it approves you as a partner; each customer then approves access",[161,21482,21483,21486,21489],{},[179,21484,21485],{},"What your customer provides",[179,21487,21488],{},"The token and their account subdomain",[179,21490,21491],{},"Their account subdomain, then their Workable sign-in and approval of the requested scopes",[161,21493,21494,21500,21503],{},[179,21495,21496,21497],{},"What you enter in ",[41,21498,123],{"href":121,"rel":21499},[45],[179,21501,21502],{},"Nothing beyond activation",[179,21504,21505],{},"Your Workable client ID and client secret",[161,21507,21508,21511,21518],{},[179,21509,21510],{},"Workable rate limit",[179,21512,21513,21514,21517],{},"10 requests per 10 seconds on account tokens. Calls that carry your Workable client ID get partner limits, and ",[41,21515,123],{"href":121,"rel":21516},[45]," sends it when you've entered one",[179,21519,21520],{},"50 requests per 10 seconds on OAuth tokens",[161,21522,21523,21526,21533],{},[179,21524,21525],{},"Expiry",[179,21527,21528,21529,21532],{},"The customer picks 30 days, 90 days, 6 months, 1 year or 2 years. When it expires, the customer selects ",[31,21530,21531],{},"Renew"," in Workable, which keeps the same token",[179,21534,21535,21536,21539],{},"Access tokens last 7,200 seconds (2 hours); ",[41,21537,123],{"href":121,"rel":21538},[45]," uses the refresh token to renew them without asking the customer again",[161,21541,21542,21545,21547],{},[179,21543,21544],{},"Workable facts in this table come from Workable's documentation, as of 21 October 2026. Workable counts requests per account or per OAuth application in 10-second windows, and returns HTTP 429 when a limit is exceeded.",[179,21546],{},[179,21548],{},[55,21550,21552],{"id":21551},"how-does-a-customer-generate-a-workable-api-token","How does a customer generate a Workable API token?",[22,21554,21555,21556,21559,21560,21563],{},"A Workable Admin generates the token from their profile icon under ",[31,21557,21558],{},"Settings > Integrations > Apps",", in the ",[31,21561,21562],{},"API Access Tokens"," section (Workable Help Center, as of 21 October 2026). Workable has no separate API permission, so a user who isn't an Admin can't create one.",[2510,21565,21566,21569,21572,21575],{},[2357,21567,21568],{},"Select the button to generate a new token, name it and choose an expiry.",[2357,21570,21571],{},"Select the scopes for the data your product uses.",[2357,21573,21574],{},"Copy the token. Workable shows it only once; if it's lost, the customer generates a new one.",[2357,21576,21577,21578,21581,21582,97],{},"Find the account subdomain in Workable's company profile settings. It is the ",[36,21579,21580],{},"\u003Csubdomain>"," in ",[36,21583,21584],{},"https:\u002F\u002F\u003Csubdomain>.workable.com",[22,21586,21587],{},"The customer enters both values when they connect Workable from your app. A token reaches only the Workable account it was created in, so a customer with two Workable accounts creates two tokens and two connections.",[22,21589,21590,21591,21594],{},"Ask customers to select the scopes that match the ",[41,21592,123],{"href":121,"rel":21593},[45]," objects you use. The Workable scope descriptions are from Workable's Help Center, as of 21 October 2026:",[155,21596,21597,21613],{},[158,21598,21599],{},[161,21600,21601,21604,21607],{},[164,21602,21603],{},"Workable scope",[164,21605,21606],{},"What Workable says it covers",[164,21608,21609,21612],{},[41,21610,123],{"href":121,"rel":21611},[45]," objects that use it",[174,21614,21615,21628,21641,21654,21667,21680],{},[161,21616,21617,21622,21625],{},[179,21618,21619],{},[36,21620,21621],{},"r_candidates",[179,21623,21624],{},"Candidates, activities, offers",[179,21626,21627],{},"Candidate, application, document, activity, scorecard",[161,21629,21630,21635,21638],{},[179,21631,21632],{},[36,21633,21634],{},"r_jobs",[179,21636,21637],{},"Jobs, stages, members, events, accounts",[179,21639,21640],{},"Job, application status, interview, company",[161,21642,21643,21648,21651],{},[179,21644,21645],{},[36,21646,21647],{},"w_candidates",[179,21649,21650],{},"Creating and changing candidates, comments, copying candidates onto jobs",[179,21652,21653],{},"Writes to candidates, applications, documents and activities",[161,21655,21656,21661,21664],{},[179,21657,21658],{},[36,21659,21660],{},"r_account",[179,21662,21663],{},"Departments",[179,21665,21666],{},"HR & Directory group",[161,21668,21669,21674,21677],{},[179,21670,21671],{},[36,21672,21673],{},"r_employees",[179,21675,21676],{},"Employee records (Workable flags this scope as sensitive)",[179,21678,21679],{},"HR & Directory employee",[161,21681,21682,21700,21702],{},[179,21683,21684,21685,21687,21688,21690,21691,21693,21694,21699],{},"Native webhooks also need ",[36,21686,21621],{}," (candidates) or ",[36,21689,21673],{}," (employees). If a customer can't find a scope you asked for, it isn't on Workable's token form: some scopes are only available to partner OAuth apps. When the token expires, the customer selects ",[31,21692,21531],{}," in Workable. The token stays the same, so the connection keeps working. If a token is revoked instead, ask the customer to ",[41,21695,21698],{"href":21696,"rel":21697},"https:\u002F\u002Fdocs.unified.to\u002Fconcepts\u002Fembedded-components",[45],"re-authorize the same connection"," with a new token. The connection keeps its ID.",[179,21701],{},[179,21703],{},[55,21705,21707],{"id":21706},"how-do-you-get-workable-oauth-2-credentials","How do you get Workable OAuth 2 credentials?",[22,21709,21710,21711,741,21713,21716],{},"Workable issues OAuth 2 credentials only to official partners. Once Workable approves you, it gives you a ",[36,21712,7513],{},[36,21714,21715],{},"client_secret"," (Workable OAuth documentation, as of 21 October 2026). There is no self-serve app registration.",[2510,21718,21719,21727,21754,21771],{},[2357,21720,21721,21726],{},[41,21722,21725],{"href":21723,"rel":21724},"https:\u002F\u002Fwww.workable.com\u002Fpartnership-program\u002Fapply?utm_source=unified.to&utm_medium=unified.to%20blog&utm_campaign=unifedto_partner",[45],"Apply to Workable's partnership program",". As of 21 October 2026, Workable's 3rd Party Integration Partner tier has no mutual-customer minimum and accepts integrations built on a unified API; its Native Integration Partner tier requires at least 15 mutual customers.",[2357,21728,21729,21730,21733,21734],{},"When Workable provisions your credentials, give it the ",[41,21731,123],{"href":121,"rel":21732},[45]," redirect URI for your workspace's region. Every authorization must use exactly the redirect URI you gave Workable at provisioning, so register each region you use:\n",[2354,21735,21736,21742,21748],{},[2357,21737,21738,21739],{},"US (every plan): ",[36,21740,21741],{},"https:\u002F\u002Fapi.unified.to\u002Foauth\u002Fcode",[2357,21743,21744,21745],{},"EU (Pro and Scale): ",[36,21746,21747],{},"https:\u002F\u002Fapi-eu.unified.to\u002Foauth\u002Fcode",[2357,21749,21750,21751],{},"AU (Pro and Scale): ",[36,21752,21753],{},"https:\u002F\u002Fapi-au.unified.to\u002Foauth\u002Fcode",[2357,21755,21756,21757,21759,21760,21763,21764,21767,21768,21770],{},"Ask Workable for the scopes your product needs. The ",[31,21758,6814],{}," tab on ",[41,21761,123],{"href":121,"rel":21762},[45],"'s Workable activation page lists the redirect URI and the Workable scopes for each ",[41,21765,123],{"href":121,"rel":21766},[45]," object. Request ",[36,21769,21647],{}," only if you create or update candidates, applications or documents.",[2357,21772,20403,21773,21776,21777,97],{},[41,21774,123],{"href":121,"rel":21775},[45],", paste the client ID and client secret on the Workable activation page and select ",[31,21778,16295],{},[22,21780,21781,21782,21785,21786,97],{},"With OAuth 2, the customer still enters their account subdomain. Workable access tokens last 7,200 seconds, and ",[41,21783,123],{"href":121,"rel":21784},[45]," renews them with the refresh token, which Workable replaces on every refresh. If a customer revokes access in Workable, ask them to ",[41,21787,21698],{"href":21696,"rel":21788},[45],[22,21790,21791,21792,21796,21797,97],{},"For help with a Workable partnership, email ",[41,21793,21795],{"href":21794},"mailto:hello@unified.to","hello@unified.to"," or ask on ",[41,21798,21800],{"href":4362,"rel":21799},[45],"Discord",[55,21802,21804,21805,3610],{"id":21803},"how-do-you-activate-workable-in-unifiedto","How do you activate Workable in ",[41,21806,123],{"href":121,"rel":21807},[45],[22,21809,21810,21811,21815,21816,21818,21819,4149,21822,21825],{},"Sign in to ",[41,21812,21814],{"href":4146,"rel":21813},[45],"app.unified.to",", open ",[31,21817,4433],{},", and search for Workable. You can also find it under the ",[31,21820,21821],{},"ATS",[31,21823,21824],{},"HR & Directory"," category.",[22,21827,21828],{},[4201,21829],{"alt":21830,"src":21831},"Screenshot_2026-10-21_at_9.48.50_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fgetting_started_with_workable-0.png",[22,21833,21834,21835,21837,21838,97],{},"Select ",[31,21836,21439],{},". On the authorization page, choose the categories (ATS, HR & Directory) and the authorization methods your customers can use: API token, OAuth 2 or both. For OAuth 2, enter your Workable client ID and client secret. Then select ",[31,21839,16295],{},[22,21841,21842],{},[4201,21843],{"alt":21844,"src":21845},"Screenshot_2026-10-21_at_9.49.54_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fgetting_started_with_workable-1.png",[22,21847,21848],{},[4201,21849],{"alt":21850,"src":21851},"Screenshot_2026-10-21_at_9.50.22_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fgetting_started_with_workable-2.png",[22,21853,21854,21855,21858],{},"Activation applies to the environment selected in ",[41,21856,21814],{"href":4146,"rel":21857},[45],". Activate Workable in each environment you use, such as Sandbox and Production, with that environment's credentials. As of 19 October 2026, activated integrations can't be copied between environments.",[22,21860,8879,21861,21864,21865,21868,21869,97],{},[31,21862,21863],{},"Feature Support"," tab shows the objects and fields ",[41,21866,123],{"href":121,"rel":21867},[45],"'s Workable integration supports. The same objects, methods and fields are listed publicly on the ",[41,21870,21873],{"href":21871,"rel":21872},"https:\u002F\u002Fdocs.unified.to\u002Fintegrations\u002Fworkable",[45],"Workable integration page",[22,21875,21876],{},[4201,21877],{"alt":21878,"src":21879},"Screenshot_2026-10-21_at_9.50.48_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fgetting_started_with_workable-3.png",[55,21881,21883],{"id":21882},"what-can-you-read-and-write-with-a-workable-connection","What can you read and write with a Workable connection?",[22,21885,21886,21887,21890],{},"As of 19 October 2026, ",[41,21888,123],{"href":121,"rel":21889},[45],"'s Workable integration reads candidates, applications, jobs, documents, activities, interviews, scorecards, stages and companies in ATS, and employees and departments in HR & Directory. It writes candidates, applications, documents and activities.",[155,21892,21893,21910],{},[158,21894,21895],{},[161,21896,21897,21903,21905,21907],{},[164,21898,21899,21902],{},[41,21900,123],{"href":121,"rel":21901},[45]," object",[164,21904,4650],{},[164,21906,4653],{},[164,21908,21909],{},"Change events",[174,21911,21912,21926,21939,21951,21965,21978,21989,22000,22012,22023,22034,22045],{},[161,21913,21914,21917,21920,21923],{},[179,21915,21916],{},"Candidate",[179,21918,21919],{},"List, Get",[179,21921,21922],{},"Create (needs a job), Update",[179,21924,21925],{},"Native and virtual webhooks (created, updated)",[161,21927,21928,21931,21933,21936],{},[179,21929,21930],{},"Application",[179,21932,21919],{},[179,21934,21935],{},"Create, Update",[179,21937,21938],{},"Virtual webhooks",[161,21940,21941,21944,21946,21949],{},[179,21942,21943],{},"Job",[179,21945,21919],{},[179,21947,21948],{},"None (read-only)",[179,21950,21938],{},[161,21952,21953,21956,21959,21962],{},[179,21954,21955],{},"Document",[179,21957,21958],{},"List (by application), Get",[179,21960,21961],{},"Create, Update, Remove",[179,21963,21964],{},"None",[161,21966,21967,21970,21973,21976],{},[179,21968,21969],{},"Activity",[179,21971,21972],{},"List (by candidate)",[179,21974,21975],{},"Create",[179,21977,21964],{},[161,21979,21980,21983,21985,21987],{},[179,21981,21982],{},"Interview",[179,21984,21919],{},[179,21986,21964],{},[179,21988,21964],{},[161,21990,21991,21994,21996,21998],{},[179,21992,21993],{},"Scorecard",[179,21995,21972],{},[179,21997,21964],{},[179,21999,21938],{},[161,22001,22002,22005,22008,22010],{},[179,22003,22004],{},"Application status (stages)",[179,22006,22007],{},"List",[179,22009,21964],{},[179,22011,21964],{},[161,22013,22014,22017,22019,22021],{},[179,22015,22016],{},"Company",[179,22018,22007],{},[179,22020,21964],{},[179,22022,21964],{},[161,22024,22025,22027,22029,22031],{},[179,22026,21679],{},[179,22028,21919],{},[179,22030,21964],{},[179,22032,22033],{},"Native webhooks",[161,22035,22036,22039,22041,22043],{},[179,22037,22038],{},"HR & Directory group (departments)",[179,22040,21919],{},[179,22042,21964],{},[179,22044,21964],{},[161,22046,22047,22050,22052,22054],{},[179,22048,22049],{},"For Workable endpoints outside these objects, use the Passthrough API (GET, POST, PUT, DELETE).",[179,22051],{},[179,22053],{},[179,22055],{},[22,22057,22058,22059,22064],{},"In Workable, a candidate is created on a job, and putting the same person on another job means creating the candidate again on that job, under a new Workable ID. See ",[41,22060,22063],{"href":22061,"rel":22062},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fworkable_creating_candidates_and_attaching_them_to_jobs",[45],"Workable: creating candidates and attaching them to jobs"," before you write candidates.",[22,22066,22067],{},"Assessment vendors use a separate integration, Workable Assessment (launched 6 February 2026). It is authorized with a Workable partner API key and handles assessment packages and orders.",[55,22069,22071],{"id":22070},"how-do-workable-change-events-reach-your-app","How do Workable change events reach your app?",[22,22073,22074,22075,22078,22079,22082],{},"Candidate and employee changes can arrive as native webhooks, which ",[41,22076,123],{"href":121,"rel":22077},[45]," forwards as Workable sends them. Applications, jobs and scorecards use virtual webhooks, which check for changes at an interval you set, as often as every minute on paid plans; a check that finds nothing isn't billed. Candidates support both types. As of 20 October 2026, ",[41,22080,123],{"href":121,"rel":22081},[45]," lists created and updated events for Workable objects, not deleted events.",[22,22084,22085,22086,22089,22090,22093,22094,22097],{},"Workable's ",[36,22087,22088],{},"candidate_created"," event feeds ",[41,22091,123],{"href":121,"rel":22092},[45],"'s native candidate created event, and only ",[36,22095,22096],{},"candidate_moved"," (a stage change) feeds native candidate updated; other candidate changes reach you through virtual webhooks.",[22,22099,22100,22101,22104,22105,22109,22110,22115,22116,22119,22120,22122,22123,22125],{},"Create webhooks in ",[41,22102,21814],{"href":4146,"rel":22103},[45]," or with the ",[41,22106,22108],{"href":5717,"rel":22107},[45],"webhooks API",". See ",[41,22111,22114],{"href":22112,"rel":22113},"https:\u002F\u002Fdocs.unified.to\u002Fconcepts\u002Fvirtual_webhooks",[45],"virtual webhooks"," for how checks and retries work. Native Workable webhooks need no setup in the customer's Workable account: ",[41,22117,123],{"href":121,"rel":22118},[45]," subscribes when you create the webhook. The connection must include ",[36,22121,21621],{}," for candidate events or ",[36,22124,21673],{}," for employee events. Without them, webhook creation fails with \"Failed to subscribe\".",[55,22127,22129],{"id":22128},"how-do-you-add-workable-to-your-app","How do you add Workable to your app?",[22,22131,22132],{},"Add the Authorization component to your app, or build your own list of integrations with the API.",[22,22134,22135,22138,22139,22142,22143,22146,22147,22150,22151,20056],{},[31,22136,22137],{},"Workspace and environments."," When you create a ",[41,22140,123],{"href":121,"rel":22141},[45]," account, ",[41,22144,123],{"href":121,"rel":22145},[45]," creates a workspace for you. A workspace holds environments, such as Sandbox, staging and production, and each environment has its own active integrations and credentials. You can add environments under ",[31,22148,22149],{},"Workspace Settings"," on any plan (",[41,22152,22155],{"href":22153,"rel":22154},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fset_environments_for_your_unified_workspace",[45],"set environments",[22,22157,22158,22161,22162,97],{},[31,22159,22160],{},"Workspace ID."," The Authorization component needs your workspace ID. Find it under ",[31,22163,22164],{},"Settings > API Keys",[22,22166,22167,22170,22171,22176,22177,22180],{},[31,22168,22169],{},"Authorization component."," Open ",[41,22172,22175],{"href":22173,"rel":22174},"https:\u002F\u002Fapp.unified.to\u002Fembed?tab=Authorization",[45],"app.unified.to\u002Fembed",", configure the Authorization component and copy its snippet into your app with your workspace ID. Components are available for React, Angular, Vue, Svelte and plain JavaScript. Select the permission scopes your product needs; if you leave them blank, ",[41,22178,123],{"href":121,"rel":22179},[45]," requests every scope the integration supports. The preview shows the Workable authorization page your customers see.",[22,22182,22183,22186,22187,22190,22191,97],{},[31,22184,22185],{},"Your own front end."," To build your own list, call ",[36,22188,22189],{},"GET \u002Funified\u002Fintegration\u002Fworkspace\u002F{workspace_id}",", which returns all activated integrations in a workspace. Then send customers to the authorization URL from ",[36,22192,22193],{},"GET \u002Funified\u002Fintegration\u002Fauth\u002F{workspace_id}\u002F{integration_type}",[55,22195,22197],{"id":22196},"what-happens-after-a-customer-connects-workable","What happens after a customer connects Workable?",[22,22199,22200,22201,22204,22205,22207,22208,319,22211,319,22214,741,22216,22219,22220,22222,22223,20056],{},"After a customer authorizes Workable, ",[41,22202,123],{"href":121,"rel":22203},[45]," redirects them to your success URL. The URL carries ",[36,22206,5072],{}," (the connection ID), ",[36,22209,22210],{},"state",[36,22212,22213],{},"nonce",[36,22215,3397],{},[36,22217,22218],{},"sig",". Before you store anything, check ",[36,22221,22218],{}," against your workspace secret (",[41,22224,22226],{"href":21696,"rel":22225},[45],"embedded components",[22,22228,22229,22231,22232,22234],{},[31,22230,6271],{}," pass your own user or account ID in ",[36,22233,22210],{},". It comes back on the success URL with the connection ID, so you can store the two together.",[22236,22237],"iframe",{"width":22238,"height":22239,"src":22240,"title":22241,"frameBorder":3604,"allow":22242,"allowFullScreen":2459},560,315,"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fsd9Efb4i9N0?si=f-ztv2g3nFdRiq_S","YouTube video player","accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share",[22,22244,22245,22246,22249],{},"From then on, call the API with that connection ID, for example ",[36,22247,22248],{},"GET \u002Fats\u002F{connection_id}\u002Fcandidate",". A connection is one customer's authorization of one integration.",[55,22251,22253],{"id":22252},"how-do-you-test-without-a-workable-account","How do you test without a Workable account?",[22,22255,22256,22257,22260,22261,22264,22265,22268,22269,20056],{},"Use the Sandbox (synthetic data) environment. Switch the environment in ",[41,22258,21814],{"href":4146,"rel":22259},[45]," to ",[31,22262,22263],{},"Sandbox (synthetic data)",", activate Workable with any credentials, and create a test connection under ",[31,22266,22267],{},"Connections > Create test connection",". Calls on that connection return synthetic data and don't reach Workable (",[41,22270,22272],{"href":16303,"rel":22271},[45],"sandbox environment",[22236,22274],{"width":22238,"height":22239,"src":22275,"title":22241,"frameBorder":3604,"allow":22242,"allowFullScreen":2459},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FjA6_Dot5kN0?si=jRPZqnVkIoq6YYKP",[22,22277,22278,22279,22282,22283,22286,22287,20056],{},"To get mock data on a single request, send the header ",[36,22280,22281],{},"X-Mock: 1"," with an empty ",[36,22284,22285],{},"Authorization"," header (",[41,22288,22291],{"href":22289,"rel":22290},"https:\u002F\u002Fdocs.unified.to\u002Freference\u002Fmock",[45],"mock server",[55,22293,22295],{"id":22294},"which-sdks-can-you-use","Which SDKs can you use?",[22,22297,22298,22299,97],{},"SDKs are available for TypeScript, Python, PHP, Java, Go, C# and Ruby. ",[41,22300,22303],{"href":22301,"rel":22302},"https:\u002F\u002Fdocs.unified.to\u002Freference\u002Fsdks",[45],"Learn more",[55,22305,22307],{"id":22306},"where-to-go-next","Where to go next",[2354,22309,22310,22315,22322,22329],{},[2357,22311,22312],{},[41,22313,22063],{"href":22061,"rel":22314},[45],[2357,22316,22317],{},[41,22318,22321],{"href":22319,"rel":22320},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_build_a_candidate_sourcing_or_job_board_app_with_unified",[45],"Build a candidate sourcing or job board app",[2357,22323,22324],{},[41,22325,22328],{"href":22326,"rel":22327},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_build_a_candidate_assessment_product_with_unified",[45],"Build a candidate assessment product",[2357,22330,22331],{},[41,22332,21873],{"href":21871,"rel":22333},[45],[22,22335,22336,22337,22341,22342,97],{},"Have a question? Complete ",[41,22338,22340],{"href":20543,"rel":22339},[45],"this form"," or chat with us on ",[41,22343,21800],{"href":4362,"rel":22344},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":22346},[22347,22348,22349,22350,22351,22353,22354,22355,22356,22357,22358,22359],{"id":21409,"depth":2434,"text":21410},{"id":21446,"depth":2434,"text":21447},{"id":21551,"depth":2434,"text":21552},{"id":21706,"depth":2434,"text":21707},{"id":21803,"depth":2434,"text":22352},"How do you activate Workable in Unified.to?",{"id":21882,"depth":2434,"text":21883},{"id":22070,"depth":2434,"text":22071},{"id":22128,"depth":2434,"text":22129},{"id":22196,"depth":2434,"text":22197},{"id":22252,"depth":2434,"text":22253},{"id":22294,"depth":2434,"text":22295},{"id":22306,"depth":2434,"text":22307},"To add Workable to your product with Unified.to, activate the Workable integration in your workspace and choose how customers authorize it, a Workable API...",{"img":22362,"date":22363,"updated":22364,"tag":2457,"integrations":22365},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fgetting_started_with_workable-icon.png","2024-01-11T00:00:00.000Z","2026-10-21T14:17:20.730Z","workable","\u002Fguides\u002Fgetting_started_with_workable",{"title":21374,"description":22360},"guides\u002Fgetting_started_with_workable","ZlX0PLSXnpXoJMdlOhmgt3S7GT_3rwiw6LkSJlbT5R0",{"id":22371,"title":22372,"body":22373,"description":22663,"extension":2452,"meta":22664,"navigation":2459,"path":22669,"seo":22670,"stem":22671,"__hash__":22672},"guides\u002Fguides\u002Fhandling_delegated_vs_application_scopes_in_microsoft_integrations.md","Handling Delegated vs. Application Scopes in Microsoft Integrations",{"type":12,"value":22374,"toc":22655},[22375,22378,22380,22385,22394,22397,22400,22403,22409,22415,22422,22425,22439,22445,22452,22455,22473,22476,22499,22501,22507,22510,22528,22539,22542,22544,22550,22556,22624,22630,22636,22644],[15,22376,22372],{"id":22377},"handling-delegated-vs-application-scopes-in-microsoft-integrations",[19,22379],{},[22,22381,22382],{},[25,22383,22384],{},"December 9, 2025",[22,22386,22387,22388,741,22391,22393],{},"Microsoft Graph offers two fundamentally different permission models — ",[31,22389,22390],{},"Delegated",[31,22392,21930],{}," scopes. Understanding how these scopes behave is important when connecting Microsoft integrations through Unified.",[22,22395,22396],{},"Some Microsoft APIs only support delegated permissions, while others require strictly application-level permissions. Mixing them in a single OAuth flow will cause failures.",[22,22398,22399],{},"In Unified, you can create separate Microsoft connections so you can cleanly target the scopes required for the endpoints you plan to use.",[22,22401,22402],{},"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.",[55,22404,22406],{"id":22405},"_1-delegated-vs-application-permissions",[31,22407,22408],{},"1. Delegated vs. Application Permissions",[3629,22410,22412],{"id":22411},"delegated-permissions",[31,22413,22414],{},"Delegated Permissions",[22,22416,22417,22418,22421],{},"Delegated permissions are used when a ",[31,22419,22420],{},"signed-in Microsoft user"," is present in the OAuth flow.",[22,22423,22424],{},"Use delegated permissions when:",[2354,22426,22427,22433,22436],{},[2357,22428,22429,22430],{},"The API needs to act ",[31,22431,22432],{},"on behalf of a user",[2357,22434,22435],{},"You want to access data the user normally has permission to view",[2357,22437,22438],{},"The Microsoft Graph endpoint explicitly supports delegated scopes",[3629,22440,22442],{"id":22441},"application-permissions",[31,22443,22444],{},"Application Permissions",[22,22446,22447,22448,22451],{},"Application permissions are used when ",[31,22449,22450],{},"no user is logged in",", and the app accesses Microsoft Graph directly as itself.",[22,22453,22454],{},"Use application permissions when:",[2354,22456,22457,22463,22466],{},[2357,22458,22459,22460],{},"A Microsoft endpoint ",[31,22461,22462],{},"does not support delegated scopes",[2357,22464,22465],{},"The API involves system-level or tenant-wide data",[2357,22467,22468,22469,22472],{},"The OAuth token must come from the ",[31,22470,22471],{},"client_credentials"," flow",[22,22474,22475],{},"Examples of Unified endpoints that only support application scopes:",[2354,22477,22478],{},[2357,22479,22480,22485,22486],{},[31,22481,22482],{},[36,22483,22484],{},"uc_call"," (MS Teams call records API)\n",[2354,22487,22488],{},[2357,22489,22490,22491,22494,22495,22498],{},"Microsoft Graph requires ",[36,22492,22493],{},"CallRecords.Read.All"," as an ",[31,22496,22497],{},"application permission",", not delegated.",[19,22500],{},[55,22502,22504],{"id":22503},"_2-why-you-cannot-mix-delegated-and-application-scopes",[31,22505,22506],{},"2. Why You Cannot Mix Delegated and Application Scopes",[22,22508,22509],{},"Microsoft Graph enforces strict separation between permission types:",[2354,22511,22512,22519,22525],{},[2357,22513,22514,22515,22518],{},"Delegated scopes must be requested during a ",[31,22516,22517],{},"user login"," OAuth flow",[2357,22520,22521,22522],{},"Application scopes must be requested using ",[31,22523,22524],{},"client credentials",[2357,22526,22527],{},"A single OAuth authorization cannot request both delegated and application permissions",[22,22529,22530,22531,22534,22535,22538],{},"If you request an application-only permission in a user sign-in flow, the request fails. For example, ",[36,22532,22533],{},"OnlineMeetings.Read.All"," has no delegated form, so in a user sign-in Microsoft treats it as a scope that doesn't exist and returns ",[36,22536,22537],{},"AADSTS650053",", which Microsoft's error reference describes as: \"The application '{name}' asked for scope '{scope}' that doesn't exist on the resource '{resource}'.\" No token is issued, and the Unified connection fails to authenticate.",[22,22540,22541],{},"Because of this, selecting both scope types for the same Unified connection will not work.",[19,22543],{},[55,22545,22547],{"id":22546},"_3-how-to-configure-a-microsoft-teams-connection",[31,22548,22549],{},"3. How to configure a Microsoft Teams connection",[22,22551,22552,22553,22555],{},"Microsoft Teams uses delegated permissions for Messaging, HRIS and Calendar, and application permissions for call records (",[36,22554,22484],{},"). Before your end users can authorize a Microsoft Teams connection, register an app in Microsoft Azure and add the permissions for the objects you plan to use.",[2510,22557,22558,22569,22591,22616],{},[2357,22559,22560,22563,22564,20056],{},[31,22561,22562],{},"Register the app."," Register an application in Azure and get its Client ID and Client Secret (",[41,22565,22568],{"href":22566,"rel":22567},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365",[45],"registration guide",[2357,22570,22571,22574,22575,22578,22579,22582,22583,22586,22587,22590],{},[31,22572,22573],{},"Add delegated permissions."," In the app, open ",[31,22576,22577],{},"API Permissions",", click ",[31,22580,22581],{},"Add a permission",", select ",[31,22584,22585],{},"Microsoft Graph",", then ",[31,22588,22589],{},"Delegated permissions",", and add the permissions for the Messaging, HRIS and Calendar objects you need.",[2357,22592,22593,22596,22597,22600,22601,319,22603,319,22606,319,22609,741,22612,22615],{},[31,22594,22595],{},"Add application permissions for call records."," Repeat the steps with ",[31,22598,22599],{},"Application permissions"," and add ",[36,22602,22493],{},[36,22604,22605],{},"OnlineMeetingRecording.Read.All",[36,22607,22608],{},"OnlineMeetingTranscript.Read.All",[36,22610,22611],{},"CallRecordings.Read.All",[36,22613,22614],{},"CallTranscripts.Read.All",". Application permissions need admin consent in the customer's tenant.",[2357,22617,22618,22621,22622,97],{},[31,22619,22620],{},"Create the connection."," In Unified, enter the Client ID and Client Secret and click ",[31,22623,16295],{},[22,22625,22626,22629],{},[31,22627,22628],{},"Call records use a separate connection."," Messaging, HRIS and Calendar run on a connection your end user authorizes by signing in. For call records, Unified's Microsoft Teams integration also supports an app-only (organization-level) connection created with your app's Client ID, Client Secret and the customer's Tenant ID (as of 8 October 2026), after a tenant admin grants consent for the application permissions above.",[22,22631,22632,22635],{},[31,22633,22634],{},"Use your own Azure app in production."," Unified's own credentials are for testing; in production, the consent screen your customers see should be your app's.",[22,22637,22638,22639,97],{},"The full steps, with screenshots, are in ",[41,22640,22643],{"href":22641,"rel":22642},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_create_a_connection_in_microsoft_teams",[45],"How to create a Connection in Microsoft Teams",[22,22645,22646,22649,22650,97],{},[31,22647,22648],{},"Bot-based messaging."," Microsoft Teams (bot) is a separate Unified integration for channels, messages and message events. It uses delegated permissions only, and the bot has to be packaged and installed in the right team, channel or chat before API calls work; see ",[41,22651,22654],{"href":22652,"rel":22653},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_set_up_a_microsoft_teams_bot_with_unified",[45],"How to Set Up a Microsoft Teams Bot with Unified",{"title":2433,"searchDepth":2434,"depth":2434,"links":22656},[22657,22661,22662],{"id":22405,"depth":2434,"text":22408,"children":22658},[22659,22660],{"id":22411,"depth":2613,"text":22414},{"id":22441,"depth":2613,"text":22444},{"id":22503,"depth":2434,"text":22506},{"id":22546,"depth":2434,"text":22549},"Microsoft Graph offers two fundamentally different permission models — Delegated and Application scopes. Understanding how these scopes behave is important...",{"img":22665,"date":22666,"updated":22667,"tag":2457,"integrations":22668},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhandling_delegated_vs_application_scopes_in_microsoft_integrations-icon.png","2025-12-09T21:05:00.000Z","2026-10-20T00:51:24.317Z","microsoft","\u002Fguides\u002Fhandling_delegated_vs_application_scopes_in_microsoft_integrations",{"title":22372,"description":22663},"guides\u002Fhandling_delegated_vs_application_scopes_in_microsoft_integrations","yJj9mXOJD1uUf2_6MPXYJhlgoWxwwtPu5g3AbJvPc-A",{"id":22674,"title":22675,"body":22676,"description":23008,"extension":2452,"meta":23009,"navigation":2459,"path":23014,"seo":23015,"stem":23016,"__hash__":23017},"guides\u002Fguides\u002Fhibob_and_unified_connection_and_time_off_guide.md","HiBob & Unified: connection and time off guide",{"type":12,"value":22677,"toc":22989},[22678,22681,22683,22688,22702,22716,22725,22727,22731,22775,22781,22783,22787,22793,22797,22800,22836,22840,22844,22851,22855,22872,22876,22892,22896,22903,22907,22914,22918,22925,22929,22932,22942,22946,22958,22960,22964,22967,22970,22980,22983],[15,22679,22675],{"id":22680},"hibob-unified-connection-and-time-off-guide",[19,22682],{},[22,22684,22685],{},[25,22686,22687],{},"April 22, 2026",[22,22689,22690,22691,5539,22694,22697,22698,22701],{},"This guide explains how to connect ",[31,22692,22693],{},"HiBob",[31,22695,22696],{},"Unified"," for HRIS use cases, which credentials to use, and how ",[31,22699,22700],{},"time off","works in our implementation, including:",[2354,22703,22704,22709],{},[2357,22705,22706,22708],{},[36,22707,16842],{}," time off fields",[2357,22710,22711,22712,22715],{},"the ",[36,22713,22714],{},"hris_timeoff"," object",[22,22717,22718,8032,22721],{},[31,22719,22720],{},"Official HiBob API reference:",[41,22722,22723],{"href":22723,"rel":22724},"https:\u002F\u002Fapidocs.hibob.com\u002Fdocs",[45],[19,22726],{},[55,22728,22730],{"id":22729},"creating-credentials-in-hibob","Creating credentials in HiBob",[2510,22732,22733,22739,22746,22752,22758],{},[2357,22734,22735,22736],{},"In HiBob, go to ",[31,22737,22738],{},"Settings → Integrations → Automation → Service Users",[2357,22740,22741,22742,22745],{},"Create or select a ",[31,22743,22744],{},"service user"," intended for API access",[2357,22747,22748,22749],{},"Copy the ",[31,22750,22751],{},"Service User ID",[2357,22753,22754,22755],{},"Generate or copy the ",[31,22756,22757],{},"Service User Token",[2357,22759,22760,22761],{},"Paste:\n",[2354,22762,22763,22769],{},[2357,22764,22711,22765,22768],{},[31,22766,22767],{},"ID"," into the first credential field in Unified",[2357,22770,22711,22771,22774],{},[31,22772,22773],{},"Token"," into the second credential field in Unified",[22,22776,22777,22780],{},[31,22778,22779],{},"Note:"," Store the token securely and rotate it if exposed.",[19,22782],{},[55,22784,22786],{"id":22785},"hris_timeoff-required-permissions","hris_timeoff – Required Permissions",[22,22788,22789,22790,97],{},"Before accessing time off data, ensure the ",[31,22791,22792],{},"service user has the correct permissions",[3629,22794,22796],{"id":22795},"visibility-rules","Visibility Rules",[22,22798,22799],{},"Time off policies can be:",[2354,22801,22802,22805,22808,22811,22814],{},[2357,22803,22804],{},"Public",[2357,22806,22807],{},"Public with custom name",[2357,22809,22810],{},"Private",[2357,22812,22813],{},"Private requests are only visible if permission is granted",[2357,22815,22816,22817,22820,22821],{},"Responses include a ",[36,22818,22819],{},"visibility"," field:\n",[2354,22822,22823,22827,22831],{},[2357,22824,22825],{},[36,22826,22804],{},[2357,22828,22829],{},[36,22830,22810],{},[2357,22832,22833],{},[36,22834,22835],{},"Custom name",[3629,22837,22839],{"id":22838},"required-permissions","Required Permissions",[3629,22841,22843],{"id":22842},"get-requests","Get Requests",[2354,22845,22846],{},[2357,22847,22848],{},[31,22849,22850],{},"People's Data → Time off → See who's out today → See who's out",[3629,22852,22854],{"id":22853},"private-requests","Private Requests",[2354,22856,22857,22862],{},[2357,22858,22859],{},[31,22860,22861],{},"People's Data → Time off → See who's out today → See who's out because of a private policy or policies with a custom name",[2357,22863,22864,22865],{},"Some endpoints require:\n",[2354,22866,22867],{},[2357,22868,22869],{},[36,22870,22871],{},"includePrivate: true",[3629,22873,22875],{"id":22874},"pending-requests","Pending Requests",[2354,22877,22878,22883],{},[2357,22879,22880],{},[31,22881,22882],{},"People's Data → Time off → Requests → Create, edit all fields, and cancel people's requests that haven't been approved yet",[2357,22884,22864,22885],{},[2354,22886,22887],{},[2357,22888,22889],{},[36,22890,22891],{},"includePending: true",[3629,22893,22895],{"id":22894},"get-request-by-id","Get Request by ID",[2354,22897,22898],{},[2357,22899,22900],{},[31,22901,22902],{},"People's Data → Time off → Requests → Create, edit, and cancel people's requests that haven't been approved yet",[3629,22904,22906],{"id":22905},"request-attachments","Request Attachments",[2354,22908,22909],{},[2357,22910,22911],{},[31,22912,22913],{},"People's Data → Time off → Requests → Upload, edit and view attachments in people's requests",[3629,22915,22917],{"id":22916},"policies-policy-types","Policies & Policy Types",[2354,22919,22920],{},[2357,22921,22922],{},[31,22923,22924],{},"Features → Time off → Settings → Manage company's time off settings",[3629,22926,22928],{"id":22927},"create-request","Create Request",[22,22930,22931],{},"Requires BOTH:",[2354,22933,22934,22938],{},[2357,22935,22936],{},[31,22937,22924],{},[2357,22939,22940],{},[31,22941,22902],{},[3629,22943,22945],{"id":22944},"time-off-balance","Time Off Balance",[2354,22947,22948,22953],{},[2357,22949,22950],{},[31,22951,22952],{},"People's Data → Time off → Balance → See selected people's time off and sick leave balances",[2357,22954,22955],{},[31,22956,22957],{},"People's Data → Time off → Balance → Adjust selected people's time off balances and bank their overtime",[19,22959],{},[55,22961,22963],{"id":22962},"hris_employee-required-permissions","hris_employee – Required Permissions",[22,22965,22966],{},"To access time off balances and policies:",[3629,22968,22945],{"id":22969},"time-off-balance-1",[2354,22971,22972,22976],{},[2357,22973,22974],{},[31,22975,22952],{},[2357,22977,22978],{},[31,22979,22957],{},[3629,22981,22917],{"id":22982},"policies-policy-types-1",[2354,22984,22985],{},[2357,22986,22987],{},[31,22988,22924],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":22990},[22991,22992,23004],{"id":22729,"depth":2434,"text":22730},{"id":22785,"depth":2434,"text":22786,"children":22993},[22994,22995,22996,22997,22998,22999,23000,23001,23002,23003],{"id":22795,"depth":2613,"text":22796},{"id":22838,"depth":2613,"text":22839},{"id":22842,"depth":2613,"text":22843},{"id":22853,"depth":2613,"text":22854},{"id":22874,"depth":2613,"text":22875},{"id":22894,"depth":2613,"text":22895},{"id":22905,"depth":2613,"text":22906},{"id":22916,"depth":2613,"text":22917},{"id":22927,"depth":2613,"text":22928},{"id":22944,"depth":2613,"text":22945},{"id":22962,"depth":2434,"text":22963,"children":23005},[23006,23007],{"id":22969,"depth":2613,"text":22945},{"id":22982,"depth":2613,"text":22917},"This guide explains how to connect HiBob to Unified for HRIS use cases, which credentials to use, and how time offworks in our implementation, including,",{"img":23010,"date":23011,"updated":23012,"tag":2457,"integrations":23013},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhibob_and_unified_connection_and_time_off_guide-icon.png","2026-04-22T20:21:00.000Z","2026-08-23T14:53:17.667Z","hibob","\u002Fguides\u002Fhibob_and_unified_connection_and_time_off_guide",{"title":22675,"description":23008},"guides\u002Fhibob_and_unified_connection_and_time_off_guide","qfRT9cs2EXU6bt3VQg0xpVPi8ZPV_mrD0DfraaXnIBw",{"id":23019,"title":23020,"body":23021,"description":23243,"extension":2452,"meta":23244,"navigation":2459,"path":23248,"seo":23249,"stem":23250,"__hash__":23251},"guides\u002Fguides\u002Fhow_long_are_logs_retained.md","How long are logs retained",{"type":12,"value":23022,"toc":23239},[23023,23026,23028,23033,23039,23044,23050,23053,23106,23110,23121,23136,23140,23148,23155,23236],[15,23024,23020],{"id":23025},"how-long-are-logs-retained",[19,23027],{},[22,23029,23030],{},[25,23031,23032],{},"April 2, 2024",[22,23034,23035,23038],{},[41,23036,123],{"href":121,"rel":23037},[45]," keeps two types of logs.",[22,23040,23041,23043],{},[31,23042,20351],{}," record every API request, including the IP address, timestamp, HTTP method, path, connection ID and any errors. They never include customer data or payloads.",[22,23045,23046,23049],{},[31,23047,23048],{},"Operating logs"," record system events and are retained for 15 days.",[22,23051,23052],{},"API call log retention depends on your plan:",[155,23054,23055,23065],{},[158,23056,23057],{},[161,23058,23059,23062],{},[164,23060,23061],{},"Plan",[164,23063,23064],{},"API call log retention",[174,23066,23067,23075,23083,23090,23098],{},[161,23068,23069,23072],{},[179,23070,23071],{},"Test",[179,23073,23074],{},"30 days",[161,23076,23077,23080],{},[179,23078,23079],{},"Grow",[179,23081,23082],{},"60 days",[161,23084,23085,23088],{},[179,23086,23087],{},"Pro",[179,23089,23082],{},[161,23091,23092,23095],{},[179,23093,23094],{},"Scale",[179,23096,23097],{},"365 days",[161,23099,23100,23103],{},[179,23101,23102],{},"Enterprise",[179,23104,23105],{},"Custom",[3629,23107,23109],{"id":23108},"sending-logs-to-your-own-tools","Sending logs to your own tools",[22,23111,23112,23113,23116,23117,23120],{},"On the Test, Pro and Scale plans, you can send API call logs to Datadog, Grafana or ClickHouse for custom retention. Configure this in the ",[41,23114,123],{"href":121,"rel":23115},[45]," dashboard under ",[31,23118,23119],{},"Settings > Workspace > External Logging",". See:",[2354,23122,23123,23129],{},[2357,23124,23125],{},[41,23126,23128],{"href":20366,"rel":23127},[45],"Pushing API logs to your Datadog instance",[2357,23130,23131],{},[41,23132,23135],{"href":23133,"rel":23134},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fextended_observability_pushing_api_logs_to_grafana_loki",[45],"Pushing API logs to Grafana Loki",[3629,23137,23139],{"id":23138},"backing-up-your-api-call-logs","Backing up your API call logs",[22,23141,23142,23143,97],{},"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 ",[41,23144,23147],{"href":23145,"rel":23146},"https:\u002F\u002Fdocs.unified.to\u002Funified\u002Fapicall\u002FReturns_API_Calls",[45],"Unified.to Admin API",[22,23149,23150,23151,23154],{},"For example, if you use our Node SDK, you could perform a backup using the ",[36,23152,23153],{},"listUnifiedApicalls()"," method:",[2584,23156,23158],{"className":2689,"code":23157,"language":2691,"meta":2433,"style":2433},"import { UnifiedTo } from '@unified-api\u002Ftypescript-sdk';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: '\u003CYOUR_API_KEY_HERE>',\n    },\n});\n\nconst results = await sdk.unified.listUnifiedApicalls({  });\n",[36,23159,23160,23172,23176,23190,23195,23205,23209,23213,23217],{"__ignoreMap":2433},[414,23161,23162,23164,23166,23168,23170],{"class":2593,"line":2594},[414,23163,2699],{"class":2698},[414,23165,2713],{"class":2705},[414,23167,2716],{"class":2698},[414,23169,2719],{"class":2601},[414,23171,2706],{"class":2705},[414,23173,23174],{"class":2593,"line":2434},[414,23175,2740],{"emptyLinePlaceholder":2459},[414,23177,23178,23180,23182,23184,23186,23188],{"class":2593,"line":2613},[414,23179,2745],{"class":2698},[414,23181,2814],{"class":2607},[414,23183,2817],{"class":2698},[414,23185,2820],{"class":2698},[414,23187,2823],{"class":2597},[414,23189,2826],{"class":2705},[414,23191,23192],{"class":2593,"line":2625},[414,23193,23194],{"class":2705},"    security: {\n",[414,23196,23197,23200,23203],{"class":2593,"line":2677},[414,23198,23199],{"class":2705},"        jwt: ",[414,23201,23202],{"class":2601},"'\u003CYOUR_API_KEY_HERE>'",[414,23204,2757],{"class":2705},[414,23206,23207],{"class":2593,"line":2751},[414,23208,3548],{"class":2705},[414,23210,23211],{"class":2593,"line":2760},[414,23212,2846],{"class":2705},[414,23214,23215],{"class":2593,"line":2768},[414,23216,2740],{"emptyLinePlaceholder":2459},[414,23218,23219,23221,23223,23225,23227,23230,23233],{"class":2593,"line":2776},[414,23220,2745],{"class":2698},[414,23222,3858],{"class":2607},[414,23224,2817],{"class":2698},[414,23226,3002],{"class":2698},[414,23228,23229],{"class":2705}," sdk.unified.",[414,23231,23232],{"class":2597},"listUnifiedApicalls",[414,23234,23235],{"class":2705},"({  });\n",[4156,23237,23238],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":2433,"searchDepth":2434,"depth":2434,"links":23240},[23241,23242],{"id":23108,"depth":2613,"text":23109},{"id":23138,"depth":2613,"text":23139},"API call logs record every API request, including the IP address, timestamp, HTTP method, path, connection ID and any errors. They never include customer data...",{"img":23245,"date":23246,"updated":23247,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_long_are_logs_retained-icon.png","2024-04-02T00:00:00.000Z","2026-10-20T14:27:23.823Z","\u002Fguides\u002Fhow_long_are_logs_retained",{"title":23020,"description":23243},"guides\u002Fhow_long_are_logs_retained","dRad2cpZgVKEN6dGZabYsUVzyzkO1qFI4HYU8AFzG3M",{"id":23253,"title":23254,"body":23255,"description":23269,"extension":2452,"meta":23979,"navigation":2459,"path":23983,"seo":23984,"stem":23985,"__hash__":23986},"guides\u002Fguides\u002Fhow_to_access_employees_and_users.md","How to access employees and users",{"type":12,"value":23256,"toc":23975},[23257,23260,23262,23267,23270,23287,23337,23349,23353,23356,23925,23931,23937,23943,23946,23950,23972],[15,23258,23254],{"id":23259},"how-to-access-employees-and-users",[19,23261],{},[22,23263,23264],{},[25,23265,23266],{},"June 25, 2024",[22,23268,23269],{},"How do you get information on a customer account's users and employees?",[22,23271,23272,23275,23276,741,23281,23286],{},[41,23273,123],{"href":121,"rel":23274},[45]," returns a customer account's users and employees through the HR & Directory API's Employee endpoints, on HR integrations and on many CRM, ticketing, accounting and collaboration integrations that list employees, such as HubSpot, Zendesk, QuickBooks and Microsoft Teams. This is achieved using the HR ",[41,23277,23280],{"href":23278,"rel":23279},"https:\u002F\u002Fdocs.unified.to\u002Fhris\u002Femployee\u002FRetrieve_an_employee",[45],"Get Employee",[41,23282,23285],{"href":23283,"rel":23284},"https:\u002F\u002Fdocs.unified.to\u002Fhris\u002Femployee\u002FList_all_employees",[45],"List Employees"," API endpoints.",[2584,23288,23290],{"className":16485,"code":23289,"language":16487,"meta":2433,"style":2433},"GET \u002Fhris\u002F{connection_id}\u002Femployee\n\nGET \u002Fhris\u002F{connection_id}\u002Femployee\u002F{id}\n",[36,23291,23292,23311,23315],{"__ignoreMap":2433},[414,23293,23294,23296,23298,23301,23304,23307,23309],{"class":2593,"line":2594},[414,23295,9294],{"class":2607},[414,23297,11295],{"class":2698},[414,23299,23300],{"class":2705},"hris",[414,23302,23303],{"class":2698},"\u002F",[414,23305,23306],{"class":2705},"{connection_id}",[414,23308,23303],{"class":2698},[414,23310,6355],{"class":2705},[414,23312,23313],{"class":2593,"line":2434},[414,23314,2740],{"emptyLinePlaceholder":2459},[414,23316,23317,23319,23321,23323,23325,23327,23329,23332,23334],{"class":2593,"line":2613},[414,23318,9294],{"class":2607},[414,23320,11295],{"class":2698},[414,23322,23300],{"class":2705},[414,23324,23303],{"class":2698},[414,23326,23306],{"class":2705},[414,23328,23303],{"class":2698},[414,23330,23331],{"class":2705},"employee",[414,23333,23303],{"class":2698},[414,23335,23336],{"class":2705},"{id}\n",[22,23338,23339,23340,23343,23344,97],{},"The Employee endpoints are available on most of ",[41,23341,123],{"href":121,"rel":23342},[45],"'s 697 ",[41,23345,23348],{"href":23346,"rel":23347},"https:\u002F\u002Fdocs.unified.to\u002Fhris\u002Fintegrations",[45],"HR & Directory integrations",[3629,23350,23352],{"id":23351},"employeeuser-ids-in-all-unified-data-models","Employee\u002FUser IDs in all unified data models",[22,23354,23355],{},"Here is a list of different objects across all our unified API categories that link back to an HR Employee via their IDs. Note: We use the terms 'employee' and 'user' interchangeably.",[155,23357,23358,23372],{},[158,23359,23360],{},[161,23361,23362,23365,23368,23370],{},[164,23363,23364],{},"Category",[164,23366,23367],{},"Data Model",[164,23369,5244],{},[164,23371,8469],{},[174,23373,23374,23390,23406,23421,23436,23451,23465,23479,23494,23508,23525,23541,23557,23573,23588,23604,23619,23637,23653,23668,23684,23700,23715,23732,23747,23764,23778,23792,23806,23822,23839,23855,23868,23882,23898,23914],{},[161,23375,23376,23378,23384,23387],{},[179,23377,21821],{},[179,23379,23380],{},[41,23381,21969],{"href":23382,"rel":23383},"https:\u002F\u002Fdocs.unified.to\u002Fats\u002Factivity\u002Fmodel",[45],[179,23385,23386],{},"user_ids",[179,23388,23389],{},"The recruiters associated with this activity",[161,23391,23392,23394,23400,23403],{},[179,23393,21821],{},[179,23395,23396],{},[41,23397,21916],{"href":23398,"rel":23399},"https:\u002F\u002Fdocs.unified.to\u002Fats\u002Fcandidate\u002Fmodel",[45],[179,23401,23402],{},"user_id",[179,23404,23405],{},"The recruiter or hiring manager associated with this candidate",[161,23407,23408,23410,23416,23418],{},[179,23409,21821],{},[179,23411,23412],{},[41,23413,21955],{"href":23414,"rel":23415},"https:\u002F\u002Fdocs.unified.to\u002Fats\u002Fdocument\u002Fmodel",[45],[179,23417,23402],{},[179,23419,23420],{},"The user who created this document",[161,23422,23423,23425,23431,23433],{},[179,23424,21821],{},[179,23426,23427],{},[41,23428,21982],{"href":23429,"rel":23430},"https:\u002F\u002Fdocs.unified.to\u002Fats\u002Finterview\u002Fmodel",[45],[179,23432,23386],{},[179,23434,23435],{},"The employees that were in this interview",[161,23437,23438,23440,23446,23449],{},[179,23439,21821],{},[179,23441,23442],{},[41,23443,21943],{"href":23444,"rel":23445},"https:\u002F\u002Fdocs.unified.to\u002Fats\u002Fjob\u002Fmodel",[45],[179,23447,23448],{},"recruiter_ids",[179,23450],{},[161,23452,23453,23455,23460,23463],{},[179,23454,21821],{},[179,23456,23457],{},[41,23458,21943],{"href":23444,"rel":23459},[45],[179,23461,23462],{},"hiring_manager_ids",[179,23464],{},[161,23466,23467,23469,23474,23476],{},[179,23468,21821],{},[179,23470,23471],{},[41,23472,21943],{"href":23444,"rel":23473},[45],[179,23475,23402],{},[179,23477,23478],{},"The job owner",[161,23480,23481,23483,23489,23492],{},[179,23482,21821],{},[179,23484,23485],{},[41,23486,21993],{"href":23487,"rel":23488},"https:\u002F\u002Fdocs.unified.to\u002Fats\u002Fscorecard\u002Fmodel",[45],[179,23490,23491],{},"interviewer_id",[179,23493],{},[161,23495,23496,23498,23504,23506],{},[179,23497,21821],{},[179,23499,23500],{},[41,23501,22016],{"href":23502,"rel":23503},"https:\u002F\u002Fdocs.unified.to\u002Fats\u002Fcompany\u002Fmodel",[45],[179,23505,23448],{},[179,23507],{},[161,23509,23510,23513,23520,23522],{},[179,23511,23512],{},"Call Center",[179,23514,23515],{},[41,23516,23519],{"href":23517,"rel":23518},"https:\u002F\u002Fdocs.unified.to\u002Fuc\u002Fcall\u002Fmodel",[45],"Call",[179,23521,23402],{},[179,23523,23524],{},"The agent",[161,23526,23527,23530,23536,23538],{},[179,23528,23529],{},"CRM",[179,23531,23532],{},[41,23533,22016],{"href":23534,"rel":23535},"https:\u002F\u002Fdocs.unified.to\u002Fcrm\u002Fcompany\u002Fmodel",[45],[179,23537,23402],{},[179,23539,23540],{},"The salesperson that is responsible for this company\u002Faccount",[161,23542,23543,23545,23552,23554],{},[179,23544,23529],{},[179,23546,23547],{},[41,23548,23551],{"href":23549,"rel":23550},"https:\u002F\u002Fdocs.unified.to\u002Fcrm\u002Fcontact\u002Fmodel",[45],"Contact",[179,23553,23402],{},[179,23555,23556],{},"The salesperson that is responsible for this contact",[161,23558,23559,23561,23568,23570],{},[179,23560,23529],{},[179,23562,23563],{},[41,23564,23567],{"href":23565,"rel":23566},"https:\u002F\u002Fdocs.unified.to\u002Fcrm\u002Fdeal\u002Fmodel",[45],"Deal",[179,23569,23402],{},[179,23571,23572],{},"The salesperson that is responsible for this deal\u002Fopportunity",[161,23574,23575,23577,23584,23586],{},[179,23576,23529],{},[179,23578,23579],{},[41,23580,23583],{"href":23581,"rel":23582},"https:\u002F\u002Fdocs.unified.to\u002Fcrm\u002Fevent\u002Fmodel",[45],"Event",[179,23585,23402],{},[179,23587],{},[161,23589,23590,23592,23599,23601],{},[179,23591,23529],{},[179,23593,23594],{},[41,23595,23598],{"href":23596,"rel":23597},"https:\u002F\u002Fdocs.unified.to\u002Fcrm\u002Flead\u002Fmodel",[45],"Lead",[179,23600,23402],{},[179,23602,23603],{},"The salesperson that is responsible for this lead",[161,23605,23606,23608,23613,23616],{},[179,23607,23529],{},[179,23609,23610],{},[41,23611,23598],{"href":23596,"rel":23612},[45],[179,23614,23615],{},"creator_user_id",[179,23617,23618],{},"The user that created this lead",[161,23620,23621,23624,23631,23634],{},[179,23622,23623],{},"HR",[179,23625,23626],{},[41,23627,23630],{"href":23628,"rel":23629},"https:\u002F\u002Fdocs.unified.to\u002Fhris\u002Femployee\u002Fmodel",[45],"Employee",[179,23632,23633],{},"manager_id",[179,23635,23636],{},"This user's reporting manager",[161,23638,23639,23641,23648,23650],{},[179,23640,23623],{},[179,23642,23643],{},[41,23644,23647],{"href":23645,"rel":23646},"https:\u002F\u002Fdocs.unified.to\u002Fhris\u002Fgroup\u002Fmodel",[45],"Group",[179,23649,23386],{},[179,23651,23652],{},"The group's members",[161,23654,23655,23657,23662,23665],{},[179,23656,23623],{},[179,23658,23659],{},[41,23660,23647],{"href":23645,"rel":23661},[45],[179,23663,23664],{},"manager_ids",[179,23666,23667],{},"The group's managers",[161,23669,23670,23672,23679,23681],{},[179,23671,23623],{},[179,23673,23674],{},[41,23675,23678],{"href":23676,"rel":23677},"https:\u002F\u002Fdocs.unified.to\u002Fhris\u002Fpayslip\u002Fmodel",[45],"Payslip",[179,23680,23402],{},[179,23682,23683],{},"The employee that this pay slip pertains to",[161,23685,23686,23688,23695,23697],{},[179,23687,23623],{},[179,23689,23690],{},[41,23691,23694],{"href":23692,"rel":23693},"https:\u002F\u002Fdocs.unified.to\u002Fhris\u002Ftimeoff\u002Fmodel",[45],"Timeoff",[179,23696,23402],{},[179,23698,23699],{},"The employee that this time off request pertains to",[161,23701,23702,23704,23709,23712],{},[179,23703,23623],{},[179,23705,23706],{},[41,23707,23694],{"href":23692,"rel":23708},[45],[179,23710,23711],{},"approver_user_id",[179,23713,23714],{},"The employee that approved this time off request",[161,23716,23717,23720,23727,23729],{},[179,23718,23719],{},"KMS",[179,23721,23722],{},[41,23723,23726],{"href":23724,"rel":23725},"https:\u002F\u002Fdocs.unified.to\u002Fkms\u002Fspace\u002Fmodel",[45],"Space",[179,23728,23402],{},[179,23730,23731],{},"The creator of this space",[161,23733,23734,23736,23742,23744],{},[179,23735,23719],{},[179,23737,23738],{},[41,23739,20711],{"href":23740,"rel":23741},"https:\u002F\u002Fdocs.unified.to\u002Fkms\u002Fpage\u002Fmodel",[45],[179,23743,23402],{},[179,23745,23746],{},"The creator of this page",[161,23748,23749,23752,23759,23762],{},[179,23750,23751],{},"Messaging",[179,23753,23754],{},[41,23755,23758],{"href":23756,"rel":23757},"https:\u002F\u002Fdocs.unified.to\u002Fmessaging\u002Fmessage\u002Fmodel",[45],"Message",[179,23760,23761],{},"author_member.user_id",[179,23763],{},[161,23765,23766,23768,23773,23776],{},[179,23767,23751],{},[179,23769,23770],{},[41,23771,23758],{"href":23756,"rel":23772},[45],[179,23774,23775],{},"destination_members.user_id",[179,23777],{},[161,23779,23780,23782,23787,23790],{},[179,23781,23751],{},[179,23783,23784],{},[41,23785,23758],{"href":23756,"rel":23786},[45],[179,23788,23789],{},"hidden_members.user_id",[179,23791],{},[161,23793,23794,23796,23801,23804],{},[179,23795,23751],{},[179,23797,23798],{},[41,23799,23758],{"href":23756,"rel":23800},[45],[179,23802,23803],{},"mentioned_members.user_id",[179,23805],{},[161,23807,23808,23811,23817,23819],{},[179,23809,23810],{},"Storage",[179,23812,23813],{},[41,23814,4680],{"href":23815,"rel":23816},"https:\u002F\u002Fdocs.unified.to\u002Fstorage\u002Ffile\u002Fmodel",[45],[179,23818,23402],{},[179,23820,23821],{},"The owner of this file\u002Ffolder",[161,23823,23824,23827,23834,23836],{},[179,23825,23826],{},"Tasks",[179,23828,23829],{},[41,23830,23833],{"href":23831,"rel":23832},"https:\u002F\u002Fdocs.unified.to\u002Ftask\u002Fproject\u002Fmodel",[45],"Project",[179,23835,23386],{},[179,23837,23838],{},"The users that belong to this project",[161,23840,23841,23843,23850,23853],{},[179,23842,23826],{},[179,23844,23845],{},[41,23846,23849],{"href":23847,"rel":23848},"https:\u002F\u002Fdocs.unified.to\u002Ftask\u002Ftask\u002Fmodel",[45],"Task",[179,23851,23852],{},"assigned_user_ids",[179,23854],{},[161,23856,23857,23859,23864,23866],{},[179,23858,23826],{},[179,23860,23861],{},[41,23862,23849],{"href":23847,"rel":23863},[45],[179,23865,23615],{},[179,23867],{},[161,23869,23870,23872,23877,23880],{},[179,23871,23826],{},[179,23873,23874],{},[41,23875,23849],{"href":23847,"rel":23876},[45],[179,23878,23879],{},"follower_user_ids",[179,23881],{},[161,23883,23884,23887,23893,23895],{},[179,23885,23886],{},"Ticketing",[179,23888,23889],{},[41,23890,4943],{"href":23891,"rel":23892},"https:\u002F\u002Fdocs.unified.to\u002Fticketing\u002Fnote\u002Fmodel",[45],[179,23894,23402],{},[179,23896,23897],{},"The user who created this note",[161,23899,23900,23902,23909,23911],{},[179,23901,23886],{},[179,23903,23904],{},[41,23905,23908],{"href":23906,"rel":23907},"https:\u002F\u002Fdocs.unified.to\u002Fticketing\u002Fticket\u002Fmodel",[45],"Ticket",[179,23910,23402],{},[179,23912,23913],{},"The user who created this ticket",[161,23915,23916,23919,23921,23923],{},[179,23917,23918],{},"Some uses of the Employee endpoints outside HR:",[179,23920],{},[179,23922],{},[179,23924],{},[22,23926,23927,23930],{},[31,23928,23929],{},"Onboarding:"," read new employees from the HR system and add them to your task-management or training product, so new hires have access from their first day.",[22,23932,23933,23936],{},[31,23934,23935],{},"Assigning Leads and Deals:"," Assign newly created leads and\u002For deals to a specific sales-rep using their user ID",[22,23938,23939,23942],{},[31,23940,23941],{},"Notify Hiring Managers:"," When adding a new candidate and their job application, notify the hiring manager by retrieving their information and emailing them",[22,23944,23945],{},"By integrating employee data across multiple SaaS platforms, organizations can improve operational efficiency, enhance data accuracy, and provide a better employee experience.",[55,23947,23949],{"id":23948},"resources","Resources",[2354,23951,23952,23958,23965],{},[2357,23953,23954],{},[22236,23955],{"width":22238,"height":22239,"src":23956,"title":22241,"frameBorder":3604,"allow":22242,"referrerPolicy":23957,"allowFullScreen":2459},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FarTwN_OT8Do?feature=shared","strict-origin-when-cross-origin",[2357,23959,23960],{},[41,23961,23964],{"href":23962,"rel":23963},"https:\u002F\u002Fdocs.unified.to\u002Fhris\u002Foverview",[45],"Overview of our unified HR API documentation ",[2357,23966,23967],{},[41,23968,23971],{"href":23969,"rel":23970},"https:\u002F\u002Funified.to\u002Fhris",[45],"Full list of supported HR integrations ",[4156,23973,23974],{},"html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":2433,"searchDepth":2434,"depth":2434,"links":23976},[23977,23978],{"id":23351,"depth":2613,"text":23352},{"id":23948,"depth":2434,"text":23949},{"img":23980,"date":23981,"updated":23982,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_access_employees_and_users-icon.png","2024-06-25T00:00:00.000Z","2026-10-21T01:07:41.630Z","\u002Fguides\u002Fhow_to_access_employees_and_users",{"title":23254,"description":23269},"guides\u002Fhow_to_access_employees_and_users","cb62ZOW9ZRfqA4aYs7GhetzaNgGbSU68_SoR8KFK7j8",{"id":23988,"title":23989,"body":23990,"description":24054,"extension":2452,"meta":24055,"navigation":2459,"path":24060,"seo":24061,"stem":24062,"__hash__":24063},"guides\u002Fguides\u002Fhow_to_add_api_support_for_the_create_activity_in_crelate.md","How to add API support for the Create Activity in Crelate",{"type":12,"value":23991,"toc":24052},[23992,23995,23997,24002,24009,24012,24023,24028,24031,24034],[15,23993,23989],{"id":23994},"how-to-add-api-support-for-the-create-activity-in-crelate",[19,23996],{},[22,23998,23999],{},[25,24000,24001],{},"September 25, 2025",[22,24003,24004,24005,24008],{},"To create activities in Crelate through ",[41,24006,123],{"href":121,"rel":24007},[45],"'s ATS Activity endpoint, each Crelate activity type you write must be available on the records you attach it to. A Crelate administrator sets this in each activity type's Available On setting.",[22,24010,24011],{},"To set it:",[2510,24013,24014,24017,24020],{},[2357,24015,24016],{},"Select Settings, then Activities under Basic Setup.",[2357,24018,24019],{},"Select the specific Activity Type you want to configure",[2357,24021,24022],{},"In Available On, choose where the activity type can be used: Contacts, Companies or Opportunities (as of 21 October 2026). Candidates are Crelate contacts.",[22,24024,24025],{},[4201,24026],{"alt":5892,"src":24027},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_add_api_support_for_the_create_activity_in_crelate-0.png",[22,24029,24030],{},"The settings shown in the image above will enable the maximum number of API features.",[22,24032,24033],{},"Only Crelate administrators can change activity types.",[22,24035,24036,24037,24042,24043,24046,24047,97],{},"To connect Crelate, you need a Crelate API key: see ",[41,24038,24041],{"href":24039,"rel":24040},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_get_your_crelate_api_key_step_by_step_guide",[45],"How to get your Crelate API key",". For the activity fields ",[41,24044,123],{"href":121,"rel":24045},[45]," writes, see the ",[41,24048,24051],{"href":24049,"rel":24050},"https:\u002F\u002Fdocs.unified.to\u002Fintegrations\u002Fcrelate",[45],"Crelate integration page",{"title":2433,"searchDepth":2434,"depth":2434,"links":24053},[],"To create activities in Crelate through Unified.to's ATS Activity endpoint, each Crelate activity type you write must be available on the records you attach it...",{"img":24056,"date":24057,"updated":24058,"tag":2457,"integrations":24059},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_add_api_support_for_the_create_activity_in_crelate-icon.png","2025-09-25T00:00:00.000Z","2026-10-21T13:50:48.399Z","crelate","\u002Fguides\u002Fhow_to_add_api_support_for_the_create_activity_in_crelate",{"title":23989,"description":24054},"guides\u002Fhow_to_add_api_support_for_the_create_activity_in_crelate","TTltkzo-1m7x-8L2xQ8WHZQY6ct-rhmwYUnwhuKZtrk",{"id":24065,"title":24066,"body":24067,"description":24081,"extension":2452,"meta":24654,"navigation":2459,"path":24658,"seo":24659,"stem":24660,"__hash__":24661},"guides\u002Fguides\u002Fhow_to_associate_a_connection_id_with_your_end_user.md","How to Associate a Connection ID with Your End-User",{"type":12,"value":24068,"toc":24647},[24069,24072,24074,24079,24082,24085,24088,24091,24093,24096,24109,24113,24120,24418,24422,24433,24556,24560,24567,24590,24594,24644],[15,24070,24066],{"id":24071},"how-to-associate-a-connection-id-with-your-end-user",[19,24073],{},[22,24075,24076],{},[25,24077,24078],{},"April 4, 2024",[22,24080,24081],{},"This guide explains how to associate connections you create through Unified.to with end-users in your own application.",[22,24083,24084],{},"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.",[22,24086,24087],{},"If you prefer to learn through video, check out our guide on YouTube:",[22236,24089],{"width":22238,"height":22239,"src":24090,"title":22241,"frameBorder":3604,"allow":22242,"referrerPolicy":23957,"allowFullScreen":2459},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FOW-1vE04cFw?si=EGXIESpEGgYSq0j8",[55,24092,4890],{"id":4889},[22,24094,24095],{},"This guide assumes you have:",[2354,24097,24098,24106],{},[2357,24099,24100,24101],{},"A basic understanding of ",[41,24102,24105],{"href":24103,"rel":24104},"https:\u002F\u002Funified.to\u002Fblog\u002Fend_users_integrations_and_connections",[45],"end-users, integrations, and connections",[2357,24107,24108],{},"Familiarity with OAuth 2.0 authorization flows",[55,24110,24112],{"id":24111},"method-1-use-the-state-parameter-recommended","Method 1: Use the state parameter (recommended)",[22,24114,24115,24116,24119],{},"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 ",[25,24117,24118],{},"does not"," 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.",[2510,24121,24122,24196,24241,24280],{},[2357,24123,24124,24125],{},"Create a state object with your user's ID, passing in additional security measures like a hashing signature. For example:",[2584,24126,24128],{"className":16485,"code":24127,"language":16487,"meta":2433,"style":2433},"const stateObject = {\n  user_id: \"xyz789\",\n  nonce: generateRandomString(), \u002F\u002F Add randomness for security\n  timestamp: Date.now(), \u002F\u002F Optional: Add timestamp for expiry checking\n  sig: generateSignature() \u002F\u002F Optional: Add signature for verification\n};\n",[36,24129,24130,24141,24151,24165,24177,24191],{"__ignoreMap":2433},[414,24131,24132,24134,24137,24139],{"class":2593,"line":2594},[414,24133,2745],{"class":2698},[414,24135,24136],{"class":2607}," stateObject",[414,24138,2817],{"class":2698},[414,24140,2748],{"class":2705},[414,24142,24143,24146,24149],{"class":2593,"line":2434},[414,24144,24145],{"class":2705},"  user_id: ",[414,24147,24148],{"class":2601},"\"xyz789\"",[414,24150,2757],{"class":2705},[414,24152,24153,24156,24159,24162],{"class":2593,"line":2613},[414,24154,24155],{"class":2705},"  nonce: ",[414,24157,24158],{"class":2597},"generateRandomString",[414,24160,24161],{"class":2705},"(), ",[414,24163,24164],{"class":3527},"\u002F\u002F Add randomness for security\n",[414,24166,24167,24170,24172,24174],{"class":2593,"line":2625},[414,24168,24169],{"class":2705},"  timestamp: Date.",[414,24171,18282],{"class":2597},[414,24173,24161],{"class":2705},[414,24175,24176],{"class":3527},"\u002F\u002F Optional: Add timestamp for expiry checking\n",[414,24178,24179,24182,24185,24188],{"class":2593,"line":2677},[414,24180,24181],{"class":2705},"  sig: ",[414,24183,24184],{"class":2597},"generateSignature",[414,24186,24187],{"class":2705},"() ",[414,24189,24190],{"class":3527},"\u002F\u002F Optional: Add signature for verification\n",[414,24192,24193],{"class":2593,"line":2751},[414,24194,24195],{"class":2705},"};\n",[2357,24197,24198,24199],{},"Encode the state object as a base64-string:",[2584,24200,24202],{"className":16485,"code":24201,"language":16487,"meta":2433,"style":2433},"const encodedState = Buffer.from(JSON.stringify(stateObject)).toString('base64');\n",[36,24203,24204],{"__ignoreMap":2433},[414,24205,24206,24208,24211,24213,24216,24218,24220,24223,24225,24228,24231,24234,24236,24239],{"class":2593,"line":2594},[414,24207,2745],{"class":2698},[414,24209,24210],{"class":2607}," encodedState",[414,24212,2817],{"class":2698},[414,24214,24215],{"class":2705}," Buffer.",[414,24217,2716],{"class":2597},[414,24219,2968],{"class":2705},[414,24221,24222],{"class":2607},"JSON",[414,24224,97],{"class":2705},[414,24226,24227],{"class":2597},"stringify",[414,24229,24230],{"class":2705},"(stateObject)).",[414,24232,24233],{"class":2597},"toString",[414,24235,2968],{"class":2705},[414,24237,24238],{"class":2601},"'base64'",[414,24240,3156],{"class":2705},[2357,24242,24243,24244],{},"Add the encoded state to your authorization URL",[2584,24245,24247],{"className":16485,"code":24246,"language":16487,"meta":2433,"style":2433},"const authUrl = `https:\u002F\u002Fapi.unified.to\u002Funified\u002Fintegration\u002Fauth\u002F${workspace_id}\u002F${integration}?state=${encodedState}`;\n",[36,24248,24249],{"__ignoreMap":2433},[414,24250,24251,24253,24256,24258,24261,24264,24267,24270,24273,24276,24278],{"class":2593,"line":2594},[414,24252,2745],{"class":2698},[414,24254,24255],{"class":2607}," authUrl",[414,24257,2817],{"class":2698},[414,24259,24260],{"class":2601}," `https:\u002F\u002Fapi.unified.to\u002Funified\u002Fintegration\u002Fauth\u002F${",[414,24262,24263],{"class":2705},"workspace_id",[414,24265,24266],{"class":2601},"}\u002F${",[414,24268,24269],{"class":2705},"integration",[414,24271,24272],{"class":2601},"}?state=${",[414,24274,24275],{"class":2705},"encodedState",[414,24277,3308],{"class":2601},[414,24279,2706],{"class":2705},[2357,24281,24282,24283,24285,24286],{},"Handle the callback after successful authorization. The connection ID is included in the URL as ",[36,24284,5072],{},". For example:",[2584,24287,24289],{"className":16485,"code":24288,"language":16487,"meta":2433,"style":2433},"\u002F\u002F In your callback handler\nfunction handleCallback(req, res) {\n\u002F\u002F Get connection ID from the callback URL\n  const connectionId = req.query.id;\n\n\u002F\u002F Decode and verify the state\n  const decodedState = JSON.parse(Buffer.from(req.query.state, 'base64').toString());\n\n\u002F\u002F Verify the state is valid (check signature, nonce, timestamp if used)\n  if (verifyState(decodedState)) {\n\u002F\u002F Associate the connection ID with the user ID in your database\n    await saveUserConnection(decodedState.user_id, connectionId);\n  }\n}\n",[36,24290,24291,24296,24315,24320,24332,24336,24341,24373,24377,24382,24395,24400,24410,24414],{"__ignoreMap":2433},[414,24292,24293],{"class":2593,"line":2594},[414,24294,24295],{"class":3527},"\u002F\u002F In your callback handler\n",[414,24297,24298,24300,24303,24305,24308,24310,24313],{"class":2593,"line":2434},[414,24299,16512],{"class":2698},[414,24301,24302],{"class":2597}," handleCallback",[414,24304,2968],{"class":2705},[414,24306,24307],{"class":2971},"req",[414,24309,319],{"class":2705},[414,24311,24312],{"class":2971},"res",[414,24314,3826],{"class":2705},[414,24316,24317],{"class":2593,"line":2613},[414,24318,24319],{"class":3527},"\u002F\u002F Get connection ID from the callback URL\n",[414,24321,24322,24324,24327,24329],{"class":2593,"line":2625},[414,24323,3071],{"class":2698},[414,24325,24326],{"class":2607}," connectionId",[414,24328,2817],{"class":2698},[414,24330,24331],{"class":2705}," req.query.id;\n",[414,24333,24334],{"class":2593,"line":2677},[414,24335,2740],{"emptyLinePlaceholder":2459},[414,24337,24338],{"class":2593,"line":2751},[414,24339,24340],{"class":3527},"\u002F\u002F Decode and verify the state\n",[414,24342,24343,24345,24348,24350,24352,24354,24356,24359,24361,24364,24366,24368,24370],{"class":2593,"line":2760},[414,24344,3071],{"class":2698},[414,24346,24347],{"class":2607}," decodedState",[414,24349,2817],{"class":2698},[414,24351,3573],{"class":2607},[414,24353,97],{"class":2705},[414,24355,3578],{"class":2597},[414,24357,24358],{"class":2705},"(Buffer.",[414,24360,2716],{"class":2597},[414,24362,24363],{"class":2705},"(req.query.state, ",[414,24365,24238],{"class":2601},[414,24367,20056],{"class":2705},[414,24369,24233],{"class":2597},[414,24371,24372],{"class":2705},"());\n",[414,24374,24375],{"class":2593,"line":2768},[414,24376,2740],{"emptyLinePlaceholder":2459},[414,24378,24379],{"class":2593,"line":2776},[414,24380,24381],{"class":3527},"\u002F\u002F Verify the state is valid (check signature, nonce, timestamp if used)\n",[414,24383,24384,24387,24389,24392],{"class":2593,"line":2784},[414,24385,24386],{"class":2698},"  if",[414,24388,3970],{"class":2705},[414,24390,24391],{"class":2597},"verifyState",[414,24393,24394],{"class":2705},"(decodedState)) {\n",[414,24396,24397],{"class":2593,"line":2792},[414,24398,24399],{"class":3527},"\u002F\u002F Associate the connection ID with the user ID in your database\n",[414,24401,24402,24404,24407],{"class":2593,"line":2804},[414,24403,4022],{"class":2698},[414,24405,24406],{"class":2597}," saveUserConnection",[414,24408,24409],{"class":2705},"(decodedState.user_id, connectionId);\n",[414,24411,24412],{"class":2593,"line":2809},[414,24413,4032],{"class":2705},[414,24415,24416],{"class":2593,"line":2829},[414,24417,3035],{"class":2705},[55,24419,24421],{"id":24420},"method-2-use-the-external-id-parameter","Method 2: Use the external ID parameter",[22,24423,24424,24425,24428,24429,24432],{},"This method uses the connection's built-in ",[31,24426,24427],{},"External ID"," field (",[36,24430,24431],{},"external_xref",") to store your user association on the connection itself.",[2510,24434,24435,24471],{},[2357,24436,24437,24438,24440,24441],{},"Add the ",[36,24439,24431],{}," parameter to your authorization URL",[2584,24442,24444],{"className":16485,"code":24443,"language":16487,"meta":2433,"style":2433},"const authUrl = `https:\u002F\u002Fapi.unified.to\u002Funified\u002Fintegration\u002Fauth\u002F${workspace_id}\u002F${integration}?external_xref=${user_id}`;\n",[36,24445,24446],{"__ignoreMap":2433},[414,24447,24448,24450,24452,24454,24456,24458,24460,24462,24465,24467,24469],{"class":2593,"line":2594},[414,24449,2745],{"class":2698},[414,24451,24255],{"class":2607},[414,24453,2817],{"class":2698},[414,24455,24260],{"class":2601},[414,24457,24263],{"class":2705},[414,24459,24266],{"class":2601},[414,24461,24269],{"class":2705},[414,24463,24464],{"class":2601},"}?external_xref=${",[414,24466,23402],{"class":2705},[414,24468,3308],{"class":2601},[414,24470,2706],{"class":2705},[2357,24472,24473,24474,24476,24477],{},"Once a connection is created, that external ID is stored on the connection as ",[36,24475,24431],{},". You can now query connections using the external ID:",[2584,24478,24480],{"className":16485,"code":24479,"language":16487,"meta":2433,"style":2433},"const options = {\n  method: 'GET',\n  url: 'https:\u002F\u002Fapi.unified.to\u002Funified\u002Fconnection',\n  headers: {\n    'authorization': `Bearer ${unified_api_key}`\n  },\n  params: {\n    external_xref: user_id\n  }\n};\n",[36,24481,24482,24493,24503,24513,24518,24534,24538,24543,24548,24552],{"__ignoreMap":2433},[414,24483,24484,24486,24489,24491],{"class":2593,"line":2594},[414,24485,2745],{"class":2698},[414,24487,24488],{"class":2607}," options",[414,24490,2817],{"class":2698},[414,24492,2748],{"class":2705},[414,24494,24495,24498,24501],{"class":2593,"line":2434},[414,24496,24497],{"class":2705},"  method: ",[414,24499,24500],{"class":2601},"'GET'",[414,24502,2757],{"class":2705},[414,24504,24505,24508,24511],{"class":2593,"line":2613},[414,24506,24507],{"class":2705},"  url: ",[414,24509,24510],{"class":2601},"'https:\u002F\u002Fapi.unified.to\u002Funified\u002Fconnection'",[414,24512,2757],{"class":2705},[414,24514,24515],{"class":2593,"line":2625},[414,24516,24517],{"class":2705},"  headers: {\n",[414,24519,24520,24523,24525,24528,24531],{"class":2593,"line":2677},[414,24521,24522],{"class":2601},"    'authorization'",[414,24524,7340],{"class":2705},[414,24526,24527],{"class":2601},"`Bearer ${",[414,24529,24530],{"class":2705},"unified_api_key",[414,24532,24533],{"class":2601},"}`\n",[414,24535,24536],{"class":2593,"line":2751},[414,24537,16052],{"class":2705},[414,24539,24540],{"class":2593,"line":2760},[414,24541,24542],{"class":2705},"  params: {\n",[414,24544,24545],{"class":2593,"line":2768},[414,24546,24547],{"class":2705},"    external_xref: user_id\n",[414,24549,24550],{"class":2593,"line":2776},[414,24551,4032],{"class":2705},[414,24553,24554],{"class":2593,"line":2784},[414,24555,24195],{"class":2705},[55,24557,24559],{"id":24558},"keeping-the-association-when-a-connection-is-re-authorized","Keeping the association when a connection is re-authorized",[22,24561,24562,24563,24566],{},"If a connection becomes unhealthy (for example, the end-user revoked access or their credentials expired), ",[41,24564,16657],{"href":16655,"rel":24565},[45]," instead of creating a new one. Re-authorizing keeps the same connection ID, so the association you saved with either method stays valid:",[2354,24568,24569,24581],{},[2357,24570,24571,24572,34,24575,24577,24578,24580],{},"The success URL returns the ",[31,24573,24574],{},"same",[36,24576,5072],{},", and your ",[36,24579,22210],{}," value is returned as usual.",[2357,24582,24583,24584,24586,24587,24589],{},"The connection's ",[36,24585,24431],{}," is kept. If you include ",[36,24588,24431],{}," on the re-authorization URL, it replaces the stored value, so leave it off unless you intend to change it.",[55,24591,24593],{"id":24592},"best-practices-for-implementation","Best practices for implementation",[2510,24595,24596,24609,24622,24635],{},[2357,24597,24598,24601],{},[31,24599,24600],{},"Always validate the state parameter",[2354,24602,24603,24606],{},[2357,24604,24605],{},"Check signatures if used",[2357,24607,24608],{},"Verify nonces haven't been reused",[2357,24610,24611,24614],{},[31,24612,24613],{},"Securely store connection associations",[2354,24615,24616,24619],{},[2357,24617,24618],{},"Use a database to map user IDs to connection IDs",[2357,24620,24621],{},"Consider encrypting sensitive data",[2357,24623,24624,24627],{},[31,24625,24626],{},"Handle error cases",[2354,24628,24629,24632],{},[2357,24630,24631],{},"Missing parameters",[2357,24633,24634],{},"Failed authorization attempts",[2357,24636,24637,24639],{},[31,24638,16651],{},[2354,24640,24641],{},[2357,24642,24643],{},"Re-authorizing an unhealthy connection keeps its ID, so you don't need to update your stored association",[4156,24645,24646],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}",{"title":2433,"searchDepth":2434,"depth":2434,"links":24648},[24649,24650,24651,24652,24653],{"id":4889,"depth":2434,"text":4890},{"id":24111,"depth":2434,"text":24112},{"id":24420,"depth":2434,"text":24421},{"id":24558,"depth":2434,"text":24559},{"id":24592,"depth":2434,"text":24593},{"img":24655,"date":24656,"updated":24657,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_associate_a_connection_id_with_your_end_user-icon.png","2024-04-04T00:00:00.000Z","2026-10-06T18:21:13.876Z","\u002Fguides\u002Fhow_to_associate_a_connection_id_with_your_end_user",{"title":24066,"description":24081},"guides\u002Fhow_to_associate_a_connection_id_with_your_end_user","Ioh9xnoe0rI3NYvRWBIlYnZ98Yv_sc2pA8SClVRGSH0",{"id":24663,"title":24664,"body":24665,"description":27172,"extension":2452,"meta":27173,"navigation":2459,"path":27177,"seo":27178,"stem":27179,"__hash__":27180},"guides\u002Fguides\u002Fhow_to_build_a_candidate_assessment_product_with.md","How to build a Candidate Assessment product with",{"type":12,"value":24666,"toc":27164},[24667,24670,24672,24677,24680,24697,24700,24704,24707,24715,24745,24749,24752,24759,27067,27070,27074,27077,27116,27122,27126,27148,27152,27161],[15,24668,24664],{"id":24669},"how-to-build-a-candidate-assessment-product-with",[19,24671],{},[22,24673,24674],{},[25,24675,24676],{},"October 23, 2023",[22236,24678],{"width":22238,"height":22239,"src":24679,"title":22241,"frameBorder":3604,"allow":22242,"referrerPolicy":23957,"allowFullScreen":2459},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002F0hfH39vh7Qk",[22,24681,24682,24683,24686,24687,24690,24691,24696],{},"There are two ways to build a candidate assessment product on your customers' ATS. In the first, your product reads applications through ",[41,24684,123],{"href":121,"rel":24685},[45],"'s ATS API, starts an assessment when an application reaches a status you choose, and writes the result back to the candidate record. It needs no ATS partnership and works on any ATS integration that returns applications. In the second, your packages are listed inside the ATS's own assessment module and recruiters order them there; ",[41,24688,123],{"href":121,"rel":24689},[45],"'s Assessment API handles that route on ATSes with an assessment module, most of them in beta (see ",[41,24692,24695],{"href":24693,"rel":24694},"https:\u002F\u002Funified.to\u002Fblog\u002Fhow_to_offer_assessment_packages_and_receive_orders_with_unified_assessment_api",[45],"How to Offer Assessment Packages and Receive Orders","). This guide covers the first route.",[22,24698,24699],{},"The same data can feed AI screening or semantic resume matching; see the RAG section at the end.",[55,24701,24703],{"id":24702},"who-is-this-guide-for","Who is this guide for?",[22,24705,24706],{},"It's for teams with a candidate assessment product (skills tests, background checks, structured interviews) who need to read new applications from their customers' ATS and return results to it.",[2354,24708,24709,24712],{},[2357,24710,24711],{},"Read new applications from your customers' ATS (applicant tracking system) so your product can assess those candidates.",[2357,24713,24714],{},"Retrieve resumes and job descriptions to power RAG-based candidate ranking and semantic matching.",[22,24716,24717,24720,24721,319,24726,319,24731,741,24736,3970,24741,20056],{},[41,24718,123],{"href":121,"rel":24719},[45],"'s ATS API covers 164 ATS integrations, including ",[41,24722,24725],{"href":24723,"rel":24724},"https:\u002F\u002Funified.to\u002Fintegrations\u002Fgreenhouse",[45],"Greenhouse",[41,24727,24730],{"href":24728,"rel":24729},"https:\u002F\u002Funified.to\u002Fintegrations\u002Flever",[45],"Lever",[41,24732,24735],{"href":24733,"rel":24734},"https:\u002F\u002Funified.to\u002Fintegrations\u002Fsmartrecruiters",[45],"SmartRecruiters",[41,24737,24740],{"href":24738,"rel":24739},"https:\u002F\u002Funified.to\u002Fintegrations\u002Fsuccessfactors",[45],"SAP SuccessFactors",[41,24742,24744],{"href":4304,"rel":24743},[45],"full list",[55,24746,24748],{"id":24747},"how-to-add-ats-integrations-to-your-product","How to add ATS integrations to your product",[22,24750,24751],{},"Before we start, be sure to first read:",[22,24753,24754],{},[41,24755,24758],{"href":24756,"rel":24757},"https:\u002F\u002Funified.to\u002Fblog\u002Fstart_here_getting_started_with_unified",[45],"Getting Started with Unified.to",[2510,24760,24761,25157,26114,26193,26478],{},[2357,24762,24763,24766],{},[31,24764,24765],{},"Get an initial list of applications",[2510,24767,24768],{},[2357,24769,24770,24771,24776,24777,741,24780,24783,24784],{},"When the customer authorizes an ATS connection, ",[41,24772,24775],{"href":24773,"rel":24774},"https:\u002F\u002Fdocs.unified.to\u002Fats\u002Fapplication\u002FList_all_applications",[45],"read the initial set of applications for a job"," (filtering by ",[36,24778,24779],{},"job_id",[36,24781,24782],{},"updated_gte"," where the integration supports them)",[2584,24785,24787],{"className":2689,"code":24786,"language":2691,"meta":2433,"style":2433},"import { UnifiedTo } from '@unified-api\u002Ftypescript-sdk';\nimport { AtsApplication, AtsApplicationStatus } from '@unified-api\u002Ftypescript-sdk\u002Fsdk\u002Fmodels\u002Fshared';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: process.env.UNIFIED_API_KEY!,\n    },\n});\n\nexport async function getApplications(connectionId: string, trigger_status: AtsApplicationStatus, jobId: string, updatedGte?: string) {\n    const applications: AtsApplication[] = [];\n    const limit = 100;\n    let offset = 0;\n\n    while (true) {\n        \u002F\u002F listAtsApplications returns the array of applications directly\n        const apps = await sdk.ats.listAtsApplications({\n            updatedGte, \u002F\u002F ISO-8601 string, e.g. '2026-10-01T00:00:00Z'\n            jobId,\n            offset,\n            limit,\n            connectionId,\n        });\n\n        applications.push(...apps.filter((application) => application.jobId === jobId && application.status === trigger_status)); \u002F\u002F job_id is honoured server-side on some integrations only\n\n        if (apps.length === limit) {\n            offset += limit;\n        } else {\n            break;\n        }\n    }\n\n    return applications;\n}\n",[36,24788,24789,24801,24814,24818,24832,24836,24847,24851,24855,24859,24908,24928,24942,24957,24961,24972,24977,24996,25004,25009,25014,25019,25024,25029,25033,25084,25088,25105,25116,25126,25133,25137,25141,25145,25153],{"__ignoreMap":2433},[414,24790,24791,24793,24795,24797,24799],{"class":2593,"line":2594},[414,24792,2699],{"class":2698},[414,24794,2713],{"class":2705},[414,24796,2716],{"class":2698},[414,24798,2719],{"class":2601},[414,24800,2706],{"class":2705},[414,24802,24803,24805,24808,24810,24812],{"class":2593,"line":2434},[414,24804,2699],{"class":2698},[414,24806,24807],{"class":2705}," { AtsApplication, AtsApplicationStatus } ",[414,24809,2716],{"class":2698},[414,24811,2945],{"class":2601},[414,24813,2706],{"class":2705},[414,24815,24816],{"class":2593,"line":2613},[414,24817,2740],{"emptyLinePlaceholder":2459},[414,24819,24820,24822,24824,24826,24828,24830],{"class":2593,"line":2625},[414,24821,2745],{"class":2698},[414,24823,2814],{"class":2607},[414,24825,2817],{"class":2698},[414,24827,2820],{"class":2698},[414,24829,2823],{"class":2597},[414,24831,2826],{"class":2705},[414,24833,24834],{"class":2593,"line":2677},[414,24835,23194],{"class":2705},[414,24837,24838,24841,24843,24845],{"class":2593,"line":2751},[414,24839,24840],{"class":2705},"        jwt: process.env.",[414,24842,2560],{"class":2607},[414,24844,2837],{"class":2698},[414,24846,2757],{"class":2705},[414,24848,24849],{"class":2593,"line":2760},[414,24850,3548],{"class":2705},[414,24852,24853],{"class":2593,"line":2768},[414,24854,2846],{"class":2705},[414,24856,24857],{"class":2593,"line":2776},[414,24858,2740],{"emptyLinePlaceholder":2459},[414,24860,24861,24863,24865,24867,24870,24872,24874,24876,24878,24880,24883,24885,24888,24890,24893,24895,24897,24899,24902,24904,24906],{"class":2593,"line":2784},[414,24862,2956],{"class":2698},[414,24864,2959],{"class":2698},[414,24866,2962],{"class":2698},[414,24868,24869],{"class":2597}," getApplications",[414,24871,2968],{"class":2705},[414,24873,2972],{"class":2971},[414,24875,2646],{"class":2698},[414,24877,2977],{"class":2607},[414,24879,319],{"class":2705},[414,24881,24882],{"class":2971},"trigger_status",[414,24884,2646],{"class":2698},[414,24886,24887],{"class":2597}," AtsApplicationStatus",[414,24889,319],{"class":2705},[414,24891,24892],{"class":2971},"jobId",[414,24894,2646],{"class":2698},[414,24896,2977],{"class":2607},[414,24898,319],{"class":2705},[414,24900,24901],{"class":2971},"updatedGte",[414,24903,16892],{"class":2698},[414,24905,2977],{"class":2607},[414,24907,3826],{"class":2705},[414,24909,24910,24912,24915,24917,24920,24923,24925],{"class":2593,"line":2792},[414,24911,3986],{"class":2698},[414,24913,24914],{"class":2607}," applications",[414,24916,2646],{"class":2698},[414,24918,24919],{"class":2597}," AtsApplication",[414,24921,24922],{"class":2705},"[] ",[414,24924,2798],{"class":2698},[414,24926,24927],{"class":2705}," [];\n",[414,24929,24930,24932,24935,24937,24940],{"class":2593,"line":2804},[414,24931,3986],{"class":2698},[414,24933,24934],{"class":2607}," limit",[414,24936,2817],{"class":2698},[414,24938,24939],{"class":2607}," 100",[414,24941,2706],{"class":2705},[414,24943,24944,24947,24950,24952,24955],{"class":2593,"line":2809},[414,24945,24946],{"class":2698},"    let",[414,24948,24949],{"class":2705}," offset ",[414,24951,2798],{"class":2698},[414,24953,24954],{"class":2607}," 0",[414,24956,2706],{"class":2705},[414,24958,24959],{"class":2593,"line":2829},[414,24960,2740],{"emptyLinePlaceholder":2459},[414,24962,24963,24966,24968,24970],{"class":2593,"line":2843},[414,24964,24965],{"class":2698},"    while",[414,24967,3970],{"class":2705},[414,24969,3891],{"class":2607},[414,24971,3826],{"class":2705},[414,24973,24974],{"class":2593,"line":2849},[414,24975,24976],{"class":3527},"        \u002F\u002F listAtsApplications returns the array of applications directly\n",[414,24978,24979,24982,24985,24987,24989,24991,24994],{"class":2593,"line":2854},[414,24980,24981],{"class":2698},"        const",[414,24983,24984],{"class":2607}," apps",[414,24986,2817],{"class":2698},[414,24988,3002],{"class":2698},[414,24990,3005],{"class":2705},[414,24992,24993],{"class":2597},"listAtsApplications",[414,24995,2826],{"class":2705},[414,24997,24998,25001],{"class":2593,"line":2880},[414,24999,25000],{"class":2705},"            updatedGte, ",[414,25002,25003],{"class":3527},"\u002F\u002F ISO-8601 string, e.g. '2026-10-01T00:00:00Z'\n",[414,25005,25006],{"class":2593,"line":3253},[414,25007,25008],{"class":2705},"            jobId,\n",[414,25010,25011],{"class":2593,"line":3261},[414,25012,25013],{"class":2705},"            offset,\n",[414,25015,25016],{"class":2593,"line":3279},[414,25017,25018],{"class":2705},"            limit,\n",[414,25020,25021],{"class":2593,"line":3313},[414,25022,25023],{"class":2705},"            connectionId,\n",[414,25025,25026],{"class":2593,"line":3326},[414,25027,25028],{"class":2705},"        });\n",[414,25030,25031],{"class":2593,"line":3339},[414,25032,2740],{"emptyLinePlaceholder":2459},[414,25034,25035,25038,25041,25043,25046,25049,25052,25054,25057,25059,25061,25064,25067,25070,25073,25076,25078,25081],{"class":2593,"line":3359},[414,25036,25037],{"class":2705},"        applications.",[414,25039,25040],{"class":2597},"push",[414,25042,2968],{"class":2705},[414,25044,25045],{"class":2698},"...",[414,25047,25048],{"class":2705},"apps.",[414,25050,25051],{"class":2597},"filter",[414,25053,3096],{"class":2705},[414,25055,25056],{"class":2971},"application",[414,25058,3107],{"class":2705},[414,25060,3110],{"class":2698},[414,25062,25063],{"class":2705}," application.jobId ",[414,25065,25066],{"class":2698},"===",[414,25068,25069],{"class":2705}," jobId ",[414,25071,25072],{"class":2698},"&&",[414,25074,25075],{"class":2705}," application.status ",[414,25077,25066],{"class":2698},[414,25079,25080],{"class":2705}," trigger_status)); ",[414,25082,25083],{"class":3527},"\u002F\u002F job_id is honoured server-side on some integrations only\n",[414,25085,25086],{"class":2593,"line":6453},[414,25087,2740],{"emptyLinePlaceholder":2459},[414,25089,25090,25093,25096,25099,25102],{"class":2593,"line":6459},[414,25091,25092],{"class":2698},"        if",[414,25094,25095],{"class":2705}," (apps.",[414,25097,25098],{"class":2607},"length",[414,25100,25101],{"class":2698}," ===",[414,25103,25104],{"class":2705}," limit) {\n",[414,25106,25107,25110,25113],{"class":2593,"line":6465},[414,25108,25109],{"class":2705},"            offset ",[414,25111,25112],{"class":2698},"+=",[414,25114,25115],{"class":2705}," limit;\n",[414,25117,25118,25121,25124],{"class":2593,"line":6471},[414,25119,25120],{"class":2705},"        } ",[414,25122,25123],{"class":2698},"else",[414,25125,2748],{"class":2705},[414,25127,25128,25131],{"class":2593,"line":6477},[414,25129,25130],{"class":2698},"            break",[414,25132,2706],{"class":2705},[414,25134,25135],{"class":2593,"line":6483},[414,25136,10641],{"class":2705},[414,25138,25139],{"class":2593,"line":6489},[414,25140,10535],{"class":2705},[414,25142,25143],{"class":2593,"line":6495},[414,25144,2740],{"emptyLinePlaceholder":2459},[414,25146,25147,25150],{"class":2593,"line":6501},[414,25148,25149],{"class":2698},"    return",[414,25151,25152],{"class":2705}," applications;\n",[414,25154,25155],{"class":2593,"line":6507},[414,25156,3035],{"class":2705},[2357,25158,25159,25162],{},[31,25160,25161],{},"Set up to get updated applications",[2510,25163,25164,26106],{},[2357,25165,25166,25167,25171,25172,25174,25175],{},"To receive new and updated applications, ",[41,25168,25170],{"href":5078,"rel":25169},[45],"create a webhook"," for that ",[36,25173,85],{},". Application webhooks are native or virtual depending on the integration; virtual webhooks check at an interval you set, as often as every minute on paid plans, and a check that finds nothing isn't billed. Check the integration page for which applies.",[2584,25176,25178],{"className":2689,"code":25177,"language":2691,"meta":2433,"style":2433},"import { createHmac, timingSafeEqual } from 'crypto';\nimport { UnifiedTo } from '@unified-api\u002Ftypescript-sdk';\nimport { AtsApplicationStatus, Webhook, WebhookEvent, WebhookObjectType, WebhookType } from '@unified-api\u002Ftypescript-sdk\u002Fsdk\u002Fmodels\u002Fshared';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: process.env.UNIFIED_API_KEY!,\n    },\n});\n\n\u002F\u002F The payload arrives as JSON with snake_case field names\ninterface IncomingWebhook {\n    id: string;\n    created_at: string;\n    updated_at: string;\n    workspace_id: string;\n    connection_id: string;\n    hook_url: string;\n    object_type: string;\n    interval: number;\n    checked_at: string;\n    integration_type: string;\n    environment: string;\n    event: 'created' | 'updated' | 'deleted';\n    runs: string[];\n    fields: string;\n    webhook_type: WebhookType;\n    is_healthy: boolean;\n    page_max_limit: number;\n}\n\ninterface IncomingApplication {\n    id: string;\n    candidate_id?: string;\n    job_id?: string;\n    status?: AtsApplicationStatus;\n    original_status?: string;\n    updated_at?: string;\n}\n\ninterface IWebhookData\u003CT> {\n    data: T[]; \u002F\u002F The data array contains objects of the webhook's object type (eg. ATS applications)\n    webhook: IncomingWebhook; \u002F\u002F The webhook object\n    nonce: string; \u002F\u002F random string\n    sig256: string; \u002F\u002F base64(HMAC-SHA256(workspace.secret, JSON.stringify(data) + nonce))\n    external_xref?: string; \u002F\u002F the external_xref you set on the connection\n    type: 'INITIAL-PARTIAL' | 'INITIAL-COMPLETE' | 'VIRTUAL' | 'NATIVE';\n}\n\nexport async function createApplicationsWebhook(connectionId: string, myWebhookUrl: string): Promise\u003CWebhook> {\n    \u002F\u002F createUnifiedWebhook returns the Webhook object directly\n    return await sdk.unified.createUnifiedWebhook({\n        webhook: {\n            hookUrl: myWebhookUrl,\n            objectType: WebhookObjectType.AtsApplication,\n            event: WebhookEvent.Updated,\n            connectionId,\n        },\n    });\n}\n\nexport async function handleUnifiedWebhook(incoming: IWebhookData\u003CIncomingApplication>, trigger_status: AtsApplicationStatus) {\n    if (incoming.webhook.object_type !== 'ats_application') {\n        return; \u002F\u002F not for us\n    }\n\n    const secret = process.env.WORKSPACE_SECRET;\n    if (!secret) {\n        throw new Error('WORKSPACE_SECRET is not set');\n    }\n\n    const computed = Buffer.from(\n        createHmac('sha256', secret)\n            .update(JSON.stringify(incoming.data)) \u002F\u002F must match the order and encoding received\n            .update(String(incoming.nonce))\n            .digest('base64'),\n        'utf8',\n    );\n    const provided = Buffer.from(incoming.sig256 ?? '', 'utf8');\n    if (computed.length !== provided.length || !timingSafeEqual(computed, provided)) {\n        return; \u002F\u002F signature mismatch: reject the payload\n    }\n\n    return incoming.data?.filter((application) => application.status === trigger_status);\n}\n",[36,25179,25180,25194,25206,25219,25223,25237,25241,25251,25255,25259,25263,25268,25277,25288,25299,25310,25321,25332,25343,25354,25365,25376,25387,25398,25420,25431,25442,25454,25466,25477,25481,25485,25494,25504,25515,25526,25537,25548,25558,25562,25566,25581,25597,25611,25625,25639,25653,25680,25684,25688,25729,25734,25747,25752,25757,25762,25767,25771,25775,25780,25784,25788,25824,25840,25850,25854,25858,25875,25886,25903,25907,25911,25926,25939,25961,25975,25988,25995,26000,26027,26056,26066,26071,26076,26101],{"__ignoreMap":2433},[414,25181,25182,25184,25187,25189,25192],{"class":2593,"line":2594},[414,25183,2699],{"class":2698},[414,25185,25186],{"class":2705}," { createHmac, timingSafeEqual } ",[414,25188,2716],{"class":2698},[414,25190,25191],{"class":2601}," 'crypto'",[414,25193,2706],{"class":2705},[414,25195,25196,25198,25200,25202,25204],{"class":2593,"line":2434},[414,25197,2699],{"class":2698},[414,25199,2713],{"class":2705},[414,25201,2716],{"class":2698},[414,25203,2719],{"class":2601},[414,25205,2706],{"class":2705},[414,25207,25208,25210,25213,25215,25217],{"class":2593,"line":2613},[414,25209,2699],{"class":2698},[414,25211,25212],{"class":2705}," { AtsApplicationStatus, Webhook, WebhookEvent, WebhookObjectType, WebhookType } ",[414,25214,2716],{"class":2698},[414,25216,2945],{"class":2601},[414,25218,2706],{"class":2705},[414,25220,25221],{"class":2593,"line":2625},[414,25222,2740],{"emptyLinePlaceholder":2459},[414,25224,25225,25227,25229,25231,25233,25235],{"class":2593,"line":2677},[414,25226,2745],{"class":2698},[414,25228,2814],{"class":2607},[414,25230,2817],{"class":2698},[414,25232,2820],{"class":2698},[414,25234,2823],{"class":2597},[414,25236,2826],{"class":2705},[414,25238,25239],{"class":2593,"line":2751},[414,25240,23194],{"class":2705},[414,25242,25243,25245,25247,25249],{"class":2593,"line":2760},[414,25244,24840],{"class":2705},[414,25246,2560],{"class":2607},[414,25248,2837],{"class":2698},[414,25250,2757],{"class":2705},[414,25252,25253],{"class":2593,"line":2768},[414,25254,3548],{"class":2705},[414,25256,25257],{"class":2593,"line":2776},[414,25258,2846],{"class":2705},[414,25260,25261],{"class":2593,"line":2784},[414,25262,2740],{"emptyLinePlaceholder":2459},[414,25264,25265],{"class":2593,"line":2792},[414,25266,25267],{"class":3527},"\u002F\u002F The payload arrives as JSON with snake_case field names\n",[414,25269,25270,25272,25275],{"class":2593,"line":2804},[414,25271,16879],{"class":2698},[414,25273,25274],{"class":2597}," IncomingWebhook",[414,25276,2748],{"class":2705},[414,25278,25279,25282,25284,25286],{"class":2593,"line":2809},[414,25280,25281],{"class":2971},"    id",[414,25283,2646],{"class":2698},[414,25285,2977],{"class":2607},[414,25287,2706],{"class":2705},[414,25289,25290,25293,25295,25297],{"class":2593,"line":2829},[414,25291,25292],{"class":2971},"    created_at",[414,25294,2646],{"class":2698},[414,25296,2977],{"class":2607},[414,25298,2706],{"class":2705},[414,25300,25301,25304,25306,25308],{"class":2593,"line":2843},[414,25302,25303],{"class":2971},"    updated_at",[414,25305,2646],{"class":2698},[414,25307,2977],{"class":2607},[414,25309,2706],{"class":2705},[414,25311,25312,25315,25317,25319],{"class":2593,"line":2849},[414,25313,25314],{"class":2971},"    workspace_id",[414,25316,2646],{"class":2698},[414,25318,2977],{"class":2607},[414,25320,2706],{"class":2705},[414,25322,25323,25326,25328,25330],{"class":2593,"line":2854},[414,25324,25325],{"class":2971},"    connection_id",[414,25327,2646],{"class":2698},[414,25329,2977],{"class":2607},[414,25331,2706],{"class":2705},[414,25333,25334,25337,25339,25341],{"class":2593,"line":2880},[414,25335,25336],{"class":2971},"    hook_url",[414,25338,2646],{"class":2698},[414,25340,2977],{"class":2607},[414,25342,2706],{"class":2705},[414,25344,25345,25348,25350,25352],{"class":2593,"line":3253},[414,25346,25347],{"class":2971},"    object_type",[414,25349,2646],{"class":2698},[414,25351,2977],{"class":2607},[414,25353,2706],{"class":2705},[414,25355,25356,25359,25361,25363],{"class":2593,"line":3261},[414,25357,25358],{"class":2971},"    interval",[414,25360,2646],{"class":2698},[414,25362,3679],{"class":2607},[414,25364,2706],{"class":2705},[414,25366,25367,25370,25372,25374],{"class":2593,"line":3279},[414,25368,25369],{"class":2971},"    checked_at",[414,25371,2646],{"class":2698},[414,25373,2977],{"class":2607},[414,25375,2706],{"class":2705},[414,25377,25378,25381,25383,25385],{"class":2593,"line":3313},[414,25379,25380],{"class":2971},"    integration_type",[414,25382,2646],{"class":2698},[414,25384,2977],{"class":2607},[414,25386,2706],{"class":2705},[414,25388,25389,25392,25394,25396],{"class":2593,"line":3326},[414,25390,25391],{"class":2971},"    environment",[414,25393,2646],{"class":2698},[414,25395,2977],{"class":2607},[414,25397,2706],{"class":2705},[414,25399,25400,25403,25405,25408,25410,25413,25415,25418],{"class":2593,"line":3339},[414,25401,25402],{"class":2971},"    event",[414,25404,2646],{"class":2698},[414,25406,25407],{"class":2601}," 'created'",[414,25409,3447],{"class":2698},[414,25411,25412],{"class":2601}," 'updated'",[414,25414,3447],{"class":2698},[414,25416,25417],{"class":2601}," 'deleted'",[414,25419,2706],{"class":2705},[414,25421,25422,25425,25427,25429],{"class":2593,"line":3359},[414,25423,25424],{"class":2971},"    runs",[414,25426,2646],{"class":2698},[414,25428,2977],{"class":2607},[414,25430,17001],{"class":2705},[414,25432,25433,25436,25438,25440],{"class":2593,"line":6453},[414,25434,25435],{"class":2971},"    fields",[414,25437,2646],{"class":2698},[414,25439,2977],{"class":2607},[414,25441,2706],{"class":2705},[414,25443,25444,25447,25449,25452],{"class":2593,"line":6459},[414,25445,25446],{"class":2971},"    webhook_type",[414,25448,2646],{"class":2698},[414,25450,25451],{"class":2597}," WebhookType",[414,25453,2706],{"class":2705},[414,25455,25456,25459,25461,25464],{"class":2593,"line":6465},[414,25457,25458],{"class":2971},"    is_healthy",[414,25460,2646],{"class":2698},[414,25462,25463],{"class":2607}," boolean",[414,25465,2706],{"class":2705},[414,25467,25468,25471,25473,25475],{"class":2593,"line":6471},[414,25469,25470],{"class":2971},"    page_max_limit",[414,25472,2646],{"class":2698},[414,25474,3679],{"class":2607},[414,25476,2706],{"class":2705},[414,25478,25479],{"class":2593,"line":6477},[414,25480,3035],{"class":2705},[414,25482,25483],{"class":2593,"line":6483},[414,25484,2740],{"emptyLinePlaceholder":2459},[414,25486,25487,25489,25492],{"class":2593,"line":6489},[414,25488,16879],{"class":2698},[414,25490,25491],{"class":2597}," IncomingApplication",[414,25493,2748],{"class":2705},[414,25495,25496,25498,25500,25502],{"class":2593,"line":6495},[414,25497,25281],{"class":2971},[414,25499,2646],{"class":2698},[414,25501,2977],{"class":2607},[414,25503,2706],{"class":2705},[414,25505,25506,25509,25511,25513],{"class":2593,"line":6501},[414,25507,25508],{"class":2971},"    candidate_id",[414,25510,16892],{"class":2698},[414,25512,2977],{"class":2607},[414,25514,2706],{"class":2705},[414,25516,25517,25520,25522,25524],{"class":2593,"line":6507},[414,25518,25519],{"class":2971},"    job_id",[414,25521,16892],{"class":2698},[414,25523,2977],{"class":2607},[414,25525,2706],{"class":2705},[414,25527,25528,25531,25533,25535],{"class":2593,"line":6513},[414,25529,25530],{"class":2971},"    status",[414,25532,16892],{"class":2698},[414,25534,24887],{"class":2597},[414,25536,2706],{"class":2705},[414,25538,25539,25542,25544,25546],{"class":2593,"line":6519},[414,25540,25541],{"class":2971},"    original_status",[414,25543,16892],{"class":2698},[414,25545,2977],{"class":2607},[414,25547,2706],{"class":2705},[414,25549,25550,25552,25554,25556],{"class":2593,"line":6525},[414,25551,25303],{"class":2971},[414,25553,16892],{"class":2698},[414,25555,2977],{"class":2607},[414,25557,2706],{"class":2705},[414,25559,25560],{"class":2593,"line":6531},[414,25561,3035],{"class":2705},[414,25563,25564],{"class":2593,"line":6537},[414,25565,2740],{"emptyLinePlaceholder":2459},[414,25567,25568,25570,25573,25575,25578],{"class":2593,"line":6543},[414,25569,16879],{"class":2698},[414,25571,25572],{"class":2597}," IWebhookData",[414,25574,2988],{"class":2705},[414,25576,25577],{"class":2597},"T",[414,25579,25580],{"class":2705},"> {\n",[414,25582,25583,25586,25588,25591,25594],{"class":2593,"line":6549},[414,25584,25585],{"class":2971},"    data",[414,25587,2646],{"class":2698},[414,25589,25590],{"class":2597}," T",[414,25592,25593],{"class":2705},"[]; ",[414,25595,25596],{"class":3527},"\u002F\u002F The data array contains objects of the webhook's object type (eg. ATS applications)\n",[414,25598,25599,25602,25604,25606,25608],{"class":2593,"line":6555},[414,25600,25601],{"class":2971},"    webhook",[414,25603,2646],{"class":2698},[414,25605,25274],{"class":2597},[414,25607,3394],{"class":2705},[414,25609,25610],{"class":3527},"\u002F\u002F The webhook object\n",[414,25612,25613,25616,25618,25620,25622],{"class":2593,"line":6561},[414,25614,25615],{"class":2971},"    nonce",[414,25617,2646],{"class":2698},[414,25619,2977],{"class":2607},[414,25621,3394],{"class":2705},[414,25623,25624],{"class":3527},"\u002F\u002F random string\n",[414,25626,25627,25630,25632,25634,25636],{"class":2593,"line":6567},[414,25628,25629],{"class":2971},"    sig256",[414,25631,2646],{"class":2698},[414,25633,2977],{"class":2607},[414,25635,3394],{"class":2705},[414,25637,25638],{"class":3527},"\u002F\u002F base64(HMAC-SHA256(workspace.secret, JSON.stringify(data) + nonce))\n",[414,25640,25641,25644,25646,25648,25650],{"class":2593,"line":6573},[414,25642,25643],{"class":2971},"    external_xref",[414,25645,16892],{"class":2698},[414,25647,2977],{"class":2607},[414,25649,3394],{"class":2705},[414,25651,25652],{"class":3527},"\u002F\u002F the external_xref you set on the connection\n",[414,25654,25655,25658,25660,25663,25665,25668,25670,25673,25675,25678],{"class":2593,"line":6579},[414,25656,25657],{"class":2971},"    type",[414,25659,2646],{"class":2698},[414,25661,25662],{"class":2601}," 'INITIAL-PARTIAL'",[414,25664,3447],{"class":2698},[414,25666,25667],{"class":2601}," 'INITIAL-COMPLETE'",[414,25669,3447],{"class":2698},[414,25671,25672],{"class":2601}," 'VIRTUAL'",[414,25674,3447],{"class":2698},[414,25676,25677],{"class":2601}," 'NATIVE'",[414,25679,2706],{"class":2705},[414,25681,25682],{"class":2593,"line":6585},[414,25683,3035],{"class":2705},[414,25685,25686],{"class":2593,"line":6591},[414,25687,2740],{"emptyLinePlaceholder":2459},[414,25689,25690,25692,25694,25696,25699,25701,25703,25705,25707,25709,25712,25714,25716,25718,25720,25722,25724,25727],{"class":2593,"line":6597},[414,25691,2956],{"class":2698},[414,25693,2959],{"class":2698},[414,25695,2962],{"class":2698},[414,25697,25698],{"class":2597}," createApplicationsWebhook",[414,25700,2968],{"class":2705},[414,25702,2972],{"class":2971},[414,25704,2646],{"class":2698},[414,25706,2977],{"class":2607},[414,25708,319],{"class":2705},[414,25710,25711],{"class":2971},"myWebhookUrl",[414,25713,2646],{"class":2698},[414,25715,2977],{"class":2607},[414,25717,2980],{"class":2705},[414,25719,2646],{"class":2698},[414,25721,2985],{"class":2597},[414,25723,2988],{"class":2705},[414,25725,25726],{"class":2597},"Webhook",[414,25728,25580],{"class":2705},[414,25730,25731],{"class":2593,"line":6603},[414,25732,25733],{"class":3527},"    \u002F\u002F createUnifiedWebhook returns the Webhook object directly\n",[414,25735,25736,25738,25740,25742,25745],{"class":2593,"line":6609},[414,25737,25149],{"class":2698},[414,25739,3002],{"class":2698},[414,25741,23229],{"class":2705},[414,25743,25744],{"class":2597},"createUnifiedWebhook",[414,25746,2826],{"class":2705},[414,25748,25749],{"class":2593,"line":6615},[414,25750,25751],{"class":2705},"        webhook: {\n",[414,25753,25754],{"class":2593,"line":6621},[414,25755,25756],{"class":2705},"            hookUrl: myWebhookUrl,\n",[414,25758,25759],{"class":2593,"line":6627},[414,25760,25761],{"class":2705},"            objectType: WebhookObjectType.AtsApplication,\n",[414,25763,25764],{"class":2593,"line":6633},[414,25765,25766],{"class":2705},"            event: WebhookEvent.Updated,\n",[414,25768,25769],{"class":2593,"line":6639},[414,25770,25023],{"class":2705},[414,25772,25773],{"class":2593,"line":6645},[414,25774,3768],{"class":2705},[414,25776,25777],{"class":2593,"line":6651},[414,25778,25779],{"class":2705},"    });\n",[414,25781,25782],{"class":2593,"line":6657},[414,25783,3035],{"class":2705},[414,25785,25786],{"class":2593,"line":6663},[414,25787,2740],{"emptyLinePlaceholder":2459},[414,25789,25790,25792,25794,25796,25799,25801,25804,25806,25808,25810,25813,25816,25818,25820,25822],{"class":2593,"line":6669},[414,25791,2956],{"class":2698},[414,25793,2959],{"class":2698},[414,25795,2962],{"class":2698},[414,25797,25798],{"class":2597}," handleUnifiedWebhook",[414,25800,2968],{"class":2705},[414,25802,25803],{"class":2971},"incoming",[414,25805,2646],{"class":2698},[414,25807,25572],{"class":2597},[414,25809,2988],{"class":2705},[414,25811,25812],{"class":2597},"IncomingApplication",[414,25814,25815],{"class":2705},">, ",[414,25817,24882],{"class":2971},[414,25819,2646],{"class":2698},[414,25821,24887],{"class":2597},[414,25823,3826],{"class":2705},[414,25825,25826,25829,25832,25835,25838],{"class":2593,"line":6675},[414,25827,25828],{"class":2698},"    if",[414,25830,25831],{"class":2705}," (incoming.webhook.object_type ",[414,25833,25834],{"class":2698},"!==",[414,25836,25837],{"class":2601}," 'ats_application'",[414,25839,3826],{"class":2705},[414,25841,25842,25845,25847],{"class":2593,"line":6681},[414,25843,25844],{"class":2698},"        return",[414,25846,3394],{"class":2705},[414,25848,25849],{"class":3527},"\u002F\u002F not for us\n",[414,25851,25852],{"class":2593,"line":6687},[414,25853,10535],{"class":2705},[414,25855,25856],{"class":2593,"line":6693},[414,25857,2740],{"emptyLinePlaceholder":2459},[414,25859,25860,25862,25865,25867,25870,25873],{"class":2593,"line":6699},[414,25861,3986],{"class":2698},[414,25863,25864],{"class":2607}," secret",[414,25866,2817],{"class":2698},[414,25868,25869],{"class":2705}," process.env.",[414,25871,25872],{"class":2607},"WORKSPACE_SECRET",[414,25874,2706],{"class":2705},[414,25876,25877,25879,25881,25883],{"class":2593,"line":6705},[414,25878,25828],{"class":2698},[414,25880,3970],{"class":2705},[414,25882,2837],{"class":2698},[414,25884,25885],{"class":2705},"secret) {\n",[414,25887,25888,25891,25893,25896,25898,25901],{"class":2593,"line":6711},[414,25889,25890],{"class":2698},"        throw",[414,25892,2820],{"class":2698},[414,25894,25895],{"class":2597}," Error",[414,25897,2968],{"class":2705},[414,25899,25900],{"class":2601},"'WORKSPACE_SECRET is not set'",[414,25902,3156],{"class":2705},[414,25904,25905],{"class":2593,"line":6717},[414,25906,10535],{"class":2705},[414,25908,25909],{"class":2593,"line":6723},[414,25910,2740],{"emptyLinePlaceholder":2459},[414,25912,25913,25915,25918,25920,25922,25924],{"class":2593,"line":6729},[414,25914,3986],{"class":2698},[414,25916,25917],{"class":2607}," computed",[414,25919,2817],{"class":2698},[414,25921,24215],{"class":2705},[414,25923,2716],{"class":2597},[414,25925,18230],{"class":2705},[414,25927,25928,25931,25933,25936],{"class":2593,"line":6735},[414,25929,25930],{"class":2597},"        createHmac",[414,25932,2968],{"class":2705},[414,25934,25935],{"class":2601},"'sha256'",[414,25937,25938],{"class":2705},", secret)\n",[414,25940,25941,25944,25947,25949,25951,25953,25955,25958],{"class":2593,"line":6741},[414,25942,25943],{"class":2705},"            .",[414,25945,25946],{"class":2597},"update",[414,25948,2968],{"class":2705},[414,25950,24222],{"class":2607},[414,25952,97],{"class":2705},[414,25954,24227],{"class":2597},[414,25956,25957],{"class":2705},"(incoming.data)) ",[414,25959,25960],{"class":3527},"\u002F\u002F must match the order and encoding received\n",[414,25962,25963,25965,25967,25969,25972],{"class":2593,"line":6747},[414,25964,25943],{"class":2705},[414,25966,25946],{"class":2597},[414,25968,2968],{"class":2705},[414,25970,25971],{"class":2597},"String",[414,25973,25974],{"class":2705},"(incoming.nonce))\n",[414,25976,25977,25979,25982,25984,25986],{"class":2593,"line":6753},[414,25978,25943],{"class":2705},[414,25980,25981],{"class":2597},"digest",[414,25983,2968],{"class":2705},[414,25985,24238],{"class":2601},[414,25987,18305],{"class":2705},[414,25989,25990,25993],{"class":2593,"line":6759},[414,25991,25992],{"class":2601},"        'utf8'",[414,25994,2757],{"class":2705},[414,25996,25997],{"class":2593,"line":6765},[414,25998,25999],{"class":2705},"    );\n",[414,26001,26002,26004,26007,26009,26011,26013,26016,26018,26020,26022,26025],{"class":2593,"line":6771},[414,26003,3986],{"class":2698},[414,26005,26006],{"class":2607}," provided",[414,26008,2817],{"class":2698},[414,26010,24215],{"class":2705},[414,26012,2716],{"class":2597},[414,26014,26015],{"class":2705},"(incoming.sig256 ",[414,26017,3082],{"class":2698},[414,26019,3734],{"class":2601},[414,26021,319],{"class":2705},[414,26023,26024],{"class":2601},"'utf8'",[414,26026,3156],{"class":2705},[414,26028,26029,26031,26034,26036,26039,26042,26044,26047,26050,26053],{"class":2593,"line":6777},[414,26030,25828],{"class":2698},[414,26032,26033],{"class":2705}," (computed.",[414,26035,25098],{"class":2607},[414,26037,26038],{"class":2698}," !==",[414,26040,26041],{"class":2705}," provided.",[414,26043,25098],{"class":2607},[414,26045,26046],{"class":2698}," ||",[414,26048,26049],{"class":2698}," !",[414,26051,26052],{"class":2597},"timingSafeEqual",[414,26054,26055],{"class":2705},"(computed, provided)) {\n",[414,26057,26059,26061,26063],{"class":2593,"line":26058},81,[414,26060,25844],{"class":2698},[414,26062,3394],{"class":2705},[414,26064,26065],{"class":3527},"\u002F\u002F signature mismatch: reject the payload\n",[414,26067,26069],{"class":2593,"line":26068},82,[414,26070,10535],{"class":2705},[414,26072,26074],{"class":2593,"line":26073},83,[414,26075,2740],{"emptyLinePlaceholder":2459},[414,26077,26079,26081,26084,26086,26088,26090,26092,26094,26096,26098],{"class":2593,"line":26078},84,[414,26080,25149],{"class":2698},[414,26082,26083],{"class":2705}," incoming.data?.",[414,26085,25051],{"class":2597},[414,26087,3096],{"class":2705},[414,26089,25056],{"class":2971},[414,26091,3107],{"class":2705},[414,26093,3110],{"class":2698},[414,26095,25075],{"class":2705},[414,26097,25066],{"class":2698},[414,26099,26100],{"class":2705}," trigger_status);\n",[414,26102,26104],{"class":2593,"line":26103},85,[414,26105,3035],{"class":2705},[2357,26107,26108,26109,26113],{},"Alternatively, create a polling schedule to ",[41,26110,26112],{"href":24773,"rel":26111},[45],"get new\u002Fupdated applications",", which would be similar to the code in 1a)",[2357,26115,26116,26119],{},[31,26117,26118],{},"Filter applications on a specific status",[2510,26120,26121,26135],{},[2357,26122,8879,26123,26127,26128,26130,26131,26134],{},[41,26124,25056],{"href":26125,"rel":26126},"https:\u002F\u002Fdocs.unified.to\u002Fats\u002Fapplication\u002Fmodel",[45]," carries a standard ",[36,26129,20261],{}," (with the vendor's own label in ",[36,26132,26133],{},"original_status","), so choose the status that should start the assessment.",[2357,26136,26137,26138,34,26141,34,26144,34,26147,34,26150,34,26153,34,26156,34,26159,34,26162,34,26165,34,26168,34,26171,34,26174,34,26177,26180,26181,319,26183,319,26185,319,26187,26189,26190,26192],{},"Application.Status options are ",[36,26139,26140],{},"NEW",[36,26142,26143],{},"REVIEWING",[36,26145,26146],{},"SCREENING",[36,26148,26149],{},"SUBMITTED",[36,26151,26152],{},"FIRST_INTERVIEW",[36,26154,26155],{},"SECOND_INTERVIEW",[36,26157,26158],{},"THIRD_INTERVIEW",[36,26160,26161],{},"BACKGROUND_CHECK",[36,26163,26164],{},"OFFERED",[36,26166,26167],{},"ACCEPTED",[36,26169,26170],{},"HIRED",[36,26172,26173],{},"REJECTED",[36,26175,26176],{},"DECLINED",[36,26178,26179],{},"WITHDRAWN",". Of these, ",[36,26182,26143],{},[36,26184,26146],{},[36,26186,26152],{},[36,26188,26155],{},", or ",[36,26191,26161],{}," should be considered.",[2357,26194,26195,26198],{},[31,26196,26197],{},"Email the candidate with the assessment based on the job",[2510,26199,26200,26334,26465],{},[2357,26201,26202,26207,26208,26211,26212],{},[41,26203,26206],{"href":26204,"rel":26205},"https:\u002F\u002Fdocs.unified.to\u002Fats\u002Fcandidate\u002FRetrieve_a_candidate",[45],"Read the candidate"," from the ",[36,26209,26210],{},"Application.candidate_id"," field",[2584,26213,26215],{"className":2689,"code":26214,"language":2691,"meta":2433,"style":2433},"import { UnifiedTo } from '@unified-api\u002Ftypescript-sdk';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: process.env.UNIFIED_API_KEY!,\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",[36,26216,26217,26229,26233,26247,26251,26261,26265,26269,26273,26303,26316,26321,26326,26330],{"__ignoreMap":2433},[414,26218,26219,26221,26223,26225,26227],{"class":2593,"line":2594},[414,26220,2699],{"class":2698},[414,26222,2713],{"class":2705},[414,26224,2716],{"class":2698},[414,26226,2719],{"class":2601},[414,26228,2706],{"class":2705},[414,26230,26231],{"class":2593,"line":2434},[414,26232,2740],{"emptyLinePlaceholder":2459},[414,26234,26235,26237,26239,26241,26243,26245],{"class":2593,"line":2613},[414,26236,2745],{"class":2698},[414,26238,2814],{"class":2607},[414,26240,2817],{"class":2698},[414,26242,2820],{"class":2698},[414,26244,2823],{"class":2597},[414,26246,2826],{"class":2705},[414,26248,26249],{"class":2593,"line":2625},[414,26250,23194],{"class":2705},[414,26252,26253,26255,26257,26259],{"class":2593,"line":2677},[414,26254,24840],{"class":2705},[414,26256,2560],{"class":2607},[414,26258,2837],{"class":2698},[414,26260,2757],{"class":2705},[414,26262,26263],{"class":2593,"line":2751},[414,26264,3548],{"class":2705},[414,26266,26267],{"class":2593,"line":2760},[414,26268,2846],{"class":2705},[414,26270,26271],{"class":2593,"line":2768},[414,26272,2740],{"emptyLinePlaceholder":2459},[414,26274,26275,26277,26279,26281,26284,26286,26288,26290,26292,26294,26297,26299,26301],{"class":2593,"line":2776},[414,26276,2956],{"class":2698},[414,26278,2959],{"class":2698},[414,26280,2962],{"class":2698},[414,26282,26283],{"class":2597}," readCandidate",[414,26285,2968],{"class":2705},[414,26287,2972],{"class":2971},[414,26289,2646],{"class":2698},[414,26291,2977],{"class":2607},[414,26293,319],{"class":2705},[414,26295,26296],{"class":2971},"candidateId",[414,26298,2646],{"class":2698},[414,26300,2977],{"class":2607},[414,26302,3826],{"class":2705},[414,26304,26305,26307,26309,26311,26314],{"class":2593,"line":2784},[414,26306,25149],{"class":2698},[414,26308,3002],{"class":2698},[414,26310,3005],{"class":2705},[414,26312,26313],{"class":2597},"getAtsCandidate",[414,26315,2826],{"class":2705},[414,26317,26318],{"class":2593,"line":2792},[414,26319,26320],{"class":2705},"        id: candidateId,\n",[414,26322,26323],{"class":2593,"line":2804},[414,26324,26325],{"class":2705},"        connectionId,\n",[414,26327,26328],{"class":2593,"line":2809},[414,26329,25779],{"class":2705},[414,26331,26332],{"class":2593,"line":2829},[414,26333,3035],{"class":2705},[2357,26335,26336,26337,26207,26342,26211,26345],{},"Optional: ",[41,26338,26341],{"href":26339,"rel":26340},"https:\u002F\u002Fdocs.unified.to\u002Fats\u002Fjob\u002FRetrieve_a_job",[45],"read the job",[36,26343,26344],{},"Application.job_id",[2584,26346,26348],{"className":2689,"code":26347,"language":2691,"meta":2433,"style":2433},"import { UnifiedTo } from '@unified-api\u002Ftypescript-sdk';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: process.env.UNIFIED_API_KEY!,\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",[36,26349,26350,26362,26366,26380,26384,26394,26398,26402,26406,26435,26448,26453,26457,26461],{"__ignoreMap":2433},[414,26351,26352,26354,26356,26358,26360],{"class":2593,"line":2594},[414,26353,2699],{"class":2698},[414,26355,2713],{"class":2705},[414,26357,2716],{"class":2698},[414,26359,2719],{"class":2601},[414,26361,2706],{"class":2705},[414,26363,26364],{"class":2593,"line":2434},[414,26365,2740],{"emptyLinePlaceholder":2459},[414,26367,26368,26370,26372,26374,26376,26378],{"class":2593,"line":2613},[414,26369,2745],{"class":2698},[414,26371,2814],{"class":2607},[414,26373,2817],{"class":2698},[414,26375,2820],{"class":2698},[414,26377,2823],{"class":2597},[414,26379,2826],{"class":2705},[414,26381,26382],{"class":2593,"line":2625},[414,26383,23194],{"class":2705},[414,26385,26386,26388,26390,26392],{"class":2593,"line":2677},[414,26387,24840],{"class":2705},[414,26389,2560],{"class":2607},[414,26391,2837],{"class":2698},[414,26393,2757],{"class":2705},[414,26395,26396],{"class":2593,"line":2751},[414,26397,3548],{"class":2705},[414,26399,26400],{"class":2593,"line":2760},[414,26401,2846],{"class":2705},[414,26403,26404],{"class":2593,"line":2768},[414,26405,2740],{"emptyLinePlaceholder":2459},[414,26407,26408,26410,26412,26414,26417,26419,26421,26423,26425,26427,26429,26431,26433],{"class":2593,"line":2776},[414,26409,2956],{"class":2698},[414,26411,2959],{"class":2698},[414,26413,2962],{"class":2698},[414,26415,26416],{"class":2597}," readJob",[414,26418,2968],{"class":2705},[414,26420,2972],{"class":2971},[414,26422,2646],{"class":2698},[414,26424,2977],{"class":2607},[414,26426,319],{"class":2705},[414,26428,24892],{"class":2971},[414,26430,2646],{"class":2698},[414,26432,2977],{"class":2607},[414,26434,3826],{"class":2705},[414,26436,26437,26439,26441,26443,26446],{"class":2593,"line":2784},[414,26438,25149],{"class":2698},[414,26440,3002],{"class":2698},[414,26442,3005],{"class":2705},[414,26444,26445],{"class":2597},"getAtsJob",[414,26447,2826],{"class":2705},[414,26449,26450],{"class":2593,"line":2792},[414,26451,26452],{"class":2705},"        id: jobId,\n",[414,26454,26455],{"class":2593,"line":2804},[414,26456,26325],{"class":2705},[414,26458,26459],{"class":2593,"line":2809},[414,26460,25779],{"class":2705},[414,26462,26463],{"class":2593,"line":2829},[414,26464,3035],{"class":2705},[2357,26466,26467,26468,319,26471,4149,26474,26477],{},"Determine which test to send to the candidate based on the ",[36,26469,26470],{},"Job.id",[36,26472,26473],{},"Job.description",[36,26475,26476],{},"Job.name"," fields",[2357,26479,26480,26483],{},[31,26481,26482],{},"Once the candidate has completed the assessment\u002Ftest, notify the hiring manager and\u002For recruiter",[2510,26484,26485,26623,26841,26849],{},[2357,26486,26487,26207,26491,4149,26494,26497,26498,26501],{},[41,26488,26490],{"href":23278,"rel":26489},[45],"Read the employee",[36,26492,26493],{},"Job.hiring_manager_ids",[36,26495,26496],{},"Job.recruiter_ids"," fields, on integrations that support the HR employee object on the same connection (Greenhouse and Lever do), and email them from ",[36,26499,26500],{},"Employee.emails",[2584,26502,26504],{"className":2689,"code":26503,"language":2691,"meta":2433,"style":2433},"import { UnifiedTo } from '@unified-api\u002Ftypescript-sdk';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: process.env.UNIFIED_API_KEY!,\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",[36,26505,26506,26518,26522,26536,26540,26550,26554,26558,26562,26592,26606,26611,26615,26619],{"__ignoreMap":2433},[414,26507,26508,26510,26512,26514,26516],{"class":2593,"line":2594},[414,26509,2699],{"class":2698},[414,26511,2713],{"class":2705},[414,26513,2716],{"class":2698},[414,26515,2719],{"class":2601},[414,26517,2706],{"class":2705},[414,26519,26520],{"class":2593,"line":2434},[414,26521,2740],{"emptyLinePlaceholder":2459},[414,26523,26524,26526,26528,26530,26532,26534],{"class":2593,"line":2613},[414,26525,2745],{"class":2698},[414,26527,2814],{"class":2607},[414,26529,2817],{"class":2698},[414,26531,2820],{"class":2698},[414,26533,2823],{"class":2597},[414,26535,2826],{"class":2705},[414,26537,26538],{"class":2593,"line":2625},[414,26539,23194],{"class":2705},[414,26541,26542,26544,26546,26548],{"class":2593,"line":2677},[414,26543,24840],{"class":2705},[414,26545,2560],{"class":2607},[414,26547,2837],{"class":2698},[414,26549,2757],{"class":2705},[414,26551,26552],{"class":2593,"line":2751},[414,26553,3548],{"class":2705},[414,26555,26556],{"class":2593,"line":2760},[414,26557,2846],{"class":2705},[414,26559,26560],{"class":2593,"line":2768},[414,26561,2740],{"emptyLinePlaceholder":2459},[414,26563,26564,26566,26568,26570,26573,26575,26577,26579,26581,26583,26586,26588,26590],{"class":2593,"line":2776},[414,26565,2956],{"class":2698},[414,26567,2959],{"class":2698},[414,26569,2962],{"class":2698},[414,26571,26572],{"class":2597}," readEmployee",[414,26574,2968],{"class":2705},[414,26576,2972],{"class":2971},[414,26578,2646],{"class":2698},[414,26580,2977],{"class":2607},[414,26582,319],{"class":2705},[414,26584,26585],{"class":2971},"employeeId",[414,26587,2646],{"class":2698},[414,26589,2977],{"class":2607},[414,26591,3826],{"class":2705},[414,26593,26594,26596,26598,26601,26604],{"class":2593,"line":2784},[414,26595,25149],{"class":2698},[414,26597,3002],{"class":2698},[414,26599,26600],{"class":2705}," sdk.hris.",[414,26602,26603],{"class":2597},"getHrisEmployee",[414,26605,2826],{"class":2705},[414,26607,26608],{"class":2593,"line":2792},[414,26609,26610],{"class":2705},"        id: employeeId,\n",[414,26612,26613],{"class":2593,"line":2804},[414,26614,26325],{"class":2705},[414,26616,26617],{"class":2593,"line":2809},[414,26618,25779],{"class":2705},[414,26620,26621],{"class":2593,"line":2829},[414,26622,3035],{"class":2705},[2357,26624,26336,26625,26630,26631],{},[41,26626,26629],{"href":26627,"rel":26628},"https:\u002F\u002Fdocs.unified.to\u002Fats\u002Fdocument\u002FCreate_a_document",[45],"write a PDF report"," to the application or candidate in the customer's ATS, on integrations that support document creation (Greenhouse and Workable attach to the application; Lever to the candidate)",[2584,26632,26634],{"className":2689,"code":26633,"language":2691,"meta":2433,"style":2433},"import { UnifiedTo } from '@unified-api\u002Ftypescript-sdk';\nimport { AtsDocumentType } from '@unified-api\u002Ftypescript-sdk\u002Fsdk\u002Fmodels\u002Fshared';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: process.env.UNIFIED_API_KEY!,\n    },\n});\n\n\u002F\u002F Greenhouse and Workable attach documents by applicationId; Lever, Ashby and SmartRecruiters by candidateId\nexport async function createDocument(connectionId: string, target: { applicationId?: string; candidateId?: string }, documentUrl: string, filename: string, type: AtsDocumentType) {\n    return await sdk.ats.createAtsDocument({\n        atsDocument: {\n            ...target,\n            type,\n            documentUrl,\n            filename,\n        },\n        connectionId,\n    });\n}\n",[36,26635,26636,26648,26661,26665,26679,26683,26693,26697,26701,26705,26710,26784,26797,26802,26810,26815,26820,26825,26829,26833,26837],{"__ignoreMap":2433},[414,26637,26638,26640,26642,26644,26646],{"class":2593,"line":2594},[414,26639,2699],{"class":2698},[414,26641,2713],{"class":2705},[414,26643,2716],{"class":2698},[414,26645,2719],{"class":2601},[414,26647,2706],{"class":2705},[414,26649,26650,26652,26655,26657,26659],{"class":2593,"line":2434},[414,26651,2699],{"class":2698},[414,26653,26654],{"class":2705}," { AtsDocumentType } ",[414,26656,2716],{"class":2698},[414,26658,2945],{"class":2601},[414,26660,2706],{"class":2705},[414,26662,26663],{"class":2593,"line":2613},[414,26664,2740],{"emptyLinePlaceholder":2459},[414,26666,26667,26669,26671,26673,26675,26677],{"class":2593,"line":2625},[414,26668,2745],{"class":2698},[414,26670,2814],{"class":2607},[414,26672,2817],{"class":2698},[414,26674,2820],{"class":2698},[414,26676,2823],{"class":2597},[414,26678,2826],{"class":2705},[414,26680,26681],{"class":2593,"line":2677},[414,26682,23194],{"class":2705},[414,26684,26685,26687,26689,26691],{"class":2593,"line":2751},[414,26686,24840],{"class":2705},[414,26688,2560],{"class":2607},[414,26690,2837],{"class":2698},[414,26692,2757],{"class":2705},[414,26694,26695],{"class":2593,"line":2760},[414,26696,3548],{"class":2705},[414,26698,26699],{"class":2593,"line":2768},[414,26700,2846],{"class":2705},[414,26702,26703],{"class":2593,"line":2776},[414,26704,2740],{"emptyLinePlaceholder":2459},[414,26706,26707],{"class":2593,"line":2784},[414,26708,26709],{"class":3527},"\u002F\u002F Greenhouse and Workable attach documents by applicationId; Lever, Ashby and SmartRecruiters by candidateId\n",[414,26711,26712,26714,26716,26718,26721,26723,26725,26727,26729,26731,26734,26736,26739,26742,26744,26746,26748,26750,26752,26754,26757,26760,26762,26764,26766,26769,26771,26773,26775,26777,26779,26782],{"class":2593,"line":2792},[414,26713,2956],{"class":2698},[414,26715,2959],{"class":2698},[414,26717,2962],{"class":2698},[414,26719,26720],{"class":2597}," createDocument",[414,26722,2968],{"class":2705},[414,26724,2972],{"class":2971},[414,26726,2646],{"class":2698},[414,26728,2977],{"class":2607},[414,26730,319],{"class":2705},[414,26732,26733],{"class":2971},"target",[414,26735,2646],{"class":2698},[414,26737,26738],{"class":2705}," { ",[414,26740,26741],{"class":2971},"applicationId",[414,26743,16892],{"class":2698},[414,26745,2977],{"class":2607},[414,26747,3394],{"class":2705},[414,26749,26296],{"class":2971},[414,26751,16892],{"class":2698},[414,26753,2977],{"class":2607},[414,26755,26756],{"class":2705}," }, ",[414,26758,26759],{"class":2971},"documentUrl",[414,26761,2646],{"class":2698},[414,26763,2977],{"class":2607},[414,26765,319],{"class":2705},[414,26767,26768],{"class":2971},"filename",[414,26770,2646],{"class":2698},[414,26772,2977],{"class":2607},[414,26774,319],{"class":2705},[414,26776,3397],{"class":2971},[414,26778,2646],{"class":2698},[414,26780,26781],{"class":2597}," AtsDocumentType",[414,26783,3826],{"class":2705},[414,26785,26786,26788,26790,26792,26795],{"class":2593,"line":2804},[414,26787,25149],{"class":2698},[414,26789,3002],{"class":2698},[414,26791,3005],{"class":2705},[414,26793,26794],{"class":2597},"createAtsDocument",[414,26796,2826],{"class":2705},[414,26798,26799],{"class":2593,"line":2809},[414,26800,26801],{"class":2705},"        atsDocument: {\n",[414,26803,26804,26807],{"class":2593,"line":2829},[414,26805,26806],{"class":2698},"            ...",[414,26808,26809],{"class":2705},"target,\n",[414,26811,26812],{"class":2593,"line":2843},[414,26813,26814],{"class":2705},"            type,\n",[414,26816,26817],{"class":2593,"line":2849},[414,26818,26819],{"class":2705},"            documentUrl,\n",[414,26821,26822],{"class":2593,"line":2854},[414,26823,26824],{"class":2705},"            filename,\n",[414,26826,26827],{"class":2593,"line":2880},[414,26828,3768],{"class":2705},[414,26830,26831],{"class":2593,"line":3253},[414,26832,26325],{"class":2705},[414,26834,26835],{"class":2593,"line":3261},[414,26836,25779],{"class":2705},[414,26838,26839],{"class":2593,"line":3279},[414,26840,3035],{"class":2705},[2357,26842,26336,26843,26848],{},[41,26844,26847],{"href":26845,"rel":26846},"https:\u002F\u002Fdocs.unified.to\u002Fats\u002Factivity\u002FCreate_an_activity",[45],"create an activity"," (a note on the candidate or application) on integrations that support it, such as Greenhouse, Lever, Workable and Ashby. Where the integration accepts scorecard creation (SmartRecruiters, Ashby, Workday and SAP SuccessFactors among them; not Greenhouse or Lever, as of 19 October 2026), you can create a scorecard instead.",[2357,26850,26336,26851,26856,26857,26860,26861,26863,26864],{},[41,26852,26855],{"href":26853,"rel":26854},"https:\u002F\u002Fdocs.unified.to\u002Fats\u002Fcandidate\u002FUpdate_a_candidate",[45],"update the candidate","'s ",[36,26858,26859],{},"tags"," on integrations where tags are writable (Greenhouse and Lever are two). Read the candidate's current ",[36,26862,26859],{},", add yours, and send the full list, so no existing tags are lost.",[2584,26865,26867],{"className":2689,"code":26866,"language":2691,"meta":2433,"style":2433},"import { UnifiedTo } from '@unified-api\u002Ftypescript-sdk';\n\nconst sdk = new UnifiedTo({\n    security: {\n        jwt: process.env.UNIFIED_API_KEY!,\n    },\n});\n\nexport async function updateCandidateTags(connectionId: string, candidateId: string, newTags: string[]) {\n    \u002F\u002F read the current tags and send the merged list, so no existing tags are lost\n    const candidate = await sdk.ats.getAtsCandidate({\n        id: candidateId,\n        connectionId,\n    });\n\n    return await sdk.ats.updateAtsCandidate({\n        atsCandidate: {\n            tags: [...new Set([...(candidate.tags ?? []), ...newTags])],\n        },\n        id: candidateId,\n        connectionId,\n    });\n}\n",[36,26868,26869,26881,26885,26899,26903,26913,26917,26921,26925,26963,26968,26984,26988,26992,26996,27000,27013,27018,27047,27051,27055,27059,27063],{"__ignoreMap":2433},[414,26870,26871,26873,26875,26877,26879],{"class":2593,"line":2594},[414,26872,2699],{"class":2698},[414,26874,2713],{"class":2705},[414,26876,2716],{"class":2698},[414,26878,2719],{"class":2601},[414,26880,2706],{"class":2705},[414,26882,26883],{"class":2593,"line":2434},[414,26884,2740],{"emptyLinePlaceholder":2459},[414,26886,26887,26889,26891,26893,26895,26897],{"class":2593,"line":2613},[414,26888,2745],{"class":2698},[414,26890,2814],{"class":2607},[414,26892,2817],{"class":2698},[414,26894,2820],{"class":2698},[414,26896,2823],{"class":2597},[414,26898,2826],{"class":2705},[414,26900,26901],{"class":2593,"line":2625},[414,26902,23194],{"class":2705},[414,26904,26905,26907,26909,26911],{"class":2593,"line":2677},[414,26906,24840],{"class":2705},[414,26908,2560],{"class":2607},[414,26910,2837],{"class":2698},[414,26912,2757],{"class":2705},[414,26914,26915],{"class":2593,"line":2751},[414,26916,3548],{"class":2705},[414,26918,26919],{"class":2593,"line":2760},[414,26920,2846],{"class":2705},[414,26922,26923],{"class":2593,"line":2768},[414,26924,2740],{"emptyLinePlaceholder":2459},[414,26926,26927,26929,26931,26933,26936,26938,26940,26942,26944,26946,26948,26950,26952,26954,26957,26959,26961],{"class":2593,"line":2776},[414,26928,2956],{"class":2698},[414,26930,2959],{"class":2698},[414,26932,2962],{"class":2698},[414,26934,26935],{"class":2597}," updateCandidateTags",[414,26937,2968],{"class":2705},[414,26939,2972],{"class":2971},[414,26941,2646],{"class":2698},[414,26943,2977],{"class":2607},[414,26945,319],{"class":2705},[414,26947,26296],{"class":2971},[414,26949,2646],{"class":2698},[414,26951,2977],{"class":2607},[414,26953,319],{"class":2705},[414,26955,26956],{"class":2971},"newTags",[414,26958,2646],{"class":2698},[414,26960,2977],{"class":2607},[414,26962,3682],{"class":2705},[414,26964,26965],{"class":2593,"line":2784},[414,26966,26967],{"class":3527},"    \u002F\u002F read the current tags and send the merged list, so no existing tags are lost\n",[414,26969,26970,26972,26974,26976,26978,26980,26982],{"class":2593,"line":2792},[414,26971,3986],{"class":2698},[414,26973,3975],{"class":2607},[414,26975,2817],{"class":2698},[414,26977,3002],{"class":2698},[414,26979,3005],{"class":2705},[414,26981,26313],{"class":2597},[414,26983,2826],{"class":2705},[414,26985,26986],{"class":2593,"line":2804},[414,26987,26320],{"class":2705},[414,26989,26990],{"class":2593,"line":2809},[414,26991,26325],{"class":2705},[414,26993,26994],{"class":2593,"line":2829},[414,26995,25779],{"class":2705},[414,26997,26998],{"class":2593,"line":2843},[414,26999,2740],{"emptyLinePlaceholder":2459},[414,27001,27002,27004,27006,27008,27011],{"class":2593,"line":2849},[414,27003,25149],{"class":2698},[414,27005,3002],{"class":2698},[414,27007,3005],{"class":2705},[414,27009,27010],{"class":2597},"updateAtsCandidate",[414,27012,2826],{"class":2705},[414,27014,27015],{"class":2593,"line":2854},[414,27016,27017],{"class":2705},"        atsCandidate: {\n",[414,27019,27020,27023,27026,27029,27032,27034,27037,27039,27042,27044],{"class":2593,"line":2880},[414,27021,27022],{"class":2705},"            tags: [",[414,27024,27025],{"class":2698},"...new",[414,27027,27028],{"class":2597}," Set",[414,27030,27031],{"class":2705},"([",[414,27033,25045],{"class":2698},[414,27035,27036],{"class":2705},"(candidate.tags ",[414,27038,3082],{"class":2698},[414,27040,27041],{"class":2705}," []), ",[414,27043,25045],{"class":2698},[414,27045,27046],{"class":2705},"newTags])],\n",[414,27048,27049],{"class":2593,"line":3253},[414,27050,3768],{"class":2705},[414,27052,27053],{"class":2593,"line":3261},[414,27054,26320],{"class":2705},[414,27056,27057],{"class":2593,"line":3279},[414,27058,26325],{"class":2705},[414,27060,27061],{"class":2593,"line":3313},[414,27062,25779],{"class":2705},[414,27064,27065],{"class":2593,"line":3326},[414,27066,3035],{"class":2705},[22,27068,27069],{},"Write-back targets vary by ATS (as of 19 October 2026): activities (notes, created on 55 integrations) and documents (48) are the widest options, application status is writable on 33 of 125 application integrations, and scorecards can be created on the fewest (12, not Greenhouse or Lever). Check the integration page before you design around one.",[3629,27071,27073],{"id":27072},"advanced-adding-rag-based-resume-matching","Advanced: Adding RAG-Based Resume Matching",[22,27075,27076],{},"Beyond triggering assessments, you can use the same data for retrieval-augmented generation (RAG):",[2510,27078,27079,27082,27097,27100,27113],{},[2357,27080,27081],{},"Subscribe to application created and updated webhooks so new resumes are embedded as they arrive.",[2357,27083,27084,27085,27087,27088,34,27090,27093,27094,97],{},"Retrieve the candidate's resume (an ",[36,27086,8062],{}," with ",[36,27089,3397],{},[36,27091,27092],{},"RESUME",") and the job's ",[36,27095,27096],{},"description",[2357,27098,27099],{},"Chunk and embed both documents.",[2357,27101,27102,27103,319,27105,319,27108,741,27110,97],{},"Store embeddings in your vector database with identifiers like ",[36,27104,85],{},[36,27106,27107],{},"candidate_id",[36,27109,24779],{},[36,27111,27112],{},"updated_at",[2357,27114,27115],{},"Retrieve the most relevant resume segments against the job description before generating screening insights or ranking scores.",[22,27117,27118,27121],{},[41,27119,123],{"href":121,"rel":27120},[45]," reads the ATS data at request time and returns it in one schema across ATS integrations, with no customer records at rest; embeddings and retrieval stay in your infrastructure.",[55,27123,27125],{"id":27124},"keep-learning","Keep learning",[2354,27127,27128,27135,27141],{},[2357,27129,27130],{},[41,27131,27134],{"href":27132,"rel":27133},"https:\u002F\u002Funified.to\u002Fblog\u002Fstart_here_how_to_add_a_test_connection",[45],"How to add a test connection",[2357,27136,27137],{},[41,27138,27140],{"href":16766,"rel":27139},[45],"How your customers add integrations from your application",[2357,27142,27143],{},[41,27144,27147],{"href":27145,"rel":27146},"https:\u002F\u002Funified.to\u002Fblog\u002Fstart_here_how_to_generate_oauth2_credentials",[45],"How to generate OAuth 2 credentials",[55,27149,27151],{"id":27150},"how-do-you-start","How do you start?",[22,27153,27154,27155,4149,27158,97],{},"Connect a test ATS, list its applications and register an application webhook; the steps above are the whole integration. ",[41,27156,21422],{"href":21420,"rel":27157},[45],[41,27159,4154],{"href":4152,"rel":27160},[45],[4156,27162,27163],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":2433,"searchDepth":2434,"depth":2434,"links":27165},[27166,27167,27170,27171],{"id":24702,"depth":2434,"text":24703},{"id":24747,"depth":2434,"text":24748,"children":27168},[27169],{"id":27072,"depth":2613,"text":27073},{"id":27124,"depth":2434,"text":27125},{"id":27150,"depth":2434,"text":27151},"There are two ways to build a candidate assessment product on your customers' ATS. In the first, your product reads applications through Unified.to's ATS API,...",{"img":27174,"date":27175,"updated":27176,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_build_a_candidate_assessment_product_with-icon.png","2023-10-23T00:00:00.000Z","2026-10-21T13:51:12.889Z","\u002Fguides\u002Fhow_to_build_a_candidate_assessment_product_with",{"title":24664,"description":27172},"guides\u002Fhow_to_build_a_candidate_assessment_product_with","depn2DxAD4kiNYV7xeiwA5_oMYtZ46DwysyG79Rt_Zw",{"id":27182,"title":27183,"body":27184,"description":27829,"extension":2452,"meta":27830,"navigation":2459,"path":27834,"seo":27835,"stem":27836,"__hash__":27837},"guides\u002Fguides\u002Fhow_to_build_a_candidate_sourcing_or_job_board_app_with_unified.md","How to build a candidate sourcing or job board app with Unified.to",{"type":12,"value":27185,"toc":27818},[27186,27189,27191,27196,27203,27207,27210,27213,27216,27218,27230,27235,27246,27248,27251,27259,27262,27266,27269,27275,27287,27392,27399,27423,27428,27431,27435,27438,27469,27715,27719,27749,27757,27761,27769,27771,27781,27785,27815],[15,27187,27183],{"id":27188},"how-to-build-a-candidate-sourcing-or-job-board-app-with-unifiedto",[19,27190],{},[22,27192,27193],{},[25,27194,27195],{},"January 4, 2024",[22,27197,27198,27199,27202],{},"To build a candidate sourcing or job board app with ",[41,27200,123],{"href":121,"rel":27201},[45],"'s ATS API, read your customer's open jobs, then send candidates to the job's public page or create the candidate and application in the ATS, and attach their resume.",[55,27204,27206],{"id":27205},"why-build-with-a-unified-api","Why build with a unified API?",[22,27208,27209],{},"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.",[22,27211,27212],{},"Instead of building each ATS integration separately, developers can use a unified API to launch many at once. Unified APIs simplify integration efforts by offering consistent endpoints and data formats that reduce the complexity of managing numerous APIs.",[22,27214,27215],{},"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.",[55,27217,2542],{"id":2541},[22,27219,27220,27221,27225,27226,27229],{},"Before starting, be sure to review our ",[41,27222,27224],{"href":24756,"rel":27223},[45],"Getting Started with Unified"," article. It will walk you through registering for a free account and our onboarding. Once you have completed the onboarding steps, go ahead and ",[22236,27227],{"width":22238,"height":22239,"src":27228,"title":22241,"frameBorder":3604,"allow":22242,"referrerPolicy":23957,"allowFullScreen":2459},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FT5Caf7ASTCA"," as you like.",[22,27231,27232],{},[4201,27233],{"alt":20627,"src":27234},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_build_a_candidate_sourcing_or_job_board_app_with_unified-0.png",[22,27236,27237,27238,27241,27242,27245],{},"Next, deploy the ",[41,27239,123],{"href":121,"rel":27240},[45]," Embedded Authorization widget in your product's user-interface.  Check out our ",[22236,27243],{"width":22238,"height":22239,"src":27244,"title":22241,"frameBorder":3604,"allow":22242,"referrerPolicy":23957,"allowFullScreen":2459},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FBqbzTPg6yi0"," to learn more.",[55,27247,4426],{"id":4425},[22,27249,27250],{},"These are main steps that you will need to support to build your candidate sourcing or job board app:",[2510,27252,27253,27256],{},[2357,27254,27255],{},"read active jobs to search relevant candidates for",[2357,27257,27258],{},"apply a candidate to a job",[22,27260,27261],{},"Let's go into more detail for each.",[55,27263,27265],{"id":27264},"step-1-read-jobs","Step 1: Read Jobs",[22,27267,27268],{},"Before searching or finding relevant candidates, you'll need to know which jobs your customer wants you to search for.",[22,27270,27271,27274],{},[41,27272,123],{"href":121,"rel":27273},[45]," reads jobs from your customer's ATS.",[22,27276,27277,27278,3970,27283,27286],{},"To get a list of existing jobs from your end user's ATS, call the List all jobs ",[41,27279,27282],{"href":27280,"rel":27281},"https:\u002F\u002Fdocs.unified.to\u002Fats\u002Fjob\u002FList_all_jobs",[45],"API endpoint",[36,27284,27285],{},"listAtsJobs"," in the TypeScript SDK).",[2584,27288,27290],{"className":2689,"code":27289,"language":2691,"meta":2433,"style":2433},"import { UnifiedTo } from '@unified-api\u002Ftypescript-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",[36,27291,27292,27304,27308,27322,27326,27335,27339,27343,27347,27368,27380,27384,27388],{"__ignoreMap":2433},[414,27293,27294,27296,27298,27300,27302],{"class":2593,"line":2594},[414,27295,2699],{"class":2698},[414,27297,2713],{"class":2705},[414,27299,2716],{"class":2698},[414,27301,2719],{"class":2601},[414,27303,2706],{"class":2705},[414,27305,27306],{"class":2593,"line":2434},[414,27307,2740],{"emptyLinePlaceholder":2459},[414,27309,27310,27312,27314,27316,27318,27320],{"class":2593,"line":2613},[414,27311,2745],{"class":2698},[414,27313,2814],{"class":2607},[414,27315,2817],{"class":2698},[414,27317,2820],{"class":2698},[414,27319,2823],{"class":2597},[414,27321,2826],{"class":2705},[414,27323,27324],{"class":2593,"line":2625},[414,27325,23194],{"class":2705},[414,27327,27328,27330,27333],{"class":2593,"line":2677},[414,27329,23199],{"class":2705},[414,27331,27332],{"class":2601},"\"\u003CYOUR_API_KEY_HERE>\"",[414,27334,2757],{"class":2705},[414,27336,27337],{"class":2593,"line":2751},[414,27338,3548],{"class":2705},[414,27340,27341],{"class":2593,"line":2760},[414,27342,2846],{"class":2705},[414,27344,27345],{"class":2593,"line":2768},[414,27346,2740],{"emptyLinePlaceholder":2459},[414,27348,27349,27351,27353,27355,27358,27360,27362,27364,27366],{"class":2593,"line":2776},[414,27350,2956],{"class":2698},[414,27352,2959],{"class":2698},[414,27354,2962],{"class":2698},[414,27356,27357],{"class":2597}," getJobs",[414,27359,2968],{"class":2705},[414,27361,2972],{"class":2971},[414,27363,2646],{"class":2698},[414,27365,2977],{"class":2607},[414,27367,3826],{"class":2705},[414,27369,27370,27372,27374,27376,27378],{"class":2593,"line":2784},[414,27371,25149],{"class":2698},[414,27373,3002],{"class":2698},[414,27375,3005],{"class":2705},[414,27377,27285],{"class":2597},[414,27379,2826],{"class":2705},[414,27381,27382],{"class":2593,"line":2792},[414,27383,26325],{"class":2705},[414,27385,27386],{"class":2593,"line":2804},[414,27387,25779],{"class":2705},[414,27389,27390],{"class":2593,"line":2809},[414,27391,3035],{"class":2705},[22,27393,27394,27395,27398],{},"The connection_id comes in from your end user's authorization of their ATS and is stored on your end. You can watch our ",[22236,27396],{"width":22238,"height":22239,"src":27397,"title":22241,"frameBorder":3604,"allow":22242,"referrerPolicy":23957,"allowFullScreen":2459},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002Fsd9Efb4i9N0"," for more detail.",[22,27400,2553,27401,27403,27404,319,27406,319,27408,319,27411,741,27414,27417,27418,27422],{},[36,27402,21943],{}," has fields such as ",[36,27405,9043],{},[36,27407,27096],{},[36,27409,27410],{},"compensation",[36,27412,27413],{},"addresses",[36,27415,27416],{},"remote"," that will be relevant to your software. Reference our ",[41,27419,27421],{"href":23444,"rel":27420},[45],"API docs"," for more information.",[22,27424,27425],{},[4201,27426],{"alt":20627,"src":27427},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_build_a_candidate_sourcing_or_job_board_app_with_unified-1.png",[22,27429,27430],{},"Once you have the list of jobs, ask your customer to identify which jobs your app should identify candidates for.",[55,27432,27434],{"id":27433},"step-2-create-an-application","Step 2: Create an application",[22,27436,27437],{},"Once you have a candidate, there are two ways to create a job application.",[2510,27439,27440,27451],{},[2357,27441,27442,27443,27446,27447,27450],{},"Send the interested candidate to the job's public web page to apply directly. Many integrations return ",[36,27444,27445],{},"public_job_urls",", a list of the job's public pages (on Greenhouse it's a slow field: request it with ",[36,27448,27449],{},"fields","). 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.",[2357,27452,27453,27454,34,27457,27461,27462,34,27465,97],{},"Create an application and candidate in the ATS directly using our Unified ATS API. This is easily accomplished by using the ",[36,27455,27456],{},"createCandidate",[41,27458,27282],{"href":27459,"rel":27460},"https:\u002F\u002Fdocs.unified.to\u002Fats\u002Fcandidate\u002FCreate_a_candidate",[45]," and  ",[36,27463,27464],{},"createApplication",[41,27466,27282],{"href":27467,"rel":27468},"https:\u002F\u002Fdocs.unified.to\u002Fats\u002Fapplication\u002FCreate_an_application",[45],[2584,27470,27472],{"className":2689,"code":27471,"language":2691,"meta":2433,"style":2433},"import { UnifiedTo } from '@unified-api\u002Ftypescript-sdk';\nimport { AtsCandidate } from '@unified-api\u002Ftypescript-sdk\u002Fdist\u002Fsdk\u002Fmodels\u002Fshared';\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",[36,27473,27474,27486,27499,27503,27517,27521,27529,27533,27537,27541,27571,27588,27593,27597,27601,27605,27612,27616,27620,27657,27674,27679,27684,27688,27692,27696,27700,27704,27711],{"__ignoreMap":2433},[414,27475,27476,27478,27480,27482,27484],{"class":2593,"line":2594},[414,27477,2699],{"class":2698},[414,27479,2713],{"class":2705},[414,27481,2716],{"class":2698},[414,27483,2719],{"class":2601},[414,27485,2706],{"class":2705},[414,27487,27488,27490,27492,27494,27497],{"class":2593,"line":2434},[414,27489,2699],{"class":2698},[414,27491,2940],{"class":2705},[414,27493,2716],{"class":2698},[414,27495,27496],{"class":2601}," '@unified-api\u002Ftypescript-sdk\u002Fdist\u002Fsdk\u002Fmodels\u002Fshared'",[414,27498,2706],{"class":2705},[414,27500,27501],{"class":2593,"line":2613},[414,27502,2740],{"emptyLinePlaceholder":2459},[414,27504,27505,27507,27509,27511,27513,27515],{"class":2593,"line":2625},[414,27506,2745],{"class":2698},[414,27508,2814],{"class":2607},[414,27510,2817],{"class":2698},[414,27512,2820],{"class":2698},[414,27514,2823],{"class":2597},[414,27516,2826],{"class":2705},[414,27518,27519],{"class":2593,"line":2677},[414,27520,23194],{"class":2705},[414,27522,27523,27525,27527],{"class":2593,"line":2751},[414,27524,23199],{"class":2705},[414,27526,23202],{"class":2601},[414,27528,2757],{"class":2705},[414,27530,27531],{"class":2593,"line":2760},[414,27532,3548],{"class":2705},[414,27534,27535],{"class":2593,"line":2768},[414,27536,2846],{"class":2705},[414,27538,27539],{"class":2593,"line":2776},[414,27540,2740],{"emptyLinePlaceholder":2459},[414,27542,27543,27545,27547,27549,27552,27554,27556,27558,27560,27562,27565,27567,27569],{"class":2593,"line":2784},[414,27544,2956],{"class":2698},[414,27546,2959],{"class":2698},[414,27548,2962],{"class":2698},[414,27550,27551],{"class":2597}," createCandidate",[414,27553,2968],{"class":2705},[414,27555,2972],{"class":2971},[414,27557,2646],{"class":2698},[414,27559,2977],{"class":2607},[414,27561,319],{"class":2705},[414,27563,27564],{"class":2971},"atsCandidate",[414,27566,2646],{"class":2698},[414,27568,3058],{"class":2597},[414,27570,3826],{"class":2705},[414,27572,27573,27575,27577,27579,27581,27583,27586],{"class":2593,"line":2792},[414,27574,3986],{"class":2698},[414,27576,3470],{"class":2607},[414,27578,2817],{"class":2698},[414,27580,3002],{"class":2698},[414,27582,3005],{"class":2705},[414,27584,27585],{"class":2597},"createAtsCandidate",[414,27587,2826],{"class":2705},[414,27589,27590],{"class":2593,"line":2804},[414,27591,27592],{"class":2705},"        atsCandidate,\n",[414,27594,27595],{"class":2593,"line":2809},[414,27596,26325],{"class":2705},[414,27598,27599],{"class":2593,"line":2829},[414,27600,25779],{"class":2705},[414,27602,27603],{"class":2593,"line":2843},[414,27604,2740],{"emptyLinePlaceholder":2459},[414,27606,27607,27609],{"class":2593,"line":2849},[414,27608,25149],{"class":2698},[414,27610,27611],{"class":2705}," result.atsCandidate?.id;\n",[414,27613,27614],{"class":2593,"line":2854},[414,27615,3035],{"class":2705},[414,27617,27618],{"class":2593,"line":2880},[414,27619,2740],{"emptyLinePlaceholder":2459},[414,27621,27622,27624,27626,27628,27631,27633,27635,27637,27639,27641,27643,27645,27647,27649,27651,27653,27655],{"class":2593,"line":3253},[414,27623,2956],{"class":2698},[414,27625,2959],{"class":2698},[414,27627,2962],{"class":2698},[414,27629,27630],{"class":2597}," createApplication",[414,27632,2968],{"class":2705},[414,27634,2972],{"class":2971},[414,27636,2646],{"class":2698},[414,27638,2977],{"class":2607},[414,27640,319],{"class":2705},[414,27642,26296],{"class":2971},[414,27644,2646],{"class":2698},[414,27646,2977],{"class":2607},[414,27648,319],{"class":2705},[414,27650,24892],{"class":2971},[414,27652,2646],{"class":2698},[414,27654,2977],{"class":2607},[414,27656,3826],{"class":2705},[414,27658,27659,27661,27663,27665,27667,27669,27672],{"class":2593,"line":3261},[414,27660,3986],{"class":2698},[414,27662,3470],{"class":2607},[414,27664,2817],{"class":2698},[414,27666,3002],{"class":2698},[414,27668,3005],{"class":2705},[414,27670,27671],{"class":2597},"createAtsApplication",[414,27673,2826],{"class":2705},[414,27675,27676],{"class":2593,"line":3279},[414,27677,27678],{"class":2705},"        atsApplication: {\n",[414,27680,27681],{"class":2593,"line":3313},[414,27682,27683],{"class":2705},"            candidateId,\n",[414,27685,27686],{"class":2593,"line":3326},[414,27687,25008],{"class":2705},[414,27689,27690],{"class":2593,"line":3339},[414,27691,3768],{"class":2705},[414,27693,27694],{"class":2593,"line":3359},[414,27695,26325],{"class":2705},[414,27697,27698],{"class":2593,"line":6453},[414,27699,25779],{"class":2705},[414,27701,27702],{"class":2593,"line":6459},[414,27703,2740],{"emptyLinePlaceholder":2459},[414,27705,27706,27708],{"class":2593,"line":6465},[414,27707,25149],{"class":2698},[414,27709,27710],{"class":2705}," result.atsApplication?.id;\n",[414,27712,27713],{"class":2593,"line":6471},[414,27714,3035],{"class":2705},[55,27716,27718],{"id":27717},"step-3-uploading-a-resumecvcover-letter-optional","Step 3: uploading a resume\u002FCV\u002Fcover letter (optional)",[22,27720,27721,27722,34,27724,27728,27729,319,27731,27733,27734,27737,27738,27741,27742,27745,27746,27748],{},"You can also upload the candidate's documents. Set the ",[36,27723,21955],{},[41,27725,27727],{"href":23414,"rel":27726},[45],"object"," fields your customer's ATS requires: usually ",[36,27730,26768],{},[36,27732,3397],{}," (such as RESUME), the file as ",[36,27735,27736],{},"document_url"," or base64 ",[36,27739,27740],{},"document_data",", and the record it attaches to. Greenhouse and Workable attach to an ",[36,27743,27744],{},"application_id"," and take a URL only; Lever attaches to a ",[36,27747,27107],{}," and also accepts base64.",[22,27750,27751,27752,27422],{},"Some ATS providers may require additional fields to be present. Be sure to check their ",[41,27753,27756],{"href":27754,"rel":27755},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fgreenhouse?tab=support",[45],"feature support page",[55,27758,27760],{"id":27759},"step-4-review-the-application-status-optional","Step 4: Review the application status (optional)",[22,27762,27763,27764,27768],{},"If you need to be informed on the status of the candidate's job application, use the Retrieve an application ",[41,27765,27282],{"href":27766,"rel":27767},"https:\u002F\u002Fdocs.unified.to\u002Fats\u002Fapplication\u002FRetrieve_an_application",[45],", or subscribe to application updated events on integrations that support them (native or virtual webhooks).",[55,27770,22307],{"id":22306},[22,27772,3370,27773,26856,27776,27780],{},[41,27774,123],{"href":121,"rel":27775},[45],[41,27777,27779],{"href":4304,"rel":27778},[45],"ATS API"," to support 164 ATS integrations in your sourcing or job-board app with one integration.",[55,27782,27784],{"id":27783},"additional-resources","Additional resources",[2354,27786,27787,27793,27800,27807,27811],{},[2357,27788,27789],{},[41,27790,27792],{"href":4304,"rel":27791},[45],"Unified ATS API",[2357,27794,27795],{},[41,27796,27799],{"href":27797,"rel":27798},"https:\u002F\u002Fdocs.unified.to\u002Fats\u002Foverview",[45],"API Documentation for the Unified ATS API",[2357,27801,27802],{},[41,27803,27806],{"href":27804,"rel":27805},"https:\u002F\u002Fdocs.unified.to\u002Foverview\u002Fsdks",[45],"SDKs for Unified.to",[2357,27808,27809],{},[22236,27810],{"width":22238,"height":22239,"src":27244,"title":22241,"frameBorder":3604,"allow":22242,"referrerPolicy":23957,"allowFullScreen":2459},[2357,27812,27813],{},[22236,27814],{"width":22238,"height":22239,"src":27397,"title":22241,"frameBorder":3604,"allow":22242,"referrerPolicy":23957,"allowFullScreen":2459},[4156,27816,27817],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":2433,"searchDepth":2434,"depth":2434,"links":27819},[27820,27821,27822,27823,27824,27825,27826,27827,27828],{"id":27205,"depth":2434,"text":27206},{"id":2541,"depth":2434,"text":2542},{"id":4425,"depth":2434,"text":4426},{"id":27264,"depth":2434,"text":27265},{"id":27433,"depth":2434,"text":27434},{"id":27717,"depth":2434,"text":27718},{"id":27759,"depth":2434,"text":27760},{"id":22306,"depth":2434,"text":22307},{"id":27783,"depth":2434,"text":27784},"To build a candidate sourcing or job board app with Unified.to's ATS API, read your customer's open jobs, then send candidates to the job's public page or...",{"img":27831,"date":27832,"updated":27833,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_build_a_candidate_sourcing_or_job_board_app_with_unified-icon.png","2024-01-04T00:00:00.000Z","2026-10-21T11:24:18.901Z","\u002Fguides\u002Fhow_to_build_a_candidate_sourcing_or_job_board_app_with_unified",{"title":27183,"description":27829},"guides\u002Fhow_to_build_a_candidate_sourcing_or_job_board_app_with_unified","PVg1NjnyV4Rh7nY98umxU9s-wx7jXNTzUThQL0kFkPo",{"id":27839,"title":27840,"body":27841,"description":27855,"extension":2452,"meta":31307,"navigation":2459,"path":31312,"seo":31313,"stem":31314,"__hash__":31315},"guides\u002Fguides\u002Fhow_to_build_a_discord_support_bot_with_unified_and_langbase.md","How to build a Discord support bot with Unified.to and Langbase",{"type":12,"value":27842,"toc":31292},[27843,27846,27848,27853,27856,27859,27862,27864,27867,27881,27884,27886,27889,27914,27923,27931,27935,27944,27952,27956,27973,27976,27992,27996,27999,28032,28035,28039,28042,28051,28097,28104,28109,28112,28117,28243,28246,28260,28268,28272,28275,28278,28759,28768,28779,28783,28791,28794,28808,28811,28954,28964,28967,29170,29179,29182,29196,29199,29291,29300,29303,29307,29310,29315,29561,29569,29574,29791,29796,29940,29943,29954,29961,29965,29968,30477,30485,30489,30492,31215,31218,31232,31235,31246,31249,31253,31256,31269,31272,31275,31286,31289],[15,27844,27840],{"id":27845},"how-to-build-a-discord-support-bot-with-unifiedto-and-langbase",[19,27847],{},[22,27849,27850],{},[25,27851,27852],{},"December 12, 2024",[22,27854,27855],{},"Want to build an AI-powered support bot that can answer questions with information from an knowledge base?",[22,27857,27858],{},"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 Messaging API, so it can answer support questions.",[22,27860,27861],{},"We'll be using React and Typescript in these examples, which you can adapt to fit your framework of choice.",[55,27863,4426],{"id":4425},[22,27865,27866],{},"This guide walks you through how to:",[2354,27868,27869,27872,27875,27878],{},[2357,27870,27871],{},"Pull knowledge base content using Unified.to's KMS API",[2357,27873,27874],{},"Process and prepare this content using Langbase's Memory Agents",[2357,27876,27877],{},"Create an AI agent using Langbase Pipes",[2357,27879,27880],{},"Send responses through Discord using Unified.to's Messaging API",[22,27882,27883],{},"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.",[55,27885,4890],{"id":4889},[22,27887,27888],{},"Make sure you have:",[2354,27890,27891,27897,27903,27911],{},[2357,27892,2553,27893,27896],{},[41,27894,123],{"href":4146,"rel":27895},[45]," account",[2357,27898,2553,27899,27896],{},[41,27900,27902],{"href":4213,"rel":27901},[45],"Langbase",[2357,27904,27905,27906],{},"Access to a knowledge management system (e.g., Notion) containing your support content\n",[2354,27907,27908],{},[2357,27909,27910],{},"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",[2357,27912,27913],{},"A Discord server where you want to deploy your bot",[4937,27915,27916],{},[22,27917,27918,27919,27922],{},"If you don't want to use real data from Notion or Discord, you can also take advantage of Unified.to's ",[41,27920,22272],{"href":16303,"rel":27921},[45]," and work with synthetic data instead.",[22,27924,27925,27926,27930],{},"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 ",[41,27927,27929],{"href":16766,"rel":27928},[45],"Quick Start guide"," to get familiar with the platform.",[55,27932,27934],{"id":27933},"set-up-your-connections","Set up your connections",[22,27936,27937,27938,27943],{},"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 ",[41,27939,27942],{"href":27940,"rel":27941},"https:\u002F\u002Funified.to\u002Fkms",[45],"KMS API"," supports 33 platforms today and more are being added on a regular basis.",[22,27945,27946,27948,27949,97],{},[31,27947,22779],{}," If you're using the sandbox environment, for the steps below that ask you to enter your OAuth 2 credentials, just enter any random value e.g., ",[36,27950,27951],{},"test123",[3629,27953,27955],{"id":27954},"activate-notion-and-discord-integrations","Activate Notion and Discord integrations",[2510,27957,27958,27965,27968],{},[2357,27959,27960,27961],{},"On app.unified.to, go to the ",[41,27962,27964],{"href":16276,"rel":27963},[45],"Integrations page",[2357,27966,27967],{},"Search for and select Notion",[2357,27969,27970,27971],{},"Choose OAuth 2, enter your credentials (which can be anything if you're using the sandbox environment), and then click ",[31,27972,16295],{},[22,27974,27975],{},"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:",[2354,27977,27978,27985],{},[2357,27979,27980],{},[41,27981,27984],{"href":27982,"rel":27983},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_set_up_and_configure_notion",[45],"How to set up and configure Notion",[2357,27986,27987],{},[41,27988,27991],{"href":27989,"rel":27990},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_get_your_discord_oauth_2_credentials_and_bot_token",[45],"How to get your Discord OAuth 2 credentials and bot token",[3629,27993,27995],{"id":27994},"sandbox-environment-create-a-test-connection-from-the-web-app","(Sandbox environment) Create a test connection from the web app",[22,27997,27998],{},"If you're using the sandbox environment, then you can create test connections easily from the web app.",[2510,28000,28001,28007,28013,28022],{},[2357,28002,27960,28003,16437],{},[41,28004,16241],{"href":28005,"rel":28006},"https:\u002F\u002Fapp.unified.to\u002Fconnections",[45],[2357,28008,28009,28010,28012],{},"Click on ",[31,28011,16442],{}," at the top right corner of the page (note: this will only show up if your current environment is the sandbox environment)",[2357,28014,28015,28016,741,28019,28021],{},"Click on the ",[31,28017,28018],{},"Notion",[31,28020,21800],{}," integrations",[2357,28023,16292,28024,28026,28028],{},[31,28025,7276],{},[5888,28027],{},[4201,28029],{"alt":28030,"src":28031},"Screenshot_2024-12-12_at_10.58.17_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_build_a_discord_support_bot_with_unified_and_langbase-0.png",[22,28033,28034],{},"Skip ahead to the 'Pull content from your knowledge base' step below.",[3629,28036,28038],{"id":28037},"production-environments-add-the-authorization-component-to-your-app","(Production environments) Add the Authorization component to your app",[22,28040,28041],{},"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:",[2510,28043,28044],{},[2357,28045,28046,28047,28050],{},"Add the following React component to your app. Make sure to replace ",[36,28048,28049],{},"WORKSPACE_ID"," with your actual workspace ID.",[2584,28052,28054],{"className":16485,"code":28053,"language":16487,"meta":2433,"style":2433},"\u002F\u002F TODO: Make sure to run 'npm install @unified-api\u002Freact-directory'\nimport UnifiedDirectory from '@unified-api\u002Freact-directory';\n\n\u003CUnifiedDirectory workspace_id={WORKSPACE_ID}\u002F>\n",[36,28055,28056,28061,28073,28077],{"__ignoreMap":2433},[414,28057,28058],{"class":2593,"line":2594},[414,28059,28060],{"class":3527},"\u002F\u002F TODO: Make sure to run 'npm install @unified-api\u002Freact-directory'\n",[414,28062,28063,28065,28067,28069,28071],{"class":2593,"line":2434},[414,28064,2699],{"class":2698},[414,28066,16496],{"class":2705},[414,28068,2716],{"class":2698},[414,28070,16501],{"class":2601},[414,28072,2706],{"class":2705},[414,28074,28075],{"class":2593,"line":2613},[414,28076,2740],{"emptyLinePlaceholder":2459},[414,28078,28079,28081,28084,28087,28089,28092,28094],{"class":2593,"line":2625},[414,28080,2988],{"class":2705},[414,28082,28083],{"class":2607},"UnifiedDirectory",[414,28085,28086],{"class":2597}," workspace_id",[414,28088,2798],{"class":2698},[414,28090,28091],{"class":2705},"{",[414,28093,28049],{"class":2607},[414,28095,28096],{"class":2705},"}\u002F>\n",[22,28098,28099,28100,97],{},"We also offer pre-built embedded components in Angular, Vue, and Svelte. See other ways to display the Authorization component in your app ",[41,28101,28103],{"href":22173,"rel":28102},[45],"here",[2354,28105,28106],{},[2357,28107,28108],{},"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!",[22,28110,28111],{},"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).",[2510,28113,28114],{},[2357,28115,28116],{},"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:",[2584,28118,28120],{"className":16485,"code":28119,"language":16487,"meta":2433,"style":2433},"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\u002F\u002F 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",[36,28121,28122,28131,28148,28169,28173,28180,28195,28200,28215,28219,28223,28227],{"__ignoreMap":2433},[414,28123,28124,28126,28129],{"class":2593,"line":2594},[414,28125,16512],{"class":2698},[414,28127,28128],{"class":2597}," handleAuthCallback",[414,28130,3936],{"class":2705},[414,28132,28133,28135,28138,28140,28142,28145],{"class":2593,"line":2434},[414,28134,3071],{"class":2698},[414,28136,28137],{"class":2607}," urlParams",[414,28139,2817],{"class":2698},[414,28141,2820],{"class":2698},[414,28143,28144],{"class":2597}," URLSearchParams",[414,28146,28147],{"class":2705},"(window.location.search);\n",[414,28149,28150,28152,28154,28156,28159,28162,28164,28167],{"class":2593,"line":2613},[414,28151,3071],{"class":2698},[414,28153,24326],{"class":2607},[414,28155,2817],{"class":2698},[414,28157,28158],{"class":2705}," urlParams.",[414,28160,28161],{"class":2597},"get",[414,28163,2968],{"class":2705},[414,28165,28166],{"class":2601},"'id'",[414,28168,3156],{"class":2705},[414,28170,28171],{"class":2593,"line":2625},[414,28172,2740],{"emptyLinePlaceholder":2459},[414,28174,28175,28177],{"class":2593,"line":2677},[414,28176,24386],{"class":2698},[414,28178,28179],{"class":2705}," (connectionId) {\n",[414,28181,28182,28185,28187,28189,28192],{"class":2593,"line":2751},[414,28183,28184],{"class":2705},"    console.",[414,28186,4064],{"class":2597},[414,28188,2968],{"class":2705},[414,28190,28191],{"class":2601},"'New connection created:'",[414,28193,28194],{"class":2705},", connectionId);\n",[414,28196,28197],{"class":2593,"line":2760},[414,28198,28199],{"class":3527},"\u002F\u002F Store this connection ID securely - you'll need it for API calls\n",[414,28201,28202,28205,28208,28210,28213],{"class":2593,"line":2768},[414,28203,28204],{"class":2705},"    localStorage.",[414,28206,28207],{"class":2597},"setItem",[414,28209,2968],{"class":2705},[414,28211,28212],{"class":2601},"'unifiedConnectionId'",[414,28214,28194],{"class":2705},[414,28216,28217],{"class":2593,"line":2776},[414,28218,4032],{"class":2705},[414,28220,28221],{"class":2593,"line":2784},[414,28222,3035],{"class":2705},[414,28224,28225],{"class":2593,"line":2792},[414,28226,2740],{"emptyLinePlaceholder":2459},[414,28228,28229,28232,28235,28237,28240],{"class":2593,"line":2804},[414,28230,28231],{"class":2705},"window.",[414,28233,28234],{"class":2597},"addEventListener",[414,28236,2968],{"class":2705},[414,28238,28239],{"class":2601},"'load'",[414,28241,28242],{"class":2705},", handleAuthCallback);\n",[22,28244,28245],{},"For this guide, you can be your own test user:",[2510,28247,28248,28251,28254,28257],{},[2357,28249,28250],{},"Click on the Notion integration in the Authorization component",[2357,28252,28253],{},"Grant access to your Notion workspace",[2357,28255,28256],{},"Repeat for Discord",[2357,28258,28259],{},"Save both connection IDs - you'll need them for the next steps",[22,28261,28262,28263,97],{},"Note: In production, you should associate these connection IDs with your user's account in your database. For more information, see our guide on ",[41,28264,28267],{"href":28265,"rel":28266},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_associate_a_connection_id_with_your_end_user",[45],"How to associate connection IDs with your users",[55,28269,28271],{"id":28270},"pull-content-from-your-knowledge-base","Pull content from your knowledge base",[22,28273,28274],{},"Now that you've got a connection ID, we can start making calls to the Unified API!",[22,28276,28277],{},"First, let's write some functions to recursively fetch all content from your KMS:",[2584,28279,28281],{"className":16485,"code":28280,"language":16487,"meta":2433,"style":2433},"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:\u002F\u002Fapi.unified.to\u002Fkms\u002F${connectionId}\u002Fspace?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:\u002F\u002Fapi.unified.to\u002Fkms\u002F${connectionId}\u002Fpage?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\u002F\u002F Usage\nconst content = await fetchContent(CONNECTION_ID, API_KEY);\n",[36,28282,28283,28311,28328,28339,28343,28359,28376,28390,28394,28398,28405,28409,28413,28439,28455,28467,28471,28476,28489,28494,28498,28502,28506,28517,28543,28547,28551,28562,28566,28570,28605,28619,28634,28638,28642,28654,28658,28662,28666,28670,28680,28703,28707,28711,28721,28725,28729,28734],{"__ignoreMap":2433},[414,28284,28285,28287,28289,28292,28294,28296,28298,28300,28302,28305,28307,28309],{"class":2593,"line":2594},[414,28286,3928],{"class":2698},[414,28288,2962],{"class":2698},[414,28290,28291],{"class":2597}," fetchContent",[414,28293,2968],{"class":2705},[414,28295,2972],{"class":2971},[414,28297,2646],{"class":2698},[414,28299,2977],{"class":2607},[414,28301,319],{"class":2705},[414,28303,28304],{"class":2971},"apiKey",[414,28306,2646],{"class":2698},[414,28308,2977],{"class":2607},[414,28310,3826],{"class":2705},[414,28312,28313,28315,28318,28320,28322,28325],{"class":2593,"line":2434},[414,28314,3071],{"class":2698},[414,28316,28317],{"class":2607}," spaces",[414,28319,2817],{"class":2698},[414,28321,3002],{"class":2698},[414,28323,28324],{"class":2597}," fetchAllSpaces",[414,28326,28327],{"class":2705},"(connectionId, apiKey);\n",[414,28329,28330,28332,28335,28337],{"class":2593,"line":2613},[414,28331,3071],{"class":2698},[414,28333,28334],{"class":2607}," allContent",[414,28336,2817],{"class":2698},[414,28338,24927],{"class":2705},[414,28340,28341],{"class":2593,"line":2625},[414,28342,2740],{"emptyLinePlaceholder":2459},[414,28344,28345,28347,28349,28351,28354,28356],{"class":2593,"line":2677},[414,28346,3967],{"class":2698},[414,28348,3970],{"class":2705},[414,28350,2745],{"class":2698},[414,28352,28353],{"class":2607}," space",[414,28355,3978],{"class":2698},[414,28357,28358],{"class":2705}," spaces) {\n",[414,28360,28361,28363,28366,28368,28370,28373],{"class":2593,"line":2751},[414,28362,3986],{"class":2698},[414,28364,28365],{"class":2607}," pages",[414,28367,2817],{"class":2698},[414,28369,3002],{"class":2698},[414,28371,28372],{"class":2597}," fetchPagesInSpace",[414,28374,28375],{"class":2705},"(connectionId, apiKey, space.id);\n",[414,28377,28378,28381,28383,28385,28387],{"class":2593,"line":2760},[414,28379,28380],{"class":2705},"    allContent.",[414,28382,25040],{"class":2597},[414,28384,2968],{"class":2705},[414,28386,25045],{"class":2698},[414,28388,28389],{"class":2705},"pages);\n",[414,28391,28392],{"class":2593,"line":2768},[414,28393,4032],{"class":2705},[414,28395,28396],{"class":2593,"line":2776},[414,28397,2740],{"emptyLinePlaceholder":2459},[414,28399,28400,28402],{"class":2593,"line":2784},[414,28401,2999],{"class":2698},[414,28403,28404],{"class":2705}," allContent;\n",[414,28406,28407],{"class":2593,"line":2792},[414,28408,3035],{"class":2705},[414,28410,28411],{"class":2593,"line":2804},[414,28412,2740],{"emptyLinePlaceholder":2459},[414,28414,28415,28417,28419,28421,28423,28425,28427,28429,28431,28433,28435,28437],{"class":2593,"line":2809},[414,28416,3928],{"class":2698},[414,28418,2962],{"class":2698},[414,28420,28324],{"class":2597},[414,28422,2968],{"class":2705},[414,28424,2972],{"class":2971},[414,28426,2646],{"class":2698},[414,28428,2977],{"class":2607},[414,28430,319],{"class":2705},[414,28432,28304],{"class":2971},[414,28434,2646],{"class":2698},[414,28436,2977],{"class":2607},[414,28438,3826],{"class":2705},[414,28440,28441,28443,28446,28448,28450,28453],{"class":2593,"line":2829},[414,28442,3071],{"class":2698},[414,28444,28445],{"class":2607}," response",[414,28447,2817],{"class":2698},[414,28449,3002],{"class":2698},[414,28451,28452],{"class":2597}," fetch",[414,28454,18230],{"class":2705},[414,28456,28457,28460,28462,28465],{"class":2593,"line":2843},[414,28458,28459],{"class":2601},"    `https:\u002F\u002Fapi.unified.to\u002Fkms\u002F${",[414,28461,2972],{"class":2705},[414,28463,28464],{"class":2601},"}\u002Fspace?limit=100`",[414,28466,2757],{"class":2705},[414,28468,28469],{"class":2593,"line":2849},[414,28470,15559],{"class":2705},[414,28472,28473],{"class":2593,"line":2854},[414,28474,28475],{"class":2705},"      headers: {\n",[414,28477,28478,28481,28483,28485,28487],{"class":2593,"line":2880},[414,28479,28480],{"class":2705},"        Authorization: ",[414,28482,24527],{"class":2601},[414,28484,28304],{"class":2705},[414,28486,3308],{"class":2601},[414,28488,2757],{"class":2705},[414,28490,28491],{"class":2593,"line":3253},[414,28492,28493],{"class":2705},"      }\n",[414,28495,28496],{"class":2593,"line":3261},[414,28497,10535],{"class":2705},[414,28499,28500],{"class":2593,"line":3279},[414,28501,16572],{"class":2705},[414,28503,28504],{"class":2593,"line":3313},[414,28505,2740],{"emptyLinePlaceholder":2459},[414,28507,28508,28510,28512,28514],{"class":2593,"line":3326},[414,28509,24386],{"class":2698},[414,28511,3970],{"class":2705},[414,28513,2837],{"class":2698},[414,28515,28516],{"class":2705},"response.ok) {\n",[414,28518,28519,28522,28524,28526,28528,28531,28534,28536,28539,28541],{"class":2593,"line":3339},[414,28520,28521],{"class":2698},"    throw",[414,28523,2820],{"class":2698},[414,28525,25895],{"class":2597},[414,28527,2968],{"class":2705},[414,28529,28530],{"class":2601},"`Failed to fetch spaces: ${",[414,28532,28533],{"class":2705},"response",[414,28535,97],{"class":2601},[414,28537,28538],{"class":2705},"statusText",[414,28540,3308],{"class":2601},[414,28542,3156],{"class":2705},[414,28544,28545],{"class":2593,"line":3359},[414,28546,4032],{"class":2705},[414,28548,28549],{"class":2593,"line":6453},[414,28550,2740],{"emptyLinePlaceholder":2459},[414,28552,28553,28555,28558,28560],{"class":2593,"line":6459},[414,28554,2999],{"class":2698},[414,28556,28557],{"class":2705}," response.",[414,28559,7325],{"class":2597},[414,28561,4088],{"class":2705},[414,28563,28564],{"class":2593,"line":6465},[414,28565,3035],{"class":2705},[414,28567,28568],{"class":2593,"line":6471},[414,28569,2740],{"emptyLinePlaceholder":2459},[414,28571,28572,28574,28576,28578,28580,28582,28584,28586,28588,28590,28592,28594,28596,28599,28601,28603],{"class":2593,"line":6477},[414,28573,3928],{"class":2698},[414,28575,2962],{"class":2698},[414,28577,28372],{"class":2597},[414,28579,2968],{"class":2705},[414,28581,2972],{"class":2971},[414,28583,2646],{"class":2698},[414,28585,2977],{"class":2607},[414,28587,319],{"class":2705},[414,28589,28304],{"class":2971},[414,28591,2646],{"class":2698},[414,28593,2977],{"class":2607},[414,28595,319],{"class":2705},[414,28597,28598],{"class":2971},"spaceId",[414,28600,2646],{"class":2698},[414,28602,2977],{"class":2607},[414,28604,3826],{"class":2705},[414,28606,28607,28609,28611,28613,28615,28617],{"class":2593,"line":6483},[414,28608,3071],{"class":2698},[414,28610,28445],{"class":2607},[414,28612,2817],{"class":2698},[414,28614,3002],{"class":2698},[414,28616,28452],{"class":2597},[414,28618,18230],{"class":2705},[414,28620,28621,28623,28625,28628,28630,28632],{"class":2593,"line":6489},[414,28622,28459],{"class":2601},[414,28624,2972],{"class":2705},[414,28626,28627],{"class":2601},"}\u002Fpage?limit=100&space_id=${",[414,28629,28598],{"class":2705},[414,28631,3308],{"class":2601},[414,28633,2757],{"class":2705},[414,28635,28636],{"class":2593,"line":6495},[414,28637,15559],{"class":2705},[414,28639,28640],{"class":2593,"line":6501},[414,28641,28475],{"class":2705},[414,28643,28644,28646,28648,28650,28652],{"class":2593,"line":6507},[414,28645,28480],{"class":2705},[414,28647,24527],{"class":2601},[414,28649,28304],{"class":2705},[414,28651,3308],{"class":2601},[414,28653,2757],{"class":2705},[414,28655,28656],{"class":2593,"line":6513},[414,28657,28493],{"class":2705},[414,28659,28660],{"class":2593,"line":6519},[414,28661,10535],{"class":2705},[414,28663,28664],{"class":2593,"line":6525},[414,28665,16572],{"class":2705},[414,28667,28668],{"class":2593,"line":6531},[414,28669,2740],{"emptyLinePlaceholder":2459},[414,28671,28672,28674,28676,28678],{"class":2593,"line":6537},[414,28673,24386],{"class":2698},[414,28675,3970],{"class":2705},[414,28677,2837],{"class":2698},[414,28679,28516],{"class":2705},[414,28681,28682,28684,28686,28688,28690,28693,28695,28697,28699,28701],{"class":2593,"line":6543},[414,28683,28521],{"class":2698},[414,28685,2820],{"class":2698},[414,28687,25895],{"class":2597},[414,28689,2968],{"class":2705},[414,28691,28692],{"class":2601},"`Failed to fetch pages: ${",[414,28694,28533],{"class":2705},[414,28696,97],{"class":2601},[414,28698,28538],{"class":2705},[414,28700,3308],{"class":2601},[414,28702,3156],{"class":2705},[414,28704,28705],{"class":2593,"line":6549},[414,28706,4032],{"class":2705},[414,28708,28709],{"class":2593,"line":6555},[414,28710,2740],{"emptyLinePlaceholder":2459},[414,28712,28713,28715,28717,28719],{"class":2593,"line":6561},[414,28714,2999],{"class":2698},[414,28716,28557],{"class":2705},[414,28718,7325],{"class":2597},[414,28720,4088],{"class":2705},[414,28722,28723],{"class":2593,"line":6567},[414,28724,3035],{"class":2705},[414,28726,28727],{"class":2593,"line":6573},[414,28728,2740],{"emptyLinePlaceholder":2459},[414,28730,28731],{"class":2593,"line":6579},[414,28732,28733],{"class":3527},"\u002F\u002F Usage\n",[414,28735,28736,28738,28741,28743,28745,28747,28749,28752,28754,28757],{"class":2593,"line":6585},[414,28737,2745],{"class":2698},[414,28739,28740],{"class":2607}," content",[414,28742,2817],{"class":2698},[414,28744,3002],{"class":2698},[414,28746,28291],{"class":2597},[414,28748,2968],{"class":2705},[414,28750,28751],{"class":2607},"CONNECTION_ID",[414,28753,319],{"class":2705},[414,28755,28756],{"class":2607},"API_KEY",[414,28758,3156],{"class":2705},[22,28760,28761,7340,28764],{},[31,28762,28763],{},"API reference",[41,28765,23719],{"href":28766,"rel":28767},"https:\u002F\u002Fdocs.unified.to\u002Fkms\u002Foverview",[45],[22,28769,28770,28771,28774,28775,97],{},"Call ",[36,28772,28773],{},"fetchContent"," in your app to see the results. You should see a collection of ",[41,28776,28778],{"href":23740,"rel":28777},[45],"Pages",[55,28780,28782],{"id":28781},"process-the-content-with-langbase-memory-agents","Process the content with Langbase Memory Agents",[22,28784,28785,28786,28790],{},"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 ",[41,28787,28789],{"href":4271,"rel":28788},[45],"Memory Agents"," to handle all the heavy lifting - from text processing to embedding generation and storage.",[22,28792,28793],{},"First, let's install the Langbase SDK:",[2584,28795,28797],{"className":17934,"code":28796,"language":17936,"meta":2433,"style":2433},"npm install langbase\n",[36,28798,28799],{"__ignoreMap":2433},[414,28800,28801,28803,28805],{"class":2593,"line":2594},[414,28802,2616],{"class":2597},[414,28804,2630],{"class":2601},[414,28806,28807],{"class":2601}," langbase\n",[22,28809,28810],{},"Now we can create memory to store our knowledge base:",[2584,28812,28814],{"className":2689,"code":28813,"language":2691,"meta":2433,"style":2433},"import { Langbase } from 'langbase';\n\nconst langbase = new Langbase({\n  apiKey: process.env.LANGBASE_API_KEY!,\n});\n\nasync function createKnowledgeBase() {\n\u002F\u002F 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'\u002F\u002F Using OpenAI's latest model\n  });\n\n  return memory;\n}\n",[36,28815,28816,28830,28834,28849,28861,28865,28869,28880,28885,28904,28914,28924,28935,28939,28943,28950],{"__ignoreMap":2433},[414,28817,28818,28820,28823,28825,28828],{"class":2593,"line":2594},[414,28819,2699],{"class":2698},[414,28821,28822],{"class":2705}," { Langbase } ",[414,28824,2716],{"class":2698},[414,28826,28827],{"class":2601}," 'langbase'",[414,28829,2706],{"class":2705},[414,28831,28832],{"class":2593,"line":2434},[414,28833,2740],{"emptyLinePlaceholder":2459},[414,28835,28836,28838,28841,28843,28845,28847],{"class":2593,"line":2613},[414,28837,2745],{"class":2698},[414,28839,28840],{"class":2607}," langbase",[414,28842,2817],{"class":2698},[414,28844,2820],{"class":2698},[414,28846,4356],{"class":2597},[414,28848,2826],{"class":2705},[414,28850,28851,28854,28857,28859],{"class":2593,"line":2625},[414,28852,28853],{"class":2705},"  apiKey: process.env.",[414,28855,28856],{"class":2607},"LANGBASE_API_KEY",[414,28858,2837],{"class":2698},[414,28860,2757],{"class":2705},[414,28862,28863],{"class":2593,"line":2677},[414,28864,2846],{"class":2705},[414,28866,28867],{"class":2593,"line":2751},[414,28868,2740],{"emptyLinePlaceholder":2459},[414,28870,28871,28873,28875,28878],{"class":2593,"line":2760},[414,28872,3928],{"class":2698},[414,28874,2962],{"class":2698},[414,28876,28877],{"class":2597}," createKnowledgeBase",[414,28879,3936],{"class":2705},[414,28881,28882],{"class":2593,"line":2768},[414,28883,28884],{"class":3527},"\u002F\u002F Create a new memory\n",[414,28886,28887,28889,28892,28894,28896,28899,28902],{"class":2593,"line":2776},[414,28888,3071],{"class":2698},[414,28890,28891],{"class":2607}," memory",[414,28893,2817],{"class":2698},[414,28895,3002],{"class":2698},[414,28897,28898],{"class":2705}," langbase.memory.",[414,28900,28901],{"class":2597},"create",[414,28903,2826],{"class":2705},[414,28905,28906,28909,28912],{"class":2593,"line":2784},[414,28907,28908],{"class":2705},"    name: ",[414,28910,28911],{"class":2601},"'support-bot-knowledge'",[414,28913,2757],{"class":2705},[414,28915,28916,28919,28922],{"class":2593,"line":2792},[414,28917,28918],{"class":2705},"    description: ",[414,28920,28921],{"class":2601},"'Knowledge base for our support bot'",[414,28923,2757],{"class":2705},[414,28925,28926,28929,28932],{"class":2593,"line":2804},[414,28927,28928],{"class":2705},"    embedding_model: ",[414,28930,28931],{"class":2601},"'openai:text-embedding-3-large'",[414,28933,28934],{"class":3527},"\u002F\u002F Using OpenAI's latest model\n",[414,28936,28937],{"class":2593,"line":2809},[414,28938,3030],{"class":2705},[414,28940,28941],{"class":2593,"line":2829},[414,28942,2740],{"emptyLinePlaceholder":2459},[414,28944,28945,28947],{"class":2593,"line":2843},[414,28946,2999],{"class":2698},[414,28948,28949],{"class":2705}," memory;\n",[414,28951,28952],{"class":2593,"line":2849},[414,28953,3035],{"class":2705},[22,28955,28956,34,28959],{},[31,28957,28958],{},"API reference:",[41,28960,28963],{"href":28961,"rel":28962},"https:\u002F\u002Flangbase.com\u002Fdocs\u002Fsdk\u002Fmemory\u002Fcreate",[45],"Create memory",[22,28965,28966],{},"Now let's process our Unified.to content and upload it to Langbase:",[2584,28968,28970],{"className":2689,"code":28969,"language":2691,"meta":2433,"style":2433},"async function uploadContentToMemory(pages, memoryName: string) {\n  for (const page of pages) {\n    \u002F\u002F Download the page content from Unified.to's download_url\n    const content = await fetch(page.download_url).then(res => res.text());\n    \n    \u002F\u002F Create a buffer from the content\n    const documentBuffer = Buffer.from(content);\n    \n    \u002F\u002F Upload to Langbase with metadata\n    await langbase.memory.documents.upload({\n      memoryName,\n      documentName: page.title,\n      document: documentBuffer,\n      contentType: 'text\u002Fmarkdown', \u002F\u002F 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",[36,28971,28972,28997,29012,29017,29049,29054,29059,29075,29079,29084,29096,29101,29106,29111,29124,29129,29139,29144,29149,29154,29158,29162,29166],{"__ignoreMap":2433},[414,28973,28974,28976,28978,28981,28983,28986,28988,28991,28993,28995],{"class":2593,"line":2594},[414,28975,3928],{"class":2698},[414,28977,2962],{"class":2698},[414,28979,28980],{"class":2597}," uploadContentToMemory",[414,28982,2968],{"class":2705},[414,28984,28985],{"class":2971},"pages",[414,28987,319],{"class":2705},[414,28989,28990],{"class":2971},"memoryName",[414,28992,2646],{"class":2698},[414,28994,2977],{"class":2607},[414,28996,3826],{"class":2705},[414,28998,28999,29001,29003,29005,29007,29009],{"class":2593,"line":2434},[414,29000,3967],{"class":2698},[414,29002,3970],{"class":2705},[414,29004,2745],{"class":2698},[414,29006,16437],{"class":2607},[414,29008,3978],{"class":2698},[414,29010,29011],{"class":2705}," pages) {\n",[414,29013,29014],{"class":2593,"line":2613},[414,29015,29016],{"class":3527},"    \u002F\u002F Download the page content from Unified.to's download_url\n",[414,29018,29019,29021,29023,29025,29027,29029,29032,29035,29037,29039,29042,29045,29047],{"class":2593,"line":2625},[414,29020,3986],{"class":2698},[414,29022,28740],{"class":2607},[414,29024,2817],{"class":2698},[414,29026,3002],{"class":2698},[414,29028,28452],{"class":2597},[414,29030,29031],{"class":2705},"(page.download_url).",[414,29033,29034],{"class":2597},"then",[414,29036,2968],{"class":2705},[414,29038,24312],{"class":2971},[414,29040,29041],{"class":2698}," =>",[414,29043,29044],{"class":2705}," res.",[414,29046,2652],{"class":2597},[414,29048,24372],{"class":2705},[414,29050,29051],{"class":2593,"line":2677},[414,29052,29053],{"class":2705},"    \n",[414,29055,29056],{"class":2593,"line":2751},[414,29057,29058],{"class":3527},"    \u002F\u002F Create a buffer from the content\n",[414,29060,29061,29063,29066,29068,29070,29072],{"class":2593,"line":2760},[414,29062,3986],{"class":2698},[414,29064,29065],{"class":2607}," documentBuffer",[414,29067,2817],{"class":2698},[414,29069,24215],{"class":2705},[414,29071,2716],{"class":2597},[414,29073,29074],{"class":2705},"(content);\n",[414,29076,29077],{"class":2593,"line":2768},[414,29078,29053],{"class":2705},[414,29080,29081],{"class":2593,"line":2776},[414,29082,29083],{"class":3527},"    \u002F\u002F Upload to Langbase with metadata\n",[414,29085,29086,29088,29091,29094],{"class":2593,"line":2784},[414,29087,4022],{"class":2698},[414,29089,29090],{"class":2705}," langbase.memory.documents.",[414,29092,29093],{"class":2597},"upload",[414,29095,2826],{"class":2705},[414,29097,29098],{"class":2593,"line":2792},[414,29099,29100],{"class":2705},"      memoryName,\n",[414,29102,29103],{"class":2593,"line":2804},[414,29104,29105],{"class":2705},"      documentName: page.title,\n",[414,29107,29108],{"class":2593,"line":2809},[414,29109,29110],{"class":2705},"      document: documentBuffer,\n",[414,29112,29113,29116,29119,29121],{"class":2593,"line":2829},[414,29114,29115],{"class":2705},"      contentType: ",[414,29117,29118],{"class":2601},"'text\u002Fmarkdown'",[414,29120,319],{"class":2705},[414,29122,29123],{"class":3527},"\u002F\u002F Adjust based on your content type\n",[414,29125,29126],{"class":2593,"line":2843},[414,29127,29128],{"class":2705},"      meta: {\n",[414,29130,29131,29134,29137],{"class":2593,"line":2849},[414,29132,29133],{"class":2705},"        source: ",[414,29135,29136],{"class":2601},"'unified_kms'",[414,29138,2757],{"class":2705},[414,29140,29141],{"class":2593,"line":2854},[414,29142,29143],{"class":2705},"        created_at: page.created_at,\n",[414,29145,29146],{"class":2593,"line":2880},[414,29147,29148],{"class":2705},"        updated_at: page.updated_at,\n",[414,29150,29151],{"class":2593,"line":3253},[414,29152,29153],{"class":2705},"        space_id: page.space_id\n",[414,29155,29156],{"class":2593,"line":3261},[414,29157,28493],{"class":2705},[414,29159,29160],{"class":2593,"line":3279},[414,29161,25779],{"class":2705},[414,29163,29164],{"class":2593,"line":3313},[414,29165,4032],{"class":2705},[414,29167,29168],{"class":2593,"line":3326},[414,29169,3035],{"class":2705},[22,29171,29172,34,29174],{},[31,29173,28958],{},[41,29175,29178],{"href":29176,"rel":29177},"https:\u002F\u002Flangbase.com\u002Fdocs\u002Fsdk\u002Fmemory\u002Fdocument-upload",[45],"Upload document",[22,29180,29181],{},"Langbase's Memory Agents will automatically:",[2510,29183,29184,29187,29190,29193],{},[2357,29185,29186],{},"Process the text (Unified.to's data models have already cleaned the data for you!)",[2357,29188,29189],{},"Split content into optimal chunks",[2357,29191,29192],{},"Generate embeddings using state-of-the-art models",[2357,29194,29195],{},"Store and index everything for fast retrieval",[22,29197,29198],{},"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:",[2584,29200,29202],{"className":2689,"code":29201,"language":2691,"meta":2433,"style":2433},"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",[36,29203,29204,29223,29241,29250,29260,29265,29272,29276,29280,29287],{"__ignoreMap":2433},[414,29205,29206,29208,29210,29213,29215,29217,29219,29221],{"class":2593,"line":2594},[414,29207,3928],{"class":2698},[414,29209,2962],{"class":2698},[414,29211,29212],{"class":2597}," createSupportBotPipe",[414,29214,2968],{"class":2705},[414,29216,28990],{"class":2971},[414,29218,2646],{"class":2698},[414,29220,2977],{"class":2607},[414,29222,3826],{"class":2705},[414,29224,29225,29227,29230,29232,29234,29237,29239],{"class":2593,"line":2434},[414,29226,3071],{"class":2698},[414,29228,29229],{"class":2607}," pipe",[414,29231,2817],{"class":2698},[414,29233,3002],{"class":2698},[414,29235,29236],{"class":2705}," langbase.pipe.",[414,29238,28901],{"class":2597},[414,29240,2826],{"class":2705},[414,29242,29243,29245,29248],{"class":2593,"line":2613},[414,29244,28908],{"class":2705},[414,29246,29247],{"class":2601},"'Support Bot'",[414,29249,2757],{"class":2705},[414,29251,29252,29255,29258],{"class":2593,"line":2625},[414,29253,29254],{"class":2705},"    type: ",[414,29256,29257],{"class":2601},"'chat'",[414,29259,2757],{"class":2705},[414,29261,29262],{"class":2593,"line":2677},[414,29263,29264],{"class":2705},"    memory: memoryName,\n",[414,29266,29267,29269],{"class":2593,"line":2751},[414,29268,28918],{"class":2705},[414,29270,29271],{"class":2601},"'Support bot powered by our knowledge base'\n",[414,29273,29274],{"class":2593,"line":2760},[414,29275,3030],{"class":2705},[414,29277,29278],{"class":2593,"line":2768},[414,29279,2740],{"emptyLinePlaceholder":2459},[414,29281,29282,29284],{"class":2593,"line":2776},[414,29283,2999],{"class":2698},[414,29285,29286],{"class":2705}," pipe;\n",[414,29288,29289],{"class":2593,"line":2784},[414,29290,3035],{"class":2705},[22,29292,29293,7340,29295],{},[31,29294,28763],{},[41,29296,29299],{"href":29297,"rel":29298},"https:\u002F\u002Flangbase.com\u002Fdocs\u002Fsdk\u002Fpipe\u002Fcreate",[45],"Create pipe",[22,29301,29302],{},"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.",[55,29304,29306],{"id":29305},"set-up-real-time-message-monitoring","Set up real-time message monitoring",[22,29308,29309],{},"To make your support bot responsive, you'll need to set up webhooks to receive notifications when users send messages in Discord channels.",[2510,29311,29312],{},[2357,29313,29314],{},"Create a webhook to monitor Discord messages:",[2584,29316,29318],{"className":16485,"code":29317,"language":16487,"meta":2433,"style":2433},"async function createDiscordWebhook(connectionId: string, apiKey: string, hookUrl: string) {\n  const response = await fetch(\n    'https:\u002F\u002Fapi.unified.to\u002Funified\u002Fwebhook',\n    {\n      method: 'POST',\n      headers: {\n        'Authorization': `Bearer ${apiKey}`,\n        'Content-Type': 'application\u002Fjson'\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:\u002F\u002Flocalhost:8000\u002Fwebhook')\n",[36,29319,29320,29356,29370,29377,29381,29391,29395,29410,29420,29424,29437,29442,29447,29457,29465,29470,29474,29478,29482,29492,29515,29519,29523,29533,29537,29541],{"__ignoreMap":2433},[414,29321,29322,29324,29326,29329,29331,29333,29335,29337,29339,29341,29343,29345,29347,29350,29352,29354],{"class":2593,"line":2594},[414,29323,3928],{"class":2698},[414,29325,2962],{"class":2698},[414,29327,29328],{"class":2597}," createDiscordWebhook",[414,29330,2968],{"class":2705},[414,29332,2972],{"class":2971},[414,29334,2646],{"class":2698},[414,29336,2977],{"class":2607},[414,29338,319],{"class":2705},[414,29340,28304],{"class":2971},[414,29342,2646],{"class":2698},[414,29344,2977],{"class":2607},[414,29346,319],{"class":2705},[414,29348,29349],{"class":2971},"hookUrl",[414,29351,2646],{"class":2698},[414,29353,2977],{"class":2607},[414,29355,3826],{"class":2705},[414,29357,29358,29360,29362,29364,29366,29368],{"class":2593,"line":2434},[414,29359,3071],{"class":2698},[414,29361,28445],{"class":2607},[414,29363,2817],{"class":2698},[414,29365,3002],{"class":2698},[414,29367,28452],{"class":2597},[414,29369,18230],{"class":2705},[414,29371,29372,29375],{"class":2593,"line":2613},[414,29373,29374],{"class":2601},"    'https:\u002F\u002Fapi.unified.to\u002Funified\u002Fwebhook'",[414,29376,2757],{"class":2705},[414,29378,29379],{"class":2593,"line":2625},[414,29380,15559],{"class":2705},[414,29382,29383,29386,29389],{"class":2593,"line":2677},[414,29384,29385],{"class":2705},"      method: ",[414,29387,29388],{"class":2601},"'POST'",[414,29390,2757],{"class":2705},[414,29392,29393],{"class":2593,"line":2751},[414,29394,28475],{"class":2705},[414,29396,29397,29400,29402,29404,29406,29408],{"class":2593,"line":2760},[414,29398,29399],{"class":2601},"        'Authorization'",[414,29401,7340],{"class":2705},[414,29403,24527],{"class":2601},[414,29405,28304],{"class":2705},[414,29407,3308],{"class":2601},[414,29409,2757],{"class":2705},[414,29411,29412,29415,29417],{"class":2593,"line":2768},[414,29413,29414],{"class":2601},"        'Content-Type'",[414,29416,7340],{"class":2705},[414,29418,29419],{"class":2601},"'application\u002Fjson'\n",[414,29421,29422],{"class":2593,"line":2776},[414,29423,3773],{"class":2705},[414,29425,29426,29429,29431,29433,29435],{"class":2593,"line":2784},[414,29427,29428],{"class":2705},"      body: ",[414,29430,24222],{"class":2607},[414,29432,97],{"class":2705},[414,29434,24227],{"class":2597},[414,29436,2826],{"class":2705},[414,29438,29439],{"class":2593,"line":2792},[414,29440,29441],{"class":2705},"        connection_id: connectionId,\n",[414,29443,29444],{"class":2593,"line":2804},[414,29445,29446],{"class":2705},"        hook_url: hookUrl,\n",[414,29448,29449,29452,29455],{"class":2593,"line":2809},[414,29450,29451],{"class":2705},"        object_type: ",[414,29453,29454],{"class":2601},"'messaging_message'",[414,29456,2757],{"class":2705},[414,29458,29459,29462],{"class":2593,"line":2829},[414,29460,29461],{"class":2705},"        event: ",[414,29463,29464],{"class":2601},"'created'\n",[414,29466,29467],{"class":2593,"line":2843},[414,29468,29469],{"class":2705},"      })\n",[414,29471,29472],{"class":2593,"line":2849},[414,29473,10535],{"class":2705},[414,29475,29476],{"class":2593,"line":2854},[414,29477,16572],{"class":2705},[414,29479,29480],{"class":2593,"line":2880},[414,29481,2740],{"emptyLinePlaceholder":2459},[414,29483,29484,29486,29488,29490],{"class":2593,"line":3253},[414,29485,24386],{"class":2698},[414,29487,3970],{"class":2705},[414,29489,2837],{"class":2698},[414,29491,28516],{"class":2705},[414,29493,29494,29496,29498,29500,29502,29505,29507,29509,29511,29513],{"class":2593,"line":3261},[414,29495,28521],{"class":2698},[414,29497,2820],{"class":2698},[414,29499,25895],{"class":2597},[414,29501,2968],{"class":2705},[414,29503,29504],{"class":2601},"`Failed to create webhook: ${",[414,29506,28533],{"class":2705},[414,29508,97],{"class":2601},[414,29510,28538],{"class":2705},[414,29512,3308],{"class":2601},[414,29514,3156],{"class":2705},[414,29516,29517],{"class":2593,"line":3279},[414,29518,4032],{"class":2705},[414,29520,29521],{"class":2593,"line":3313},[414,29522,2740],{"emptyLinePlaceholder":2459},[414,29524,29525,29527,29529,29531],{"class":2593,"line":3326},[414,29526,2999],{"class":2698},[414,29528,28557],{"class":2705},[414,29530,7325],{"class":2597},[414,29532,4088],{"class":2705},[414,29534,29535],{"class":2593,"line":3339},[414,29536,3035],{"class":2705},[414,29538,29539],{"class":2593,"line":3359},[414,29540,2740],{"emptyLinePlaceholder":2459},[414,29542,29543,29546,29548,29550,29552,29554,29556,29559],{"class":2593,"line":6453},[414,29544,29545],{"class":2597},"createDiscordWebhook",[414,29547,2968],{"class":2705},[414,29549,28751],{"class":2607},[414,29551,319],{"class":2705},[414,29553,28756],{"class":2607},[414,29555,319],{"class":2705},[414,29557,29558],{"class":2601},"'https:\u002F\u002Flocalhost:8000\u002Fwebhook'",[414,29560,3141],{"class":2705},[22,29562,29563,7340,29565],{},[31,29564,28763],{},[41,29566,29568],{"href":5078,"rel":29567},[45],"Create a webhook",[2510,29570,29571],{},[2357,29572,29573],{},"Set up an endpoint on your server to handle incoming webhook events. For example:",[2584,29575,29577],{"className":16485,"code":29576,"language":16487,"meta":2433,"style":2433},"app.post('\u002Fwebhook', async (req, res) => {\n    \u002F\u002F Verify webhook signature\n  const { data, webhook, nonce, sig } = req.body;\n\n    \u002F\u002F Handle new messages\n  for (const message of data) {\n        \u002F\u002F Ignore messages from the bot itself\n    if (message.author_member.id === BOT_USER_ID) continue;\n\n        \u002F\u002F Process the message and generate a response\n    const response = await generateBotResponse(message.message);\n\n        \u002F\u002F 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",[36,29578,29579,29610,29615,29644,29648,29653,29669,29674,29693,29697,29702,29718,29722,29727,29736,29743,29750,29755,29760,29764,29768,29772,29787],{"__ignoreMap":2433},[414,29580,29581,29584,29587,29589,29592,29594,29596,29598,29600,29602,29604,29606,29608],{"class":2593,"line":2594},[414,29582,29583],{"class":2705},"app.",[414,29585,29586],{"class":2597},"post",[414,29588,2968],{"class":2705},[414,29590,29591],{"class":2601},"'\u002Fwebhook'",[414,29593,319],{"class":2705},[414,29595,3928],{"class":2698},[414,29597,3970],{"class":2705},[414,29599,24307],{"class":2971},[414,29601,319],{"class":2705},[414,29603,24312],{"class":2971},[414,29605,3107],{"class":2705},[414,29607,3110],{"class":2698},[414,29609,2748],{"class":2705},[414,29611,29612],{"class":2593,"line":2434},[414,29613,29614],{"class":3527},"    \u002F\u002F Verify webhook signature\n",[414,29616,29617,29619,29621,29623,29625,29628,29630,29632,29634,29636,29639,29641],{"class":2593,"line":2613},[414,29618,3071],{"class":2698},[414,29620,26738],{"class":2705},[414,29622,5590],{"class":2607},[414,29624,319],{"class":2705},[414,29626,29627],{"class":2607},"webhook",[414,29629,319],{"class":2705},[414,29631,22213],{"class":2607},[414,29633,319],{"class":2705},[414,29635,22218],{"class":2607},[414,29637,29638],{"class":2705}," } ",[414,29640,2798],{"class":2698},[414,29642,29643],{"class":2705}," req.body;\n",[414,29645,29646],{"class":2593,"line":2625},[414,29647,2740],{"emptyLinePlaceholder":2459},[414,29649,29650],{"class":2593,"line":2677},[414,29651,29652],{"class":3527},"    \u002F\u002F Handle new messages\n",[414,29654,29655,29657,29659,29661,29664,29666],{"class":2593,"line":2751},[414,29656,3967],{"class":2698},[414,29658,3970],{"class":2705},[414,29660,2745],{"class":2698},[414,29662,29663],{"class":2607}," message",[414,29665,3978],{"class":2698},[414,29667,29668],{"class":2705}," data) {\n",[414,29670,29671],{"class":2593,"line":2760},[414,29672,29673],{"class":3527},"        \u002F\u002F Ignore messages from the bot itself\n",[414,29675,29676,29678,29681,29683,29686,29688,29691],{"class":2593,"line":2768},[414,29677,25828],{"class":2698},[414,29679,29680],{"class":2705}," (message.author_member.id ",[414,29682,25066],{"class":2698},[414,29684,29685],{"class":2607}," BOT_USER_ID",[414,29687,3107],{"class":2705},[414,29689,29690],{"class":2698},"continue",[414,29692,2706],{"class":2705},[414,29694,29695],{"class":2593,"line":2776},[414,29696,2740],{"emptyLinePlaceholder":2459},[414,29698,29699],{"class":2593,"line":2784},[414,29700,29701],{"class":3527},"        \u002F\u002F Process the message and generate a response\n",[414,29703,29704,29706,29708,29710,29712,29715],{"class":2593,"line":2792},[414,29705,3986],{"class":2698},[414,29707,28445],{"class":2607},[414,29709,2817],{"class":2698},[414,29711,3002],{"class":2698},[414,29713,29714],{"class":2597}," generateBotResponse",[414,29716,29717],{"class":2705},"(message.message);\n",[414,29719,29720],{"class":2593,"line":2804},[414,29721,2740],{"emptyLinePlaceholder":2459},[414,29723,29724],{"class":2593,"line":2809},[414,29725,29726],{"class":3527},"        \u002F\u002F Send the response back to the channel\n",[414,29728,29729,29731,29734],{"class":2593,"line":2829},[414,29730,4022],{"class":2698},[414,29732,29733],{"class":2597}," sendDiscordResponse",[414,29735,18230],{"class":2705},[414,29737,29738,29741],{"class":2593,"line":2843},[414,29739,29740],{"class":2607},"      DISCORD_CONNECTION_ID",[414,29742,2757],{"class":2705},[414,29744,29745,29748],{"class":2593,"line":2849},[414,29746,29747],{"class":2607},"      API_KEY",[414,29749,2757],{"class":2705},[414,29751,29752],{"class":2593,"line":2854},[414,29753,29754],{"class":2705},"      message.channel_id,\n",[414,29756,29757],{"class":2593,"line":2880},[414,29758,29759],{"class":2705},"      response\n",[414,29761,29762],{"class":2593,"line":3253},[414,29763,25999],{"class":2705},[414,29765,29766],{"class":2593,"line":3261},[414,29767,4032],{"class":2705},[414,29769,29770],{"class":2593,"line":3279},[414,29771,2740],{"emptyLinePlaceholder":2459},[414,29773,29774,29777,29780,29782,29785],{"class":2593,"line":3313},[414,29775,29776],{"class":2705},"  res.",[414,29778,29779],{"class":2597},"sendStatus",[414,29781,2968],{"class":2705},[414,29783,29784],{"class":2607},"200",[414,29786,3156],{"class":2705},[414,29788,29789],{"class":2593,"line":3326},[414,29790,2846],{"class":2705},[2510,29792,29793],{},[2357,29794,29795],{},"Validate incoming webhooks (recommended):",[2584,29797,29799],{"className":16485,"code":29798,"language":16487,"meta":2433,"style":2433},"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",[36,29800,29801,29819,29823,29850,29873,29885,29908,29920,29924,29936],{"__ignoreMap":2433},[414,29802,29803,29805,29808,29810,29812,29814,29817],{"class":2593,"line":2594},[414,29804,2745],{"class":2698},[414,29806,29807],{"class":2607}," crypto",[414,29809,2817],{"class":2698},[414,29811,18183],{"class":2597},[414,29813,2968],{"class":2705},[414,29815,29816],{"class":2601},"'crypto'",[414,29818,3156],{"class":2705},[414,29820,29821],{"class":2593,"line":2434},[414,29822,2740],{"emptyLinePlaceholder":2459},[414,29824,29825,29827,29830,29832,29834,29836,29838,29840,29843,29845,29848],{"class":2593,"line":2613},[414,29826,16512],{"class":2698},[414,29828,29829],{"class":2597}," verifyWebhookSignature",[414,29831,2968],{"class":2705},[414,29833,5590],{"class":2971},[414,29835,319],{"class":2705},[414,29837,22213],{"class":2971},[414,29839,319],{"class":2705},[414,29841,29842],{"class":2971},"signature",[414,29844,319],{"class":2705},[414,29846,29847],{"class":2971},"workspaceSecret",[414,29849,3826],{"class":2705},[414,29851,29852,29854,29857,29859,29862,29865,29867,29870],{"class":2593,"line":2625},[414,29853,3071],{"class":2698},[414,29855,29856],{"class":2607}," hmac",[414,29858,2817],{"class":2698},[414,29860,29861],{"class":2705}," crypto.",[414,29863,29864],{"class":2597},"createHmac",[414,29866,2968],{"class":2705},[414,29868,29869],{"class":2601},"'sha1'",[414,29871,29872],{"class":2705},", workspaceSecret);\n",[414,29874,29875,29877,29880,29882],{"class":2593,"line":2677},[414,29876,3071],{"class":2698},[414,29878,29879],{"class":2607}," calculatedSignature",[414,29881,2817],{"class":2698},[414,29883,29884],{"class":2705}," hmac\n",[414,29886,29887,29889,29891,29893,29895,29897,29899,29902,29905],{"class":2593,"line":2751},[414,29888,3090],{"class":2705},[414,29890,25946],{"class":2597},[414,29892,2968],{"class":2705},[414,29894,24222],{"class":2607},[414,29896,97],{"class":2705},[414,29898,24227],{"class":2597},[414,29900,29901],{"class":2705},"(data) ",[414,29903,29904],{"class":2698},"+",[414,29906,29907],{"class":2705}," nonce)\n",[414,29909,29910,29912,29914,29916,29918],{"class":2593,"line":2760},[414,29911,3090],{"class":2705},[414,29913,25981],{"class":2597},[414,29915,2968],{"class":2705},[414,29917,24238],{"class":2601},[414,29919,3156],{"class":2705},[414,29921,29922],{"class":2593,"line":2768},[414,29923,2740],{"emptyLinePlaceholder":2459},[414,29925,29926,29928,29931,29933],{"class":2593,"line":2776},[414,29927,2999],{"class":2698},[414,29929,29930],{"class":2705}," calculatedSignature ",[414,29932,25066],{"class":2698},[414,29934,29935],{"class":2705}," signature;\n",[414,29937,29938],{"class":2593,"line":2784},[414,29939,3035],{"class":2705},[22,29941,29942],{},"With this setup, your bot can:",[2510,29944,29945,29948,29951],{},[2357,29946,29947],{},"Receive notifications whenever a new message is sent in the monitored channels",[2357,29949,29950],{},"Process those messages through your AI pipeline",[2357,29952,29953],{},"Send responses back to the appropriate channel",[22,29955,29956,29957,97],{},"For more details on webhooks at Unified.to, see our ",[41,29958,29960],{"href":5717,"rel":29959},[45],"guide to webhooks",[55,29962,29964],{"id":29963},"send-responses-through-discord","Send responses through Discord",[22,29966,29967],{},"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:",[2584,29969,29971],{"className":16485,"code":29970,"language":16487,"meta":2433,"style":2433},"async function sendDiscordResponse(connectionId: string, apiKey: string, channelId: string, response: string) {\n  const formattedResponse = formatDiscordMessage(response);\n\n  const apiResponse = await fetch(\n    `https:\u002F\u002Fapi.unified.to\u002Fmessaging\u002F${connectionId}\u002Fmessage`,\n    {\n      method: 'POST',\n      headers: {\n        'Authorization': `Bearer ${apiKey}`,\n        'Content-Type': 'application\u002Fjson'\n      },\n      body: JSON.stringify({\n        channel_id: channelId,\n        message: formattedResponse,\n        message_html: formattedResponse, \u002F\u002F 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  \u002F\u002F Example formatting for Discord markdown\n  return `**Bot Response:**\\n${response}`;\n}\n\n\u002F\u002F Example usage with different message types\nasync function sendBotResponses(connectionId, apiKey, channelId) {\n  \u002F\u002F Simple text response\n  await sendDiscordResponse(\n    connectionId,\n    apiKey,\n    channelId,\n    'Here is the answer to your question...'\n  );\n\n  \u002F\u002F Response with code block\n  await sendDiscordResponse(\n    connectionId,\n    apiKey,\n    channelId,\n    '```javascript\\nconst example = \"code block\";\\n```'\n  );\n\n  \u002F\u002F Response with rich formatting\n  await sendDiscordResponse(\n    connectionId,\n    apiKey,\n    channelId,\n    '**Bold text** and *italic text* with a [link](https:\u002F\u002Fexample.com)'\n  );\n}\n",[36,29972,29973,30016,30031,30035,30050,30062,30066,30074,30078,30092,30100,30104,30116,30121,30126,30134,30138,30142,30146,30150,30161,30175,30191,30210,30225,30229,30253,30257,30261,30272,30276,30280,30292,30297,30315,30319,30323,30328,30351,30356,30364,30368,30373,30378,30383,30387,30391,30396,30404,30408,30412,30416,30431,30435,30439,30444,30452,30456,30460,30464,30469,30473],{"__ignoreMap":2433},[414,29974,29975,29977,29979,29981,29983,29985,29987,29989,29991,29993,29995,29997,29999,30002,30004,30006,30008,30010,30012,30014],{"class":2593,"line":2594},[414,29976,3928],{"class":2698},[414,29978,2962],{"class":2698},[414,29980,29733],{"class":2597},[414,29982,2968],{"class":2705},[414,29984,2972],{"class":2971},[414,29986,2646],{"class":2698},[414,29988,2977],{"class":2607},[414,29990,319],{"class":2705},[414,29992,28304],{"class":2971},[414,29994,2646],{"class":2698},[414,29996,2977],{"class":2607},[414,29998,319],{"class":2705},[414,30000,30001],{"class":2971},"channelId",[414,30003,2646],{"class":2698},[414,30005,2977],{"class":2607},[414,30007,319],{"class":2705},[414,30009,28533],{"class":2971},[414,30011,2646],{"class":2698},[414,30013,2977],{"class":2607},[414,30015,3826],{"class":2705},[414,30017,30018,30020,30023,30025,30028],{"class":2593,"line":2434},[414,30019,3071],{"class":2698},[414,30021,30022],{"class":2607}," formattedResponse",[414,30024,2817],{"class":2698},[414,30026,30027],{"class":2597}," formatDiscordMessage",[414,30029,30030],{"class":2705},"(response);\n",[414,30032,30033],{"class":2593,"line":2613},[414,30034,2740],{"emptyLinePlaceholder":2459},[414,30036,30037,30039,30042,30044,30046,30048],{"class":2593,"line":2625},[414,30038,3071],{"class":2698},[414,30040,30041],{"class":2607}," apiResponse",[414,30043,2817],{"class":2698},[414,30045,3002],{"class":2698},[414,30047,28452],{"class":2597},[414,30049,18230],{"class":2705},[414,30051,30052,30055,30057,30060],{"class":2593,"line":2677},[414,30053,30054],{"class":2601},"    `https:\u002F\u002Fapi.unified.to\u002Fmessaging\u002F${",[414,30056,2972],{"class":2705},[414,30058,30059],{"class":2601},"}\u002Fmessage`",[414,30061,2757],{"class":2705},[414,30063,30064],{"class":2593,"line":2751},[414,30065,15559],{"class":2705},[414,30067,30068,30070,30072],{"class":2593,"line":2760},[414,30069,29385],{"class":2705},[414,30071,29388],{"class":2601},[414,30073,2757],{"class":2705},[414,30075,30076],{"class":2593,"line":2768},[414,30077,28475],{"class":2705},[414,30079,30080,30082,30084,30086,30088,30090],{"class":2593,"line":2776},[414,30081,29399],{"class":2601},[414,30083,7340],{"class":2705},[414,30085,24527],{"class":2601},[414,30087,28304],{"class":2705},[414,30089,3308],{"class":2601},[414,30091,2757],{"class":2705},[414,30093,30094,30096,30098],{"class":2593,"line":2784},[414,30095,29414],{"class":2601},[414,30097,7340],{"class":2705},[414,30099,29419],{"class":2601},[414,30101,30102],{"class":2593,"line":2792},[414,30103,3773],{"class":2705},[414,30105,30106,30108,30110,30112,30114],{"class":2593,"line":2804},[414,30107,29428],{"class":2705},[414,30109,24222],{"class":2607},[414,30111,97],{"class":2705},[414,30113,24227],{"class":2597},[414,30115,2826],{"class":2705},[414,30117,30118],{"class":2593,"line":2809},[414,30119,30120],{"class":2705},"        channel_id: channelId,\n",[414,30122,30123],{"class":2593,"line":2829},[414,30124,30125],{"class":2705},"        message: formattedResponse,\n",[414,30127,30128,30131],{"class":2593,"line":2843},[414,30129,30130],{"class":2705},"        message_html: formattedResponse, ",[414,30132,30133],{"class":3527},"\u002F\u002F Optional: Use for formatted text\n",[414,30135,30136],{"class":2593,"line":2849},[414,30137,29469],{"class":2705},[414,30139,30140],{"class":2593,"line":2854},[414,30141,10535],{"class":2705},[414,30143,30144],{"class":2593,"line":2880},[414,30145,16572],{"class":2705},[414,30147,30148],{"class":2593,"line":3253},[414,30149,2740],{"emptyLinePlaceholder":2459},[414,30151,30152,30154,30156,30158],{"class":2593,"line":3261},[414,30153,24386],{"class":2698},[414,30155,3970],{"class":2705},[414,30157,2837],{"class":2698},[414,30159,30160],{"class":2705},"apiResponse.ok) {\n",[414,30162,30163,30165,30168,30170,30173],{"class":2593,"line":3279},[414,30164,25828],{"class":2698},[414,30166,30167],{"class":2705}," (apiResponse.status ",[414,30169,25066],{"class":2698},[414,30171,30172],{"class":2607}," 401",[414,30174,3826],{"class":2705},[414,30176,30177,30180,30182,30184,30186,30189],{"class":2593,"line":3313},[414,30178,30179],{"class":2698},"      throw",[414,30181,2820],{"class":2698},[414,30183,25895],{"class":2597},[414,30185,2968],{"class":2705},[414,30187,30188],{"class":2601},"'Authentication failed - check your API key'",[414,30190,3156],{"class":2705},[414,30192,30193,30196,30198,30201,30203,30205,30208],{"class":2593,"line":3326},[414,30194,30195],{"class":2705},"    } ",[414,30197,25123],{"class":2698},[414,30199,30200],{"class":2698}," if",[414,30202,30167],{"class":2705},[414,30204,25066],{"class":2698},[414,30206,30207],{"class":2607}," 404",[414,30209,3826],{"class":2705},[414,30211,30212,30214,30216,30218,30220,30223],{"class":2593,"line":3339},[414,30213,30179],{"class":2698},[414,30215,2820],{"class":2698},[414,30217,25895],{"class":2597},[414,30219,2968],{"class":2705},[414,30221,30222],{"class":2601},"'Channel not found - verify channel ID'",[414,30224,3156],{"class":2705},[414,30226,30227],{"class":2593,"line":3359},[414,30228,10535],{"class":2705},[414,30230,30231,30233,30235,30237,30239,30242,30245,30247,30249,30251],{"class":2593,"line":6453},[414,30232,28521],{"class":2698},[414,30234,2820],{"class":2698},[414,30236,25895],{"class":2597},[414,30238,2968],{"class":2705},[414,30240,30241],{"class":2601},"`Failed to send message: ${",[414,30243,30244],{"class":2705},"apiResponse",[414,30246,97],{"class":2601},[414,30248,28538],{"class":2705},[414,30250,3308],{"class":2601},[414,30252,3156],{"class":2705},[414,30254,30255],{"class":2593,"line":6459},[414,30256,4032],{"class":2705},[414,30258,30259],{"class":2593,"line":6465},[414,30260,2740],{"emptyLinePlaceholder":2459},[414,30262,30263,30265,30268,30270],{"class":2593,"line":6471},[414,30264,2999],{"class":2698},[414,30266,30267],{"class":2705}," apiResponse.",[414,30269,7325],{"class":2597},[414,30271,4088],{"class":2705},[414,30273,30274],{"class":2593,"line":6477},[414,30275,3035],{"class":2705},[414,30277,30278],{"class":2593,"line":6483},[414,30279,2740],{"emptyLinePlaceholder":2459},[414,30281,30282,30284,30286,30288,30290],{"class":2593,"line":6489},[414,30283,16512],{"class":2698},[414,30285,30027],{"class":2597},[414,30287,2968],{"class":2705},[414,30289,28533],{"class":2971},[414,30291,3826],{"class":2705},[414,30293,30294],{"class":2593,"line":6495},[414,30295,30296],{"class":3527},"  \u002F\u002F Example formatting for Discord markdown\n",[414,30298,30299,30301,30304,30306,30309,30311,30313],{"class":2593,"line":6501},[414,30300,2999],{"class":2698},[414,30302,30303],{"class":2601}," `**Bot Response:**",[414,30305,3352],{"class":2607},[414,30307,30308],{"class":2601},"${",[414,30310,28533],{"class":2705},[414,30312,3308],{"class":2601},[414,30314,2706],{"class":2705},[414,30316,30317],{"class":2593,"line":6507},[414,30318,3035],{"class":2705},[414,30320,30321],{"class":2593,"line":6513},[414,30322,2740],{"emptyLinePlaceholder":2459},[414,30324,30325],{"class":2593,"line":6519},[414,30326,30327],{"class":3527},"\u002F\u002F Example usage with different message types\n",[414,30329,30330,30332,30334,30337,30339,30341,30343,30345,30347,30349],{"class":2593,"line":6525},[414,30331,3928],{"class":2698},[414,30333,2962],{"class":2698},[414,30335,30336],{"class":2597}," sendBotResponses",[414,30338,2968],{"class":2705},[414,30340,2972],{"class":2971},[414,30342,319],{"class":2705},[414,30344,28304],{"class":2971},[414,30346,319],{"class":2705},[414,30348,30001],{"class":2971},[414,30350,3826],{"class":2705},[414,30352,30353],{"class":2593,"line":6531},[414,30354,30355],{"class":3527},"  \u002F\u002F Simple text response\n",[414,30357,30358,30360,30362],{"class":2593,"line":6537},[414,30359,3687],{"class":2698},[414,30361,29733],{"class":2597},[414,30363,18230],{"class":2705},[414,30365,30366],{"class":2593,"line":6543},[414,30367,3015],{"class":2705},[414,30369,30370],{"class":2593,"line":6549},[414,30371,30372],{"class":2705},"    apiKey,\n",[414,30374,30375],{"class":2593,"line":6555},[414,30376,30377],{"class":2705},"    channelId,\n",[414,30379,30380],{"class":2593,"line":6561},[414,30381,30382],{"class":2601},"    'Here is the answer to your question...'\n",[414,30384,30385],{"class":2593,"line":6567},[414,30386,16572],{"class":2705},[414,30388,30389],{"class":2593,"line":6573},[414,30390,2740],{"emptyLinePlaceholder":2459},[414,30392,30393],{"class":2593,"line":6579},[414,30394,30395],{"class":3527},"  \u002F\u002F Response with code block\n",[414,30397,30398,30400,30402],{"class":2593,"line":6585},[414,30399,3687],{"class":2698},[414,30401,29733],{"class":2597},[414,30403,18230],{"class":2705},[414,30405,30406],{"class":2593,"line":6591},[414,30407,3015],{"class":2705},[414,30409,30410],{"class":2593,"line":6597},[414,30411,30372],{"class":2705},[414,30413,30414],{"class":2593,"line":6603},[414,30415,30377],{"class":2705},[414,30417,30418,30421,30423,30426,30428],{"class":2593,"line":6609},[414,30419,30420],{"class":2601},"    '```javascript",[414,30422,3352],{"class":2607},[414,30424,30425],{"class":2601},"const example = \"code block\";",[414,30427,3352],{"class":2607},[414,30429,30430],{"class":2601},"```'\n",[414,30432,30433],{"class":2593,"line":6615},[414,30434,16572],{"class":2705},[414,30436,30437],{"class":2593,"line":6621},[414,30438,2740],{"emptyLinePlaceholder":2459},[414,30440,30441],{"class":2593,"line":6627},[414,30442,30443],{"class":3527},"  \u002F\u002F Response with rich formatting\n",[414,30445,30446,30448,30450],{"class":2593,"line":6633},[414,30447,3687],{"class":2698},[414,30449,29733],{"class":2597},[414,30451,18230],{"class":2705},[414,30453,30454],{"class":2593,"line":6639},[414,30455,3015],{"class":2705},[414,30457,30458],{"class":2593,"line":6645},[414,30459,30372],{"class":2705},[414,30461,30462],{"class":2593,"line":6651},[414,30463,30377],{"class":2705},[414,30465,30466],{"class":2593,"line":6657},[414,30467,30468],{"class":2601},"    '**Bold text** and *italic text* with a [link](https:\u002F\u002Fexample.com)'\n",[414,30470,30471],{"class":2593,"line":6663},[414,30472,16572],{"class":2705},[414,30474,30475],{"class":2593,"line":6669},[414,30476,3035],{"class":2705},[22,30478,30479,7340,30481],{},[31,30480,28763],{},[41,30482,23751],{"href":30483,"rel":30484},"https:\u002F\u002Fdocs.unified.to\u002Fmessaging\u002Foverview",[45],[55,30486,30488],{"id":30487},"putting-it-all-together","Putting it all together",[22,30490,30491],{},"Here's a high-level overview of how to combine all the components into a working support bot:",[2584,30493,30495],{"className":2689,"code":30494,"language":2691,"meta":2433,"style":2433},"import { Langbase } from 'langbase';\n\nasync function initializeSupportBot() {\n    \u002F\u002F Initialize APIs\n  const langbase = new Langbase({\n    apiKey: process.env.LANGBASE_API_KEY!\n  });\n\n    \u002F\u002F 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    \u002F\u002F Step 1: Fetch content from KMS\n  const kmsContent = await fetchContent(KMS_CONNECTION_ID, UNIFIED_API_KEY);\n\n    \u002F\u002F 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    \u002F\u002F 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    \u002F\u002F 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:\u002F\u002Fyour-server.com\u002Fwebhook'\n  );\n\n    \u002F\u002F Step 5: Handle incoming questions\n  async function handleQuestion(channelId: string, question: string) {\n    try {\n            \u002F\u002F 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            \u002F\u002F 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\u002F\u002F Usage example\nasync function startBot() {\n  const bot = await initializeSupportBot();\n\n    \u002F\u002F Your webhook endpoint would call this when receiving messages\n  app.post('\u002Fwebhook', async (req, res) => {\n    const { data, webhook, nonce, sig } = req.body;\n\n        \u002F\u002F Handle new messages\n    for (const message of data) {\n            \u002F\u002F 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",[36,30496,30497,30509,30513,30524,30529,30543,30553,30557,30561,30566,30583,30599,30614,30618,30623,30647,30651,30656,30672,30685,30692,30696,30700,30709,30713,30718,30734,30743,30751,30756,30762,30766,30770,30775,30790,30797,30804,30809,30813,30817,30822,30851,30858,30863,30881,30886,30897,30902,30906,30911,30920,30927,30934,30939,30944,30949,30959,30975,30979,30983,30987,30993,30998,31003,31008,31013,31018,31022,31026,31031,31042,31057,31061,31066,31095,31121,31125,31130,31145,31150,31167,31171,31184,31188,31192,31205,31210],{"__ignoreMap":2433},[414,30498,30499,30501,30503,30505,30507],{"class":2593,"line":2594},[414,30500,2699],{"class":2698},[414,30502,28822],{"class":2705},[414,30504,2716],{"class":2698},[414,30506,28827],{"class":2601},[414,30508,2706],{"class":2705},[414,30510,30511],{"class":2593,"line":2434},[414,30512,2740],{"emptyLinePlaceholder":2459},[414,30514,30515,30517,30519,30522],{"class":2593,"line":2613},[414,30516,3928],{"class":2698},[414,30518,2962],{"class":2698},[414,30520,30521],{"class":2597}," initializeSupportBot",[414,30523,3936],{"class":2705},[414,30525,30526],{"class":2593,"line":2625},[414,30527,30528],{"class":3527},"    \u002F\u002F Initialize APIs\n",[414,30530,30531,30533,30535,30537,30539,30541],{"class":2593,"line":2677},[414,30532,3071],{"class":2698},[414,30534,28840],{"class":2607},[414,30536,2817],{"class":2698},[414,30538,2820],{"class":2698},[414,30540,4356],{"class":2597},[414,30542,2826],{"class":2705},[414,30544,30545,30548,30550],{"class":2593,"line":2751},[414,30546,30547],{"class":2705},"    apiKey: process.env.",[414,30549,28856],{"class":2607},[414,30551,30552],{"class":2698},"!\n",[414,30554,30555],{"class":2593,"line":2760},[414,30556,3030],{"class":2705},[414,30558,30559],{"class":2593,"line":2768},[414,30560,2740],{"emptyLinePlaceholder":2459},[414,30562,30563],{"class":2593,"line":2776},[414,30564,30565],{"class":3527},"    \u002F\u002F Get connection IDs - implement these based on how you manage your users\n",[414,30567,30568,30570,30573,30575,30577,30580],{"class":2593,"line":2784},[414,30569,3071],{"class":2698},[414,30571,30572],{"class":2607}," KMS_CONNECTION_ID",[414,30574,2817],{"class":2698},[414,30576,3002],{"class":2698},[414,30578,30579],{"class":2597}," getKMSConnection",[414,30581,30582],{"class":2705},"(user_id);\n",[414,30584,30585,30587,30590,30592,30594,30597],{"class":2593,"line":2792},[414,30586,3071],{"class":2698},[414,30588,30589],{"class":2607}," DISCORD_CONNECTION_ID",[414,30591,2817],{"class":2698},[414,30593,3002],{"class":2698},[414,30595,30596],{"class":2597}," getDiscordConnection",[414,30598,30582],{"class":2705},[414,30600,30601,30603,30606,30608,30610,30612],{"class":2593,"line":2804},[414,30602,3071],{"class":2698},[414,30604,30605],{"class":2607}," UNIFIED_API_KEY",[414,30607,2817],{"class":2698},[414,30609,25869],{"class":2705},[414,30611,2560],{"class":2607},[414,30613,2706],{"class":2705},[414,30615,30616],{"class":2593,"line":2809},[414,30617,2740],{"emptyLinePlaceholder":2459},[414,30619,30620],{"class":2593,"line":2829},[414,30621,30622],{"class":3527},"    \u002F\u002F Step 1: Fetch content from KMS\n",[414,30624,30625,30627,30630,30632,30634,30636,30638,30641,30643,30645],{"class":2593,"line":2843},[414,30626,3071],{"class":2698},[414,30628,30629],{"class":2607}," kmsContent",[414,30631,2817],{"class":2698},[414,30633,3002],{"class":2698},[414,30635,28291],{"class":2597},[414,30637,2968],{"class":2705},[414,30639,30640],{"class":2607},"KMS_CONNECTION_ID",[414,30642,319],{"class":2705},[414,30644,2560],{"class":2607},[414,30646,3156],{"class":2705},[414,30648,30649],{"class":2593,"line":2849},[414,30650,2740],{"emptyLinePlaceholder":2459},[414,30652,30653],{"class":2593,"line":2854},[414,30654,30655],{"class":3527},"    \u002F\u002F Step 2: Set up Langbase Memory and upload content\n",[414,30657,30658,30660,30662,30664,30666,30668,30670],{"class":2593,"line":2880},[414,30659,3071],{"class":2698},[414,30661,28891],{"class":2607},[414,30663,2817],{"class":2698},[414,30665,3002],{"class":2698},[414,30667,28898],{"class":2705},[414,30669,28901],{"class":2597},[414,30671,2826],{"class":2705},[414,30673,30674,30676,30679,30681,30683],{"class":2593,"line":3253},[414,30675,28908],{"class":2705},[414,30677,30678],{"class":2601},"`support-kb-${",[414,30680,23402],{"class":2705},[414,30682,3308],{"class":2601},[414,30684,2757],{"class":2705},[414,30686,30687,30689],{"class":2593,"line":3261},[414,30688,28918],{"class":2705},[414,30690,30691],{"class":2601},"'Knowledge base for support bot'\n",[414,30693,30694],{"class":2593,"line":3279},[414,30695,3030],{"class":2705},[414,30697,30698],{"class":2593,"line":3313},[414,30699,2740],{"emptyLinePlaceholder":2459},[414,30701,30702,30704,30706],{"class":2593,"line":3326},[414,30703,3687],{"class":2698},[414,30705,28980],{"class":2597},[414,30707,30708],{"class":2705},"(kmsContent, memory.name);\n",[414,30710,30711],{"class":2593,"line":3339},[414,30712,2740],{"emptyLinePlaceholder":2459},[414,30714,30715],{"class":2593,"line":3359},[414,30716,30717],{"class":3527},"    \u002F\u002F Step 3: Create an AI agent using Langbase Pipe\n",[414,30719,30720,30722,30724,30726,30728,30730,30732],{"class":2593,"line":6453},[414,30721,3071],{"class":2698},[414,30723,29229],{"class":2607},[414,30725,2817],{"class":2698},[414,30727,3002],{"class":2698},[414,30729,29236],{"class":2705},[414,30731,28901],{"class":2597},[414,30733,2826],{"class":2705},[414,30735,30736,30738,30741],{"class":2593,"line":6459},[414,30737,28908],{"class":2705},[414,30739,30740],{"class":2601},"`discord-support-bot`",[414,30742,2757],{"class":2705},[414,30744,30745,30747,30749],{"class":2593,"line":6465},[414,30746,29254],{"class":2705},[414,30748,29257],{"class":2601},[414,30750,2757],{"class":2705},[414,30752,30753],{"class":2593,"line":6471},[414,30754,30755],{"class":2705},"    memory: memory.name,\n",[414,30757,30758,30760],{"class":2593,"line":6477},[414,30759,28918],{"class":2705},[414,30761,29271],{"class":2601},[414,30763,30764],{"class":2593,"line":6483},[414,30765,3030],{"class":2705},[414,30767,30768],{"class":2593,"line":6489},[414,30769,2740],{"emptyLinePlaceholder":2459},[414,30771,30772],{"class":2593,"line":6495},[414,30773,30774],{"class":3527},"    \u002F\u002F Step 4: Set up Discord webhook for real-time messages\n",[414,30776,30777,30779,30782,30784,30786,30788],{"class":2593,"line":6501},[414,30778,3071],{"class":2698},[414,30780,30781],{"class":2607}," webhook",[414,30783,2817],{"class":2698},[414,30785,3002],{"class":2698},[414,30787,29328],{"class":2597},[414,30789,18230],{"class":2705},[414,30791,30792,30795],{"class":2593,"line":6507},[414,30793,30794],{"class":2607},"    DISCORD_CONNECTION_ID",[414,30796,2757],{"class":2705},[414,30798,30799,30802],{"class":2593,"line":6513},[414,30800,30801],{"class":2607},"    UNIFIED_API_KEY",[414,30803,2757],{"class":2705},[414,30805,30806],{"class":2593,"line":6519},[414,30807,30808],{"class":2601},"    'https:\u002F\u002Fyour-server.com\u002Fwebhook'\n",[414,30810,30811],{"class":2593,"line":6525},[414,30812,16572],{"class":2705},[414,30814,30815],{"class":2593,"line":6531},[414,30816,2740],{"emptyLinePlaceholder":2459},[414,30818,30819],{"class":2593,"line":6537},[414,30820,30821],{"class":3527},"    \u002F\u002F Step 5: Handle incoming questions\n",[414,30823,30824,30827,30829,30832,30834,30836,30838,30840,30842,30845,30847,30849],{"class":2593,"line":6543},[414,30825,30826],{"class":2698},"  async",[414,30828,2962],{"class":2698},[414,30830,30831],{"class":2597}," handleQuestion",[414,30833,2968],{"class":2705},[414,30835,30001],{"class":2971},[414,30837,2646],{"class":2698},[414,30839,2977],{"class":2607},[414,30841,319],{"class":2705},[414,30843,30844],{"class":2971},"question",[414,30846,2646],{"class":2698},[414,30848,2977],{"class":2607},[414,30850,3826],{"class":2705},[414,30852,30853,30856],{"class":2593,"line":6549},[414,30854,30855],{"class":2698},"    try",[414,30857,2748],{"class":2705},[414,30859,30860],{"class":2593,"line":6555},[414,30861,30862],{"class":3527},"            \u002F\u002F Use the Pipe to generate a response\n",[414,30864,30865,30868,30870,30872,30874,30876,30879],{"class":2593,"line":6561},[414,30866,30867],{"class":2698},"      const",[414,30869,28445],{"class":2607},[414,30871,2817],{"class":2698},[414,30873,3002],{"class":2698},[414,30875,29236],{"class":2705},[414,30877,30878],{"class":2597},"chat",[414,30880,2826],{"class":2705},[414,30882,30883],{"class":2593,"line":6567},[414,30884,30885],{"class":2705},"        pipe: pipe.name,\n",[414,30887,30888,30891,30894],{"class":2593,"line":6573},[414,30889,30890],{"class":2705},"        messages: [{ role: ",[414,30892,30893],{"class":2601},"'user'",[414,30895,30896],{"class":2705},", content: question }]\n",[414,30898,30899],{"class":2593,"line":6579},[414,30900,30901],{"class":2705},"      });\n",[414,30903,30904],{"class":2593,"line":6585},[414,30905,2740],{"emptyLinePlaceholder":2459},[414,30907,30908],{"class":2593,"line":6591},[414,30909,30910],{"class":3527},"            \u002F\u002F Send the response back to Discord\n",[414,30912,30913,30916,30918],{"class":2593,"line":6597},[414,30914,30915],{"class":2698},"      await",[414,30917,29733],{"class":2597},[414,30919,18230],{"class":2705},[414,30921,30922,30925],{"class":2593,"line":6603},[414,30923,30924],{"class":2607},"        DISCORD_CONNECTION_ID",[414,30926,2757],{"class":2705},[414,30928,30929,30932],{"class":2593,"line":6609},[414,30930,30931],{"class":2607},"        UNIFIED_API_KEY",[414,30933,2757],{"class":2705},[414,30935,30936],{"class":2593,"line":6615},[414,30937,30938],{"class":2705},"        channelId,\n",[414,30940,30941],{"class":2593,"line":6621},[414,30942,30943],{"class":2705},"        response.message\n",[414,30945,30946],{"class":2593,"line":6627},[414,30947,30948],{"class":2705},"      );\n",[414,30950,30951,30953,30956],{"class":2593,"line":6633},[414,30952,30195],{"class":2705},[414,30954,30955],{"class":2698},"catch",[414,30957,30958],{"class":2705}," (error) {\n",[414,30960,30961,30964,30967,30969,30972],{"class":2593,"line":6639},[414,30962,30963],{"class":2705},"      console.",[414,30965,30966],{"class":2597},"error",[414,30968,2968],{"class":2705},[414,30970,30971],{"class":2601},"'Error handling question:'",[414,30973,30974],{"class":2705},", error);\n",[414,30976,30977],{"class":2593,"line":6645},[414,30978,10535],{"class":2705},[414,30980,30981],{"class":2593,"line":6651},[414,30982,4032],{"class":2705},[414,30984,30985],{"class":2593,"line":6657},[414,30986,2740],{"emptyLinePlaceholder":2459},[414,30988,30989,30991],{"class":2593,"line":6663},[414,30990,2999],{"class":2698},[414,30992,2748],{"class":2705},[414,30994,30995],{"class":2593,"line":6669},[414,30996,30997],{"class":2705},"    memory,\n",[414,30999,31000],{"class":2593,"line":6675},[414,31001,31002],{"class":2705},"    pipe,\n",[414,31004,31005],{"class":2593,"line":6681},[414,31006,31007],{"class":2705},"    webhook,\n",[414,31009,31010],{"class":2593,"line":6687},[414,31011,31012],{"class":2705},"    handleQuestion\n",[414,31014,31015],{"class":2593,"line":6693},[414,31016,31017],{"class":2705},"  };\n",[414,31019,31020],{"class":2593,"line":6699},[414,31021,3035],{"class":2705},[414,31023,31024],{"class":2593,"line":6705},[414,31025,2740],{"emptyLinePlaceholder":2459},[414,31027,31028],{"class":2593,"line":6711},[414,31029,31030],{"class":3527},"\u002F\u002F Usage example\n",[414,31032,31033,31035,31037,31040],{"class":2593,"line":6717},[414,31034,3928],{"class":2698},[414,31036,2962],{"class":2698},[414,31038,31039],{"class":2597}," startBot",[414,31041,3936],{"class":2705},[414,31043,31044,31046,31049,31051,31053,31055],{"class":2593,"line":6723},[414,31045,3071],{"class":2698},[414,31047,31048],{"class":2607}," bot",[414,31050,2817],{"class":2698},[414,31052,3002],{"class":2698},[414,31054,30521],{"class":2597},[414,31056,4088],{"class":2705},[414,31058,31059],{"class":2593,"line":6729},[414,31060,2740],{"emptyLinePlaceholder":2459},[414,31062,31063],{"class":2593,"line":6735},[414,31064,31065],{"class":3527},"    \u002F\u002F Your webhook endpoint would call this when receiving messages\n",[414,31067,31068,31071,31073,31075,31077,31079,31081,31083,31085,31087,31089,31091,31093],{"class":2593,"line":6741},[414,31069,31070],{"class":2705},"  app.",[414,31072,29586],{"class":2597},[414,31074,2968],{"class":2705},[414,31076,29591],{"class":2601},[414,31078,319],{"class":2705},[414,31080,3928],{"class":2698},[414,31082,3970],{"class":2705},[414,31084,24307],{"class":2971},[414,31086,319],{"class":2705},[414,31088,24312],{"class":2971},[414,31090,3107],{"class":2705},[414,31092,3110],{"class":2698},[414,31094,2748],{"class":2705},[414,31096,31097,31099,31101,31103,31105,31107,31109,31111,31113,31115,31117,31119],{"class":2593,"line":6747},[414,31098,3986],{"class":2698},[414,31100,26738],{"class":2705},[414,31102,5590],{"class":2607},[414,31104,319],{"class":2705},[414,31106,29627],{"class":2607},[414,31108,319],{"class":2705},[414,31110,22213],{"class":2607},[414,31112,319],{"class":2705},[414,31114,22218],{"class":2607},[414,31116,29638],{"class":2705},[414,31118,2798],{"class":2698},[414,31120,29643],{"class":2705},[414,31122,31123],{"class":2593,"line":6753},[414,31124,2740],{"emptyLinePlaceholder":2459},[414,31126,31127],{"class":2593,"line":6759},[414,31128,31129],{"class":3527},"        \u002F\u002F Handle new messages\n",[414,31131,31132,31135,31137,31139,31141,31143],{"class":2593,"line":6765},[414,31133,31134],{"class":2698},"    for",[414,31136,3970],{"class":2705},[414,31138,2745],{"class":2698},[414,31140,29663],{"class":2607},[414,31142,3978],{"class":2698},[414,31144,29668],{"class":2705},[414,31146,31147],{"class":2593,"line":6771},[414,31148,31149],{"class":3527},"            \u002F\u002F Ignore messages from the bot itself\n",[414,31151,31152,31155,31157,31159,31161,31163,31165],{"class":2593,"line":6777},[414,31153,31154],{"class":2698},"      if",[414,31156,29680],{"class":2705},[414,31158,25066],{"class":2698},[414,31160,29685],{"class":2607},[414,31162,3107],{"class":2705},[414,31164,29690],{"class":2698},[414,31166,2706],{"class":2705},[414,31168,31169],{"class":2593,"line":26058},[414,31170,2740],{"emptyLinePlaceholder":2459},[414,31172,31173,31175,31178,31181],{"class":2593,"line":26068},[414,31174,30915],{"class":2698},[414,31176,31177],{"class":2705}," bot.",[414,31179,31180],{"class":2597},"handleQuestion",[414,31182,31183],{"class":2705},"(message.channel_id, message.message);\n",[414,31185,31186],{"class":2593,"line":26073},[414,31187,10535],{"class":2705},[414,31189,31190],{"class":2593,"line":26078},[414,31191,2740],{"emptyLinePlaceholder":2459},[414,31193,31194,31197,31199,31201,31203],{"class":2593,"line":26103},[414,31195,31196],{"class":2705},"    res.",[414,31198,29779],{"class":2597},[414,31200,2968],{"class":2705},[414,31202,29784],{"class":2607},[414,31204,3156],{"class":2705},[414,31206,31208],{"class":2593,"line":31207},86,[414,31209,3030],{"class":2705},[414,31211,31213],{"class":2593,"line":31212},87,[414,31214,3035],{"class":2705},[22,31216,31217],{},"This implementation:",[2510,31219,31220,31223,31226,31229],{},[2357,31221,31222],{},"Initializes both Unified.to and Langbase clients",[2357,31224,31225],{},"Creates a Memory AGent to store your knowledge base content",[2357,31227,31228],{},"Sets up a Pipe to handle natural language interactions",[2357,31230,31231],{},"Configures Discord webhooks for real-time messaging",[22,31233,31234],{},"The bot will now:",[2354,31236,31237,31240,31243],{},[2357,31238,31239],{},"Automatically receive messages from Discord through webhooks",[2357,31241,31242],{},"Process questions using your knowledge base through Langbase Pipes",[2357,31244,31245],{},"Send responses back to the appropriate Discord channel",[22,31247,31248],{},"All of this happens with minimal infrastructure management on your part - Unified.to handles the integrations while Langbase manages the AI components.",[55,31250,31252],{"id":31251},"conclusion","Conclusion",[22,31254,31255],{},"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:",[2354,31257,31258,31261,31264,31266],{},[2357,31259,31260],{},"Pull knowledge base content from any system using Unified.to's KMS API",[2357,31262,31263],{},"Process and embed that content using Langbase Memory Agents",[2357,31265,27877],{},[2357,31267,31268],{},"Handle real-time messages through Discord using Unified.to's Messaging API and webhooks",[22,31270,31271],{},"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.",[22,31273,31274],{},"And with Langbase handling the AI components, you can enhance your bot's capabilities without managing complex infrastructure:",[2354,31276,31277,31280,31283],{},[2357,31278,31279],{},"Experiment with multiple Memory Agents for different types of content",[2357,31281,31282],{},"Customize your Pipe's behaviour through prompt engineering",[2357,31284,31285],{},"Scale your bot without worrying about vector store management",[22,31287,31288],{},"Happy building!",[4156,31290,31291],{},"html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}",{"title":2433,"searchDepth":2434,"depth":2434,"links":31293},[31294,31295,31296,31301,31302,31303,31304,31305,31306],{"id":4425,"depth":2434,"text":4426},{"id":4889,"depth":2434,"text":4890},{"id":27933,"depth":2434,"text":27934,"children":31297},[31298,31299,31300],{"id":27954,"depth":2613,"text":27955},{"id":27994,"depth":2613,"text":27995},{"id":28037,"depth":2613,"text":28038},{"id":28270,"depth":2434,"text":28271},{"id":28781,"depth":2434,"text":28782},{"id":29305,"depth":2434,"text":29306},{"id":29963,"depth":2434,"text":29964},{"id":30487,"depth":2434,"text":30488},{"id":31251,"depth":2434,"text":31252},{"img":31308,"date":31309,"updated":31310,"tag":2457,"integrations":31311},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_build_a_discord_support_bot_with_unified_and_langbase-icon.png","2024-12-12T00:00:00.000Z","2026-10-08T21:57:44.477Z","discord","\u002Fguides\u002Fhow_to_build_a_discord_support_bot_with_unified_and_langbase",{"title":27840,"description":27855},"guides\u002Fhow_to_build_a_discord_support_bot_with_unified_and_langbase","aSxXLHoJwqn_Zznx6Q5nsLTDAO0uNAtMGJoxZ4x6jQw",{"id":31317,"title":31318,"body":31319,"description":32448,"extension":2452,"meta":32449,"navigation":2459,"path":32454,"seo":32455,"stem":32456,"__hash__":32457},"guides\u002Fguides\u002Fhow_to_build_a_fintech_application_with_unified_payments_api.md","How to Build a Fintech Application with Unified's Payments API",{"type":12,"value":31320,"toc":32436},[31321,31324,31326,31331,31336,31339,31342,31345,31352,31354,31356,31370,31372,31376,31379,31416,31420,31434,31436,31440,31520,31522,31526,31529,31532,31536,31612,31614,31618,31796,31798,31802,31877,31879,31883,31958,31960,31964,32039,32041,32045,32048,32429,32431,32434],[15,31322,31318],{"id":31323},"how-to-build-a-fintech-application-with-unifieds-payments-api",[19,31325],{},[22,31327,31328],{},[25,31329,31330],{},"September 9, 2025",[22,31332,31333],{},[25,31334,31335],{},"Last Updated: July 2026",[22,31337,31338],{},"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!",[22,31340,31341],{},"You can do various things such as creating payments, generating payment links, and reading refund and payout records for reconciliation, all without building custom integrations for each payment provider. Refunds and payouts are read-only in the unified model: you retrieve them to reconcile, and issue them through the payment provider itself.",[22,31343,31344],{},"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.",[22,31346,31347],{},[41,31348,31351],{"href":31349,"rel":31350},"https:\u002F\u002Fdocs.unified.to\u002Fpayment\u002Fintegrations",[45],"See the full list of supported payment integrations.",[19,31353],{},[55,31355,2542],{"id":2541},[2354,31357,31358,31361,31364,31367],{},[2357,31359,31360],{},"Node.js (v18+)",[2357,31362,31363],{},"Unified account with a payment integration enabled (e.g., Stripe)",[2357,31365,31366],{},"Unified API key",[2357,31368,31369],{},"Your customer's payment processor connection ID",[19,31371],{},[55,31373,31375],{"id":31374},"step-1-setting-up-your-project","Step 1: Setting up your project",[22,31377,31378],{},"Set up your dependencies",[2584,31380,31382],{"className":2586,"code":31381,"language":2588,"meta":2433,"style":2433},"mkdir payments-demo\ncd payments-demo\nnpm init -y\nnpm install @unified-api\u002Ftypescript-sdk dotenv\n",[36,31383,31384,31391,31397,31405],{"__ignoreMap":2433},[414,31385,31386,31388],{"class":2593,"line":2594},[414,31387,2598],{"class":2597},[414,31389,31390],{"class":2601}," payments-demo\n",[414,31392,31393,31395],{"class":2593,"line":2434},[414,31394,2608],{"class":2607},[414,31396,31390],{"class":2601},[414,31398,31399,31401,31403],{"class":2593,"line":2613},[414,31400,2616],{"class":2597},[414,31402,2619],{"class":2601},[414,31404,2622],{"class":2607},[414,31406,31407,31409,31411,31413],{"class":2593,"line":2625},[414,31408,2616],{"class":2597},[414,31410,2630],{"class":2601},[414,31412,2633],{"class":2601},[414,31414,31415],{"class":2601}," dotenv\n",[22,31417,2642,31418,2646],{},[36,31419,2645],{},[2584,31421,31423],{"className":2649,"code":31422,"language":2651,"meta":2652,"style":2433},"UNIFIED_API_KEY=your_unified_api_key\nCONNECTION_STRIPE=your_customer_stripe_connection_id\n",[36,31424,31425,31429],{"__ignoreMap":2433},[414,31426,31427],{"class":2593,"line":2594},[414,31428,2659],{},[414,31430,31431],{"class":2593,"line":2434},[414,31432,31433],{},"CONNECTION_STRIPE=your_customer_stripe_connection_id\n",[19,31435],{},[55,31437,31439],{"id":31438},"step-2-initialize-the-sdk","Step 2: Initialize the SDK",[2584,31441,31443],{"className":2689,"code":31442,"language":2691,"meta":2433,"style":2433},"import 'dotenv\u002Fconfig';\nimport { UnifiedTo } from '@unified-api\u002Ftypescript-sdk';\n\nconst { UNIFIED_API_KEY, CONNECTION_STRIPE } = process.env;\n\nconst sdk = new UnifiedTo({\n  security: { jwt: UNIFIED_API_KEY! },\n});\n",[36,31444,31445,31453,31465,31469,31488,31492,31506,31516],{"__ignoreMap":2433},[414,31446,31447,31449,31451],{"class":2593,"line":2594},[414,31448,2699],{"class":2698},[414,31450,2702],{"class":2601},[414,31452,2706],{"class":2705},[414,31454,31455,31457,31459,31461,31463],{"class":2593,"line":2434},[414,31456,2699],{"class":2698},[414,31458,2713],{"class":2705},[414,31460,2716],{"class":2698},[414,31462,2719],{"class":2601},[414,31464,2706],{"class":2705},[414,31466,31467],{"class":2593,"line":2613},[414,31468,2740],{"emptyLinePlaceholder":2459},[414,31470,31471,31473,31475,31477,31479,31482,31484,31486],{"class":2593,"line":2625},[414,31472,2745],{"class":2698},[414,31474,26738],{"class":2705},[414,31476,2560],{"class":2607},[414,31478,319],{"class":2705},[414,31480,31481],{"class":2607},"CONNECTION_STRIPE",[414,31483,29638],{"class":2705},[414,31485,2798],{"class":2698},[414,31487,2801],{"class":2705},[414,31489,31490],{"class":2593,"line":2677},[414,31491,2740],{"emptyLinePlaceholder":2459},[414,31493,31494,31496,31498,31500,31502,31504],{"class":2593,"line":2751},[414,31495,2745],{"class":2698},[414,31497,2814],{"class":2607},[414,31499,2817],{"class":2698},[414,31501,2820],{"class":2698},[414,31503,2823],{"class":2597},[414,31505,2826],{"class":2705},[414,31507,31508,31510,31512,31514],{"class":2593,"line":2760},[414,31509,2832],{"class":2705},[414,31511,2560],{"class":2607},[414,31513,2837],{"class":2698},[414,31515,2840],{"class":2705},[414,31517,31518],{"class":2593,"line":2768},[414,31519,2846],{"class":2705},[19,31521],{},[55,31523,31525],{"id":31524},"step-3-how-to-get-your-customers-connection-id","Step 3: How to Get Your Customer's Connection ID",[22,31527,31528],{},"Before you can list payments, your customer must authorize your app to access their payment provider via Unified's embedded auth flow.",[22,31530,31531],{},"Once authorized, you'll receive a connection ID for each integrations.",[55,31533,31535],{"id":31534},"step-4-listing-payments","Step 4: Listing Payments",[2584,31537,31539],{"className":2689,"code":31538,"language":2691,"meta":2433,"style":2433},"export async function listPayments(connectionId: string) {\n  const payments = await sdk.payment.listPaymentPayments({\n    connectionId,\n    limit: 10,\n  });\n  return payments; \u002F\u002F PaymentPayment[]\n}\n",[36,31540,31541,31562,31581,31585,31594,31598,31608],{"__ignoreMap":2433},[414,31542,31543,31545,31547,31549,31552,31554,31556,31558,31560],{"class":2593,"line":2594},[414,31544,2956],{"class":2698},[414,31546,2959],{"class":2698},[414,31548,2962],{"class":2698},[414,31550,31551],{"class":2597}," listPayments",[414,31553,2968],{"class":2705},[414,31555,2972],{"class":2971},[414,31557,2646],{"class":2698},[414,31559,2977],{"class":2607},[414,31561,3826],{"class":2705},[414,31563,31564,31566,31569,31571,31573,31576,31579],{"class":2593,"line":2434},[414,31565,3071],{"class":2698},[414,31567,31568],{"class":2607}," payments",[414,31570,2817],{"class":2698},[414,31572,3002],{"class":2698},[414,31574,31575],{"class":2705}," sdk.payment.",[414,31577,31578],{"class":2597},"listPaymentPayments",[414,31580,2826],{"class":2705},[414,31582,31583],{"class":2593,"line":2613},[414,31584,3015],{"class":2705},[414,31586,31587,31589,31592],{"class":2593,"line":2625},[414,31588,3020],{"class":2705},[414,31590,31591],{"class":2607},"10",[414,31593,2757],{"class":2705},[414,31595,31596],{"class":2593,"line":2677},[414,31597,3030],{"class":2705},[414,31599,31600,31602,31605],{"class":2593,"line":2751},[414,31601,2999],{"class":2698},[414,31603,31604],{"class":2705}," payments; ",[414,31606,31607],{"class":3527},"\u002F\u002F PaymentPayment[]\n",[414,31609,31610],{"class":2593,"line":2760},[414,31611,3035],{"class":2705},[19,31613],{},[55,31615,31617],{"id":31616},"step-5-creating-a-payment-link","Step 5: Creating a Payment Link",[2584,31619,31621],{"className":2689,"code":31620,"language":2691,"meta":2433,"style":2433},"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:\u002F\u002Fexample.com\u002Fsuccess>\",\n      \u002F\u002F 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; \u002F\u002F PaymentLink\n}\n",[36,31622,31623,31661,31680,31684,31689,31694,31699,31708,31718,31723,31728,31732,31742,31747,31756,31766,31770,31774,31778,31782,31792],{"__ignoreMap":2433},[414,31624,31625,31627,31629,31631,31634,31636,31638,31640,31642,31644,31647,31649,31651,31653,31655,31657,31659],{"class":2593,"line":2594},[414,31626,2956],{"class":2698},[414,31628,2959],{"class":2698},[414,31630,2962],{"class":2698},[414,31632,31633],{"class":2597}," createPaymentLink",[414,31635,2968],{"class":2705},[414,31637,2972],{"class":2971},[414,31639,2646],{"class":2698},[414,31641,2977],{"class":2607},[414,31643,319],{"class":2705},[414,31645,31646],{"class":2971},"amount",[414,31648,2646],{"class":2698},[414,31650,3679],{"class":2607},[414,31652,319],{"class":2705},[414,31654,308],{"class":2971},[414,31656,2646],{"class":2698},[414,31658,2977],{"class":2607},[414,31660,3826],{"class":2705},[414,31662,31663,31665,31668,31670,31672,31675,31678],{"class":2593,"line":2434},[414,31664,3071],{"class":2698},[414,31666,31667],{"class":2607}," link",[414,31669,2817],{"class":2698},[414,31671,3002],{"class":2698},[414,31673,31674],{"class":2705}," sdk.link.",[414,31676,31677],{"class":2597},"createPaymentLink",[414,31679,2826],{"class":2705},[414,31681,31682],{"class":2593,"line":2613},[414,31683,3015],{"class":2705},[414,31685,31686],{"class":2593,"line":2625},[414,31687,31688],{"class":2705},"    paymentLink: {\n",[414,31690,31691],{"class":2593,"line":2677},[414,31692,31693],{"class":2705},"      amount,\n",[414,31695,31696],{"class":2593,"line":2751},[414,31697,31698],{"class":2705},"      currency,\n",[414,31700,31701,31704,31706],{"class":2593,"line":2760},[414,31702,31703],{"class":2705},"      isActive: ",[414,31705,3891],{"class":2607},[414,31707,2757],{"class":2705},[414,31709,31710,31713,31716],{"class":2593,"line":2768},[414,31711,31712],{"class":2705},"      successUrl: ",[414,31714,31715],{"class":2601},"\"\u003Chttps:\u002F\u002Fexample.com\u002Fsuccess>\"",[414,31717,2757],{"class":2705},[414,31719,31720],{"class":2593,"line":2776},[414,31721,31722],{"class":3527},"      \u002F\u002F Stripe typically requires line items on links\n",[414,31724,31725],{"class":2593,"line":2784},[414,31726,31727],{"class":2705},"      lineitems: [\n",[414,31729,31730],{"class":2593,"line":2792},[414,31731,10590],{"class":2705},[414,31733,31734,31737,31740],{"class":2593,"line":2804},[414,31735,31736],{"class":2705},"          itemName: ",[414,31738,31739],{"class":2601},"\"Order #123\"",[414,31741,2757],{"class":2705},[414,31743,31744],{"class":2593,"line":2809},[414,31745,31746],{"class":2705},"          unitAmount: amount,\n",[414,31748,31749,31752,31754],{"class":2593,"line":2829},[414,31750,31751],{"class":2705},"          unitQuantity: ",[414,31753,15737],{"class":2607},[414,31755,2757],{"class":2705},[414,31757,31758,31761,31764],{"class":2593,"line":2843},[414,31759,31760],{"class":2705},"          itemSku: ",[414,31762,31763],{"class":2601},"\"SKU-123\"",[414,31765,2757],{"class":2705},[414,31767,31768],{"class":2593,"line":2849},[414,31769,3768],{"class":2705},[414,31771,31772],{"class":2593,"line":2854},[414,31773,11039],{"class":2705},[414,31775,31776],{"class":2593,"line":2880},[414,31777,3548],{"class":2705},[414,31779,31780],{"class":2593,"line":3253},[414,31781,3030],{"class":2705},[414,31783,31784,31786,31789],{"class":2593,"line":3261},[414,31785,2999],{"class":2698},[414,31787,31788],{"class":2705}," link; ",[414,31790,31791],{"class":3527},"\u002F\u002F PaymentLink\n",[414,31793,31794],{"class":2593,"line":3279},[414,31795,3035],{"class":2705},[19,31797],{},[55,31799,31801],{"id":31800},"step-6-listing-refunds","Step 6: Listing Refunds",[2584,31803,31805],{"className":2689,"code":31804,"language":2691,"meta":2433,"style":2433},"export async function listRefunds(connectionId: string) {\n  const refunds = await sdk.refund.listPaymentRefunds({\n    connectionId,\n    limit: 10,\n  });\n  return refunds; \u002F\u002F PaymentRefund[]\n}\n",[36,31806,31807,31828,31847,31851,31859,31863,31873],{"__ignoreMap":2433},[414,31808,31809,31811,31813,31815,31818,31820,31822,31824,31826],{"class":2593,"line":2594},[414,31810,2956],{"class":2698},[414,31812,2959],{"class":2698},[414,31814,2962],{"class":2698},[414,31816,31817],{"class":2597}," listRefunds",[414,31819,2968],{"class":2705},[414,31821,2972],{"class":2971},[414,31823,2646],{"class":2698},[414,31825,2977],{"class":2607},[414,31827,3826],{"class":2705},[414,31829,31830,31832,31835,31837,31839,31842,31845],{"class":2593,"line":2434},[414,31831,3071],{"class":2698},[414,31833,31834],{"class":2607}," refunds",[414,31836,2817],{"class":2698},[414,31838,3002],{"class":2698},[414,31840,31841],{"class":2705}," sdk.refund.",[414,31843,31844],{"class":2597},"listPaymentRefunds",[414,31846,2826],{"class":2705},[414,31848,31849],{"class":2593,"line":2613},[414,31850,3015],{"class":2705},[414,31852,31853,31855,31857],{"class":2593,"line":2625},[414,31854,3020],{"class":2705},[414,31856,31591],{"class":2607},[414,31858,2757],{"class":2705},[414,31860,31861],{"class":2593,"line":2677},[414,31862,3030],{"class":2705},[414,31864,31865,31867,31870],{"class":2593,"line":2751},[414,31866,2999],{"class":2698},[414,31868,31869],{"class":2705}," refunds; ",[414,31871,31872],{"class":3527},"\u002F\u002F PaymentRefund[]\n",[414,31874,31875],{"class":2593,"line":2760},[414,31876,3035],{"class":2705},[19,31878],{},[55,31880,31882],{"id":31881},"step-7-listing-payouts","Step 7: Listing Payouts",[2584,31884,31886],{"className":2689,"code":31885,"language":2691,"meta":2433,"style":2433},"export async function listPayouts(connectionId: string) {\n  const payouts = await sdk.payout.listPaymentPayouts({\n    connectionId,\n    limit: 10,\n  });\n  return payouts; \u002F\u002F PaymentPayout[]\n}\n",[36,31887,31888,31909,31928,31932,31940,31944,31954],{"__ignoreMap":2433},[414,31889,31890,31892,31894,31896,31899,31901,31903,31905,31907],{"class":2593,"line":2594},[414,31891,2956],{"class":2698},[414,31893,2959],{"class":2698},[414,31895,2962],{"class":2698},[414,31897,31898],{"class":2597}," listPayouts",[414,31900,2968],{"class":2705},[414,31902,2972],{"class":2971},[414,31904,2646],{"class":2698},[414,31906,2977],{"class":2607},[414,31908,3826],{"class":2705},[414,31910,31911,31913,31916,31918,31920,31923,31926],{"class":2593,"line":2434},[414,31912,3071],{"class":2698},[414,31914,31915],{"class":2607}," payouts",[414,31917,2817],{"class":2698},[414,31919,3002],{"class":2698},[414,31921,31922],{"class":2705}," sdk.payout.",[414,31924,31925],{"class":2597},"listPaymentPayouts",[414,31927,2826],{"class":2705},[414,31929,31930],{"class":2593,"line":2613},[414,31931,3015],{"class":2705},[414,31933,31934,31936,31938],{"class":2593,"line":2625},[414,31935,3020],{"class":2705},[414,31937,31591],{"class":2607},[414,31939,2757],{"class":2705},[414,31941,31942],{"class":2593,"line":2677},[414,31943,3030],{"class":2705},[414,31945,31946,31948,31951],{"class":2593,"line":2751},[414,31947,2999],{"class":2698},[414,31949,31950],{"class":2705}," payouts; ",[414,31952,31953],{"class":3527},"\u002F\u002F PaymentPayout[]\n",[414,31955,31956],{"class":2593,"line":2760},[414,31957,3035],{"class":2705},[19,31959],{},[55,31961,31963],{"id":31962},"step-8-listing-subscriptions","Step 8: Listing Subscriptions",[2584,31965,31967],{"className":2689,"code":31966,"language":2691,"meta":2433,"style":2433},"export async function listSubscriptions(connectionId: string) {\n  const subs = await sdk.subscription.listPaymentSubscriptions({\n    connectionId,\n    limit: 10,\n  });\n  return subs; \u002F\u002F PaymentSubscription[]\n}\n",[36,31968,31969,31990,32009,32013,32021,32025,32035],{"__ignoreMap":2433},[414,31970,31971,31973,31975,31977,31980,31982,31984,31986,31988],{"class":2593,"line":2594},[414,31972,2956],{"class":2698},[414,31974,2959],{"class":2698},[414,31976,2962],{"class":2698},[414,31978,31979],{"class":2597}," listSubscriptions",[414,31981,2968],{"class":2705},[414,31983,2972],{"class":2971},[414,31985,2646],{"class":2698},[414,31987,2977],{"class":2607},[414,31989,3826],{"class":2705},[414,31991,31992,31994,31997,31999,32001,32004,32007],{"class":2593,"line":2434},[414,31993,3071],{"class":2698},[414,31995,31996],{"class":2607}," subs",[414,31998,2817],{"class":2698},[414,32000,3002],{"class":2698},[414,32002,32003],{"class":2705}," sdk.subscription.",[414,32005,32006],{"class":2597},"listPaymentSubscriptions",[414,32008,2826],{"class":2705},[414,32010,32011],{"class":2593,"line":2613},[414,32012,3015],{"class":2705},[414,32014,32015,32017,32019],{"class":2593,"line":2625},[414,32016,3020],{"class":2705},[414,32018,31591],{"class":2607},[414,32020,2757],{"class":2705},[414,32022,32023],{"class":2593,"line":2677},[414,32024,3030],{"class":2705},[414,32026,32027,32029,32032],{"class":2593,"line":2751},[414,32028,2999],{"class":2698},[414,32030,32031],{"class":2705}," subs; ",[414,32033,32034],{"class":3527},"\u002F\u002F PaymentSubscription[]\n",[414,32036,32037],{"class":2593,"line":2760},[414,32038,3035],{"class":2705},[19,32040],{},[55,32042,32044],{"id":32043},"step-9-example-usage","Step 9: Example Usage",[22,32046,32047],{},"Here's how you might use these functions in your payment workflow:",[2584,32049,32051],{"className":2689,"code":32050,"language":2691,"meta":2433,"style":2433},"async function main() {\n  \u002F\u002F 1. Create a payment\n  const payment = await createPayment(CONNECTION_STRIPE!, 1000, \"USD\");\n\n  \u002F\u002F 2. List payments\n  const payments = await listPayments(CONNECTION_STRIPE!);\n\n  \u002F\u002F 3. Create a payment link\n  const link = await createPaymentLink(CONNECTION_STRIPE!, 1000, \"USD\");\n\n  \u002F\u002F 4. List links\n  const links = await sdk.link.listPaymentLinks({ connectionId: CONNECTION_STRIPE!, limit: 10 });\n\n  \u002F\u002F 5. List refunds\n  const refunds = await listRefunds(CONNECTION_STRIPE!);\n\n  \u002F\u002F 6. List payouts\n  const payouts = await listPayouts(CONNECTION_STRIPE!);\n\n  \u002F\u002F 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",[36,32052,32053,32063,32068,32100,32104,32109,32129,32133,32138,32166,32170,32175,32205,32209,32214,32234,32238,32243,32263,32267,32272,32293,32297,32311,32329,32343,32361,32379,32397,32415,32419,32423],{"__ignoreMap":2433},[414,32054,32055,32057,32059,32061],{"class":2593,"line":2594},[414,32056,3928],{"class":2698},[414,32058,2962],{"class":2698},[414,32060,3933],{"class":2597},[414,32062,3936],{"class":2705},[414,32064,32065],{"class":2593,"line":2434},[414,32066,32067],{"class":3527},"  \u002F\u002F 1. Create a payment\n",[414,32069,32070,32072,32075,32077,32079,32082,32084,32086,32088,32090,32093,32095,32098],{"class":2593,"line":2613},[414,32071,3071],{"class":2698},[414,32073,32074],{"class":2607}," payment",[414,32076,2817],{"class":2698},[414,32078,3002],{"class":2698},[414,32080,32081],{"class":2597}," createPayment",[414,32083,2968],{"class":2705},[414,32085,31481],{"class":2607},[414,32087,2837],{"class":2698},[414,32089,319],{"class":2705},[414,32091,32092],{"class":2607},"1000",[414,32094,319],{"class":2705},[414,32096,32097],{"class":2601},"\"USD\"",[414,32099,3156],{"class":2705},[414,32101,32102],{"class":2593,"line":2625},[414,32103,2740],{"emptyLinePlaceholder":2459},[414,32105,32106],{"class":2593,"line":2677},[414,32107,32108],{"class":3527},"  \u002F\u002F 2. List payments\n",[414,32110,32111,32113,32115,32117,32119,32121,32123,32125,32127],{"class":2593,"line":2751},[414,32112,3071],{"class":2698},[414,32114,31568],{"class":2607},[414,32116,2817],{"class":2698},[414,32118,3002],{"class":2698},[414,32120,31551],{"class":2597},[414,32122,2968],{"class":2705},[414,32124,31481],{"class":2607},[414,32126,2837],{"class":2698},[414,32128,3156],{"class":2705},[414,32130,32131],{"class":2593,"line":2760},[414,32132,2740],{"emptyLinePlaceholder":2459},[414,32134,32135],{"class":2593,"line":2768},[414,32136,32137],{"class":3527},"  \u002F\u002F 3. Create a payment link\n",[414,32139,32140,32142,32144,32146,32148,32150,32152,32154,32156,32158,32160,32162,32164],{"class":2593,"line":2776},[414,32141,3071],{"class":2698},[414,32143,31667],{"class":2607},[414,32145,2817],{"class":2698},[414,32147,3002],{"class":2698},[414,32149,31633],{"class":2597},[414,32151,2968],{"class":2705},[414,32153,31481],{"class":2607},[414,32155,2837],{"class":2698},[414,32157,319],{"class":2705},[414,32159,32092],{"class":2607},[414,32161,319],{"class":2705},[414,32163,32097],{"class":2601},[414,32165,3156],{"class":2705},[414,32167,32168],{"class":2593,"line":2784},[414,32169,2740],{"emptyLinePlaceholder":2459},[414,32171,32172],{"class":2593,"line":2792},[414,32173,32174],{"class":3527},"  \u002F\u002F 4. List links\n",[414,32176,32177,32179,32182,32184,32186,32188,32191,32194,32196,32198,32201,32203],{"class":2593,"line":2804},[414,32178,3071],{"class":2698},[414,32180,32181],{"class":2607}," links",[414,32183,2817],{"class":2698},[414,32185,3002],{"class":2698},[414,32187,31674],{"class":2705},[414,32189,32190],{"class":2597},"listPaymentLinks",[414,32192,32193],{"class":2705},"({ connectionId: ",[414,32195,31481],{"class":2607},[414,32197,2837],{"class":2698},[414,32199,32200],{"class":2705},", limit: ",[414,32202,31591],{"class":2607},[414,32204,2877],{"class":2705},[414,32206,32207],{"class":2593,"line":2809},[414,32208,2740],{"emptyLinePlaceholder":2459},[414,32210,32211],{"class":2593,"line":2829},[414,32212,32213],{"class":3527},"  \u002F\u002F 5. List refunds\n",[414,32215,32216,32218,32220,32222,32224,32226,32228,32230,32232],{"class":2593,"line":2843},[414,32217,3071],{"class":2698},[414,32219,31834],{"class":2607},[414,32221,2817],{"class":2698},[414,32223,3002],{"class":2698},[414,32225,31817],{"class":2597},[414,32227,2968],{"class":2705},[414,32229,31481],{"class":2607},[414,32231,2837],{"class":2698},[414,32233,3156],{"class":2705},[414,32235,32236],{"class":2593,"line":2849},[414,32237,2740],{"emptyLinePlaceholder":2459},[414,32239,32240],{"class":2593,"line":2854},[414,32241,32242],{"class":3527},"  \u002F\u002F 6. List payouts\n",[414,32244,32245,32247,32249,32251,32253,32255,32257,32259,32261],{"class":2593,"line":2880},[414,32246,3071],{"class":2698},[414,32248,31915],{"class":2607},[414,32250,2817],{"class":2698},[414,32252,3002],{"class":2698},[414,32254,31898],{"class":2597},[414,32256,2968],{"class":2705},[414,32258,31481],{"class":2607},[414,32260,2837],{"class":2698},[414,32262,3156],{"class":2705},[414,32264,32265],{"class":2593,"line":3253},[414,32266,2740],{"emptyLinePlaceholder":2459},[414,32268,32269],{"class":2593,"line":3261},[414,32270,32271],{"class":3527},"  \u002F\u002F 7. List subscriptions (creation may not be implemented for some providers)\n",[414,32273,32274,32276,32279,32281,32283,32285,32287,32289,32291],{"class":2593,"line":3279},[414,32275,3071],{"class":2698},[414,32277,32278],{"class":2607}," subscriptions",[414,32280,2817],{"class":2698},[414,32282,3002],{"class":2698},[414,32284,31979],{"class":2597},[414,32286,2968],{"class":2705},[414,32288,31481],{"class":2607},[414,32290,2837],{"class":2698},[414,32292,3156],{"class":2705},[414,32294,32295],{"class":2593,"line":3313},[414,32296,2740],{"emptyLinePlaceholder":2459},[414,32298,32299,32301,32303,32305,32308],{"class":2593,"line":3326},[414,32300,4061],{"class":2705},[414,32302,4064],{"class":2597},[414,32304,2968],{"class":2705},[414,32306,32307],{"class":2601},"\"Payment:\"",[414,32309,32310],{"class":2705},", payment);\n",[414,32312,32313,32315,32317,32319,32322,32325,32327],{"class":2593,"line":3339},[414,32314,4061],{"class":2705},[414,32316,4064],{"class":2597},[414,32318,2968],{"class":2705},[414,32320,32321],{"class":2601},"\"Payments count:\"",[414,32323,32324],{"class":2705},", payments.",[414,32326,25098],{"class":2607},[414,32328,3156],{"class":2705},[414,32330,32331,32333,32335,32337,32340],{"class":2593,"line":3359},[414,32332,4061],{"class":2705},[414,32334,4064],{"class":2597},[414,32336,2968],{"class":2705},[414,32338,32339],{"class":2601},"\"Payment Link URL:\"",[414,32341,32342],{"class":2705},", link.url);\n",[414,32344,32345,32347,32349,32351,32354,32357,32359],{"class":2593,"line":6453},[414,32346,4061],{"class":2705},[414,32348,4064],{"class":2597},[414,32350,2968],{"class":2705},[414,32352,32353],{"class":2601},"\"Links count:\"",[414,32355,32356],{"class":2705},", links.",[414,32358,25098],{"class":2607},[414,32360,3156],{"class":2705},[414,32362,32363,32365,32367,32369,32372,32375,32377],{"class":2593,"line":6459},[414,32364,4061],{"class":2705},[414,32366,4064],{"class":2597},[414,32368,2968],{"class":2705},[414,32370,32371],{"class":2601},"\"Refunds count:\"",[414,32373,32374],{"class":2705},", refunds.",[414,32376,25098],{"class":2607},[414,32378,3156],{"class":2705},[414,32380,32381,32383,32385,32387,32390,32393,32395],{"class":2593,"line":6465},[414,32382,4061],{"class":2705},[414,32384,4064],{"class":2597},[414,32386,2968],{"class":2705},[414,32388,32389],{"class":2601},"\"Payouts count:\"",[414,32391,32392],{"class":2705},", payouts.",[414,32394,25098],{"class":2607},[414,32396,3156],{"class":2705},[414,32398,32399,32401,32403,32405,32408,32411,32413],{"class":2593,"line":6471},[414,32400,4061],{"class":2705},[414,32402,4064],{"class":2597},[414,32404,2968],{"class":2705},[414,32406,32407],{"class":2601},"\"Subscriptions count:\"",[414,32409,32410],{"class":2705},", subscriptions.",[414,32412,25098],{"class":2607},[414,32414,3156],{"class":2705},[414,32416,32417],{"class":2593,"line":6477},[414,32418,3035],{"class":2705},[414,32420,32421],{"class":2593,"line":6483},[414,32422,2740],{"emptyLinePlaceholder":2459},[414,32424,32425,32427],{"class":2593,"line":6489},[414,32426,4085],{"class":2597},[414,32428,4088],{"class":2705},[19,32430],{},[22,32432,32433],{},"Happy building! 🎉",[4156,32435,4158],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":32437},[32438,32439,32440,32441,32442,32443,32444,32445,32446,32447],{"id":2541,"depth":2434,"text":2542},{"id":31374,"depth":2434,"text":31375},{"id":31438,"depth":2434,"text":31439},{"id":31524,"depth":2434,"text":31525},{"id":31534,"depth":2434,"text":31535},{"id":31616,"depth":2434,"text":31617},{"id":31800,"depth":2434,"text":31801},{"id":31881,"depth":2434,"text":31882},{"id":31962,"depth":2434,"text":31963},{"id":32043,"depth":2434,"text":32044},"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...",{"img":32450,"date":32451,"updated":32452,"tag":2457,"integrations":32453},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_build_a_fintech_application_with_unified_payments_api-icon.png","2025-09-09T00:00:00.000Z","2026-08-23T14:53:35.914Z","stripe","\u002Fguides\u002Fhow_to_build_a_fintech_application_with_unified_payments_api",{"title":31318,"description":32448},"guides\u002Fhow_to_build_a_fintech_application_with_unified_payments_api","6_VSBg8PZISDZEjYk2XOs4rCK9DoTlxRa16aCRF5mWc",{"id":32459,"title":32460,"body":32461,"description":32475,"extension":2452,"meta":33395,"navigation":2459,"path":33399,"seo":33400,"stem":33401,"__hash__":33402},"guides\u002Fguides\u002Fhow_to_build_an_e_commerce_product_integration_with_unified.md","How to Build an E-Commerce Product Integration with Unified",{"type":12,"value":32462,"toc":33385},[32463,32466,32468,32473,32476,32479,32482,32486,32502,32504,32540,32544,32577,32579,32581,32684,32686,32688,32691,32697,32700,32708,32710,32714,32717,32878,32883,32891,32893,32897,32900,33083,33087,33095,33097,33101,33104,33187,33191,33199,33201,33205,33208,33380,33382],[15,32464,32460],{"id":32465},"how-to-build-an-e-commerce-product-integration-with-unified",[19,32467],{},[22,32469,32470],{},[25,32471,32472],{},"September 8, 2025",[22,32474,32475],{},"Unified makes it possible for developers to build ecom products that work with your end customers preferred ecom platforms!",[22,32477,32478],{},"With our Unified Commerce API, you can connect to dozens of ecom systems (like Shopify, BigCommerce, WooCommerce and more).",[22,32480,32481],{},"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.",[55,32483,32485],{"id":32484},"requirements","Requirements",[2354,32487,32488,32491,32494,32496,32499],{},[2357,32489,32490],{},"Node.js (v1",[2357,32492,32493],{},"Unified account with ecom integration",[2357,32495,31366],{},[2357,32497,32498],{},"Your end customer's e-commerce connection ID",[2357,32500,32501],{},"Unified GenAI connection ID",[55,32503,31375],{"id":31374},[2584,32505,32507],{"className":2586,"code":32506,"language":2588,"meta":2433,"style":2433},"mkdir ecommerce-demo\ncd ecommerce-demo\nnpm init -y\nnpm install @unified-api\u002Ftypescript-sdk dotenv\n",[36,32508,32509,32516,32522,32530],{"__ignoreMap":2433},[414,32510,32511,32513],{"class":2593,"line":2594},[414,32512,2598],{"class":2597},[414,32514,32515],{"class":2601}," ecommerce-demo\n",[414,32517,32518,32520],{"class":2593,"line":2434},[414,32519,2608],{"class":2607},[414,32521,32515],{"class":2601},[414,32523,32524,32526,32528],{"class":2593,"line":2613},[414,32525,2616],{"class":2597},[414,32527,2619],{"class":2601},[414,32529,2622],{"class":2607},[414,32531,32532,32534,32536,32538],{"class":2593,"line":2625},[414,32533,2616],{"class":2597},[414,32535,2630],{"class":2601},[414,32537,2633],{"class":2601},[414,32539,31415],{"class":2601},[22,32541,2642,32542,2646],{},[36,32543,2645],{},[2584,32545,32547],{"className":17934,"code":32546,"language":17936,"meta":2433,"style":2433},"UNIFIED_API_KEY=your_unified_api_key\nCONNECTION_SHOPIFY=your_customer_shopify_connection_id\nCONNECTION_GENAI=your_genai_connection_id\n",[36,32548,32549,32558,32568],{"__ignoreMap":2433},[414,32550,32551,32553,32555],{"class":2593,"line":2594},[414,32552,2560],{"class":2705},[414,32554,2798],{"class":2698},[414,32556,32557],{"class":2601},"your_unified_api_key\n",[414,32559,32560,32563,32565],{"class":2593,"line":2434},[414,32561,32562],{"class":2705},"CONNECTION_SHOPIFY",[414,32564,2798],{"class":2698},[414,32566,32567],{"class":2601},"your_customer_shopify_connection_id\n",[414,32569,32570,32572,32574],{"class":2593,"line":2613},[414,32571,3490],{"class":2705},[414,32573,2798],{"class":2698},[414,32575,32576],{"class":2601},"your_genai_connection_id\n",[19,32578],{},[55,32580,31439],{"id":31438},[2584,32582,32584],{"className":2689,"code":32583,"language":2691,"meta":2433,"style":2433},"import 'dotenv\u002Fconfig';\n\nimport { UnifiedTo } from '@unified-api\u002Ftypescript-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",[36,32585,32586,32594,32598,32610,32614,32621,32628,32635,32643,32651,32655,32669,32680],{"__ignoreMap":2433},[414,32587,32588,32590,32592],{"class":2593,"line":2594},[414,32589,2699],{"class":2698},[414,32591,2702],{"class":2601},[414,32593,2706],{"class":2705},[414,32595,32596],{"class":2593,"line":2434},[414,32597,2740],{"emptyLinePlaceholder":2459},[414,32599,32600,32602,32604,32606,32608],{"class":2593,"line":2613},[414,32601,2699],{"class":2698},[414,32603,2713],{"class":2705},[414,32605,2716],{"class":2698},[414,32607,2719],{"class":2601},[414,32609,2706],{"class":2705},[414,32611,32612],{"class":2593,"line":2625},[414,32613,2740],{"emptyLinePlaceholder":2459},[414,32615,32616,32618],{"class":2593,"line":2677},[414,32617,2745],{"class":2698},[414,32619,32620],{"class":2705}," { \n",[414,32622,32623,32625],{"class":2593,"line":2751},[414,32624,30801],{"class":2607},[414,32626,32627],{"class":2705},", \n",[414,32629,32630,32633],{"class":2593,"line":2760},[414,32631,32632],{"class":2607},"    CONNECTION_SHOPIFY",[414,32634,32627],{"class":2705},[414,32636,32637,32640],{"class":2593,"line":2768},[414,32638,32639],{"class":2607},"    CONNECTION_GENAI",[414,32641,32642],{"class":2705}," \n",[414,32644,32645,32647,32649],{"class":2593,"line":2776},[414,32646,2795],{"class":2705},[414,32648,2798],{"class":2698},[414,32650,2801],{"class":2705},[414,32652,32653],{"class":2593,"line":2784},[414,32654,2740],{"emptyLinePlaceholder":2459},[414,32656,32657,32659,32661,32663,32665,32667],{"class":2593,"line":2792},[414,32658,2745],{"class":2698},[414,32660,2814],{"class":2607},[414,32662,2817],{"class":2698},[414,32664,2820],{"class":2698},[414,32666,2823],{"class":2597},[414,32668,2826],{"class":2705},[414,32670,32671,32674,32676,32678],{"class":2593,"line":2804},[414,32672,32673],{"class":2705},"    security: { jwt: ",[414,32675,2560],{"class":2607},[414,32677,2837],{"class":2698},[414,32679,2840],{"class":2705},[414,32681,32682],{"class":2593,"line":2809},[414,32683,2846],{"class":2705},[19,32685],{},[55,32687,31525],{"id":31524},[22,32689,32690],{},"Before you can create or list products, your customer must authorize your app to access their e-commerce store via Unified's  authentication flow.",[22,32692,32693,32694,32696],{},"Once authorized, you'll receive a ",[31,32695,2915],{}," for that customer's integration (e.g., Shopify).",[22,32698,32699],{},"Store this connection ID securely as shown above and use it in all API calls for that customer.",[22,32701,32702,32703,97],{},"See the ",[41,32704,32707],{"href":32705,"rel":32706},"https:\u002F\u002Funified.to\u002Fcommerce",[45],"full list of supported integrations",[19,32709],{},[55,32711,32713],{"id":32712},"step-4-generate-a-product-image-from-description-with-genai","Step 4: Generate a Product Image from Description (with GenAI)",[22,32715,32716],{},"You can use Unified GenAI to generate a product image based on the product description.",[2584,32718,32720],{"className":2689,"code":32719,"language":2691,"meta":2433,"style":2433},"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\", \u002F\u002F or whatever the GenAI API expects for image output\n        },\n    });\n\n    return result.choices?.[0]?.message?.content || \"\";\n}\n",[36,32721,32722,32743,32761,32765,32782,32793,32798,32809,32819,32829,32842,32846,32850,32854,32874],{"__ignoreMap":2433},[414,32723,32724,32726,32728,32730,32733,32735,32737,32739,32741],{"class":2593,"line":2594},[414,32725,2956],{"class":2698},[414,32727,2959],{"class":2698},[414,32729,2962],{"class":2698},[414,32731,32732],{"class":2597}," generateProductImage",[414,32734,2968],{"class":2705},[414,32736,27096],{"class":2971},[414,32738,2646],{"class":2698},[414,32740,2977],{"class":2607},[414,32742,3826],{"class":2705},[414,32744,32745,32747,32750,32752,32755,32757,32759],{"class":2593,"line":2434},[414,32746,3986],{"class":2698},[414,32748,32749],{"class":2607}," prompt",[414,32751,2817],{"class":2698},[414,32753,32754],{"class":2601}," `Generate a high-quality product image for the following product description: ${",[414,32756,27096],{"class":2705},[414,32758,3308],{"class":2601},[414,32760,2706],{"class":2705},[414,32762,32763],{"class":2593,"line":2613},[414,32764,2740],{"emptyLinePlaceholder":2459},[414,32766,32767,32769,32771,32773,32775,32777,32780],{"class":2593,"line":2625},[414,32768,3986],{"class":2698},[414,32770,3470],{"class":2607},[414,32772,2817],{"class":2698},[414,32774,3002],{"class":2698},[414,32776,3477],{"class":2705},[414,32778,32779],{"class":2597},"createGenaiPrompt",[414,32781,2826],{"class":2705},[414,32783,32784,32787,32789,32791],{"class":2593,"line":2677},[414,32785,32786],{"class":2705},"        connectionId: ",[414,32788,3490],{"class":2607},[414,32790,2837],{"class":2698},[414,32792,2757],{"class":2705},[414,32794,32795],{"class":2593,"line":2751},[414,32796,32797],{"class":2705},"        prompt: {\n",[414,32799,32800,32803,32806],{"class":2593,"line":2760},[414,32801,32802],{"class":2705},"            messages: [{ role: ",[414,32804,32805],{"class":2601},"\"USER\"",[414,32807,32808],{"class":2705},", content: prompt }],\n",[414,32810,32811,32814,32817],{"class":2593,"line":2768},[414,32812,32813],{"class":2705},"            maxTokens: ",[414,32815,32816],{"class":2607},"1024",[414,32818,2757],{"class":2705},[414,32820,32821,32824,32827],{"class":2593,"line":2776},[414,32822,32823],{"class":2705},"            temperature: ",[414,32825,32826],{"class":2607},"0.7",[414,32828,2757],{"class":2705},[414,32830,32831,32834,32837,32839],{"class":2593,"line":2784},[414,32832,32833],{"class":2705},"            responseFormat: ",[414,32835,32836],{"class":2601},"\"image_url\"",[414,32838,319],{"class":2705},[414,32840,32841],{"class":3527},"\u002F\u002F or whatever the GenAI API expects for image output\n",[414,32843,32844],{"class":2593,"line":2792},[414,32845,3768],{"class":2705},[414,32847,32848],{"class":2593,"line":2804},[414,32849,25779],{"class":2705},[414,32851,32852],{"class":2593,"line":2809},[414,32853,2740],{"emptyLinePlaceholder":2459},[414,32855,32856,32858,32861,32863,32866,32869,32872],{"class":2593,"line":2829},[414,32857,25149],{"class":2698},[414,32859,32860],{"class":2705}," result.choices?.[",[414,32862,3604],{"class":2607},[414,32864,32865],{"class":2705},"]?.message?.content ",[414,32867,32868],{"class":2698},"||",[414,32870,32871],{"class":2601}," \"\"",[414,32873,2706],{"class":2705},[414,32875,32876],{"class":2593,"line":2843},[414,32877,3035],{"class":2705},[22,32879,32880],{},[25,32881,32882],{},"Explanation:",[2354,32884,32885,32888],{},[2357,32886,32887],{},"This function sends the product description to Unified GenAI and gets back an image URL.",[2357,32889,32890],{},"You can use this image URL when creating the product in Shopify (or any other e-commerce platform).",[19,32892],{},[55,32894,32896],{"id":32895},"step-5-create-a-product-with-ai-generated-image","Step 5: Create a Product (with AI-generated Image)",[22,32898,32899],{},"Here's how to create a product in Shopify, using the generated image.",[2584,32901,32903],{"className":2689,"code":32902,"language":2691,"meta":2433,"style":2433},"export async function createProduct(connectionId: string, name: string, description: string, price: number) {\n\n    \u002F\u002F 1. Generate product image\n    const imageUrl = await generateProductImage(description);\n\n    \u002F\u002F 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            \u002F\u002F Add any other fields as needed (e.g., tags, variants, metadata)\n        },\n    });\n\n    return createProductResult; \u002F\u002F commerceItem\n}\n",[36,32904,32905,32951,32955,32960,32976,32980,32985,33004,33008,33013,33018,33023,33028,33043,33052,33057,33061,33065,33069,33079],{"__ignoreMap":2433},[414,32906,32907,32909,32911,32913,32916,32918,32920,32922,32924,32926,32928,32930,32932,32934,32936,32938,32940,32942,32945,32947,32949],{"class":2593,"line":2594},[414,32908,2956],{"class":2698},[414,32910,2959],{"class":2698},[414,32912,2962],{"class":2698},[414,32914,32915],{"class":2597}," createProduct",[414,32917,2968],{"class":2705},[414,32919,2972],{"class":2971},[414,32921,2646],{"class":2698},[414,32923,2977],{"class":2607},[414,32925,319],{"class":2705},[414,32927,9043],{"class":2971},[414,32929,2646],{"class":2698},[414,32931,2977],{"class":2607},[414,32933,319],{"class":2705},[414,32935,27096],{"class":2971},[414,32937,2646],{"class":2698},[414,32939,2977],{"class":2607},[414,32941,319],{"class":2705},[414,32943,32944],{"class":2971},"price",[414,32946,2646],{"class":2698},[414,32948,3679],{"class":2607},[414,32950,3826],{"class":2705},[414,32952,32953],{"class":2593,"line":2434},[414,32954,2740],{"emptyLinePlaceholder":2459},[414,32956,32957],{"class":2593,"line":2613},[414,32958,32959],{"class":3527},"    \u002F\u002F 1. Generate product image\n",[414,32961,32962,32964,32967,32969,32971,32973],{"class":2593,"line":2625},[414,32963,3986],{"class":2698},[414,32965,32966],{"class":2607}," imageUrl",[414,32968,2817],{"class":2698},[414,32970,3002],{"class":2698},[414,32972,32732],{"class":2597},[414,32974,32975],{"class":2705},"(description);\n",[414,32977,32978],{"class":2593,"line":2677},[414,32979,2740],{"emptyLinePlaceholder":2459},[414,32981,32982],{"class":2593,"line":2751},[414,32983,32984],{"class":3527},"    \u002F\u002F 2. Create the product\n",[414,32986,32987,32989,32992,32994,32996,32999,33002],{"class":2593,"line":2760},[414,32988,3986],{"class":2698},[414,32990,32991],{"class":2607}," createProductResult",[414,32993,2817],{"class":2698},[414,32995,3002],{"class":2698},[414,32997,32998],{"class":2705}," sdk.commerce.",[414,33000,33001],{"class":2597},"createCommerceItem",[414,33003,2826],{"class":2705},[414,33005,33006],{"class":2593,"line":2768},[414,33007,26325],{"class":2705},[414,33009,33010],{"class":2593,"line":2776},[414,33011,33012],{"class":2705},"        commerceItem: {\n",[414,33014,33015],{"class":2593,"line":2784},[414,33016,33017],{"class":2705},"            name,\n",[414,33019,33020],{"class":2593,"line":2792},[414,33021,33022],{"class":2705},"            description,\n",[414,33024,33025],{"class":2593,"line":2804},[414,33026,33027],{"class":2705},"            price,\n",[414,33029,33030,33033,33035,33038,33040],{"class":2593,"line":2809},[414,33031,33032],{"class":2705},"            media: imageUrl ",[414,33034,3610],{"class":2698},[414,33036,33037],{"class":2705}," [{ url: imageUrl }] ",[414,33039,2646],{"class":2698},[414,33041,33042],{"class":2705}," [],\n",[414,33044,33045,33048,33050],{"class":2593,"line":2829},[414,33046,33047],{"class":2705},"            isActive: ",[414,33049,3891],{"class":2607},[414,33051,2757],{"class":2705},[414,33053,33054],{"class":2593,"line":2843},[414,33055,33056],{"class":3527},"            \u002F\u002F Add any other fields as needed (e.g., tags, variants, metadata)\n",[414,33058,33059],{"class":2593,"line":2849},[414,33060,3768],{"class":2705},[414,33062,33063],{"class":2593,"line":2854},[414,33064,25779],{"class":2705},[414,33066,33067],{"class":2593,"line":2880},[414,33068,2740],{"emptyLinePlaceholder":2459},[414,33070,33071,33073,33076],{"class":2593,"line":3253},[414,33072,25149],{"class":2698},[414,33074,33075],{"class":2705}," createProductResult; ",[414,33077,33078],{"class":3527},"\u002F\u002F commerceItem\n",[414,33080,33081],{"class":2593,"line":3261},[414,33082,3035],{"class":2705},[22,33084,33085],{},[25,33086,32882],{},[2354,33088,33089,33092],{},[2357,33090,33091],{},"Generates an image from the description.",[2357,33093,33094],{},"Creates a product in Shopify (or any Unified-supported e-commerce platform) with the image and other details.",[19,33096],{},[55,33098,33100],{"id":33099},"step-6-list-products","Step 6: List Products",[22,33102,33103],{},"You can list all products for a customer's e-commerce connection:",[2584,33105,33107],{"className":2689,"code":33106,"language":2691,"meta":2433,"style":2433},"export async function listProducts(connectionId: string) {\n\n    const productsResult = await sdk.commerce.listCommerceItems({\n        connectionId,\n        limit: 10,\n    });\n\n    return productsResult; \u002F\u002F commerceItem[]\n}\n",[36,33108,33109,33130,33134,33152,33156,33165,33169,33173,33183],{"__ignoreMap":2433},[414,33110,33111,33113,33115,33117,33120,33122,33124,33126,33128],{"class":2593,"line":2594},[414,33112,2956],{"class":2698},[414,33114,2959],{"class":2698},[414,33116,2962],{"class":2698},[414,33118,33119],{"class":2597}," listProducts",[414,33121,2968],{"class":2705},[414,33123,2972],{"class":2971},[414,33125,2646],{"class":2698},[414,33127,2977],{"class":2607},[414,33129,3826],{"class":2705},[414,33131,33132],{"class":2593,"line":2434},[414,33133,2740],{"emptyLinePlaceholder":2459},[414,33135,33136,33138,33141,33143,33145,33147,33150],{"class":2593,"line":2613},[414,33137,3986],{"class":2698},[414,33139,33140],{"class":2607}," productsResult",[414,33142,2817],{"class":2698},[414,33144,3002],{"class":2698},[414,33146,32998],{"class":2705},[414,33148,33149],{"class":2597},"listCommerceItems",[414,33151,2826],{"class":2705},[414,33153,33154],{"class":2593,"line":2625},[414,33155,26325],{"class":2705},[414,33157,33158,33161,33163],{"class":2593,"line":2677},[414,33159,33160],{"class":2705},"        limit: ",[414,33162,31591],{"class":2607},[414,33164,2757],{"class":2705},[414,33166,33167],{"class":2593,"line":2751},[414,33168,25779],{"class":2705},[414,33170,33171],{"class":2593,"line":2760},[414,33172,2740],{"emptyLinePlaceholder":2459},[414,33174,33175,33177,33180],{"class":2593,"line":2768},[414,33176,25149],{"class":2698},[414,33178,33179],{"class":2705}," productsResult; ",[414,33181,33182],{"class":3527},"\u002F\u002F commerceItem[]\n",[414,33184,33185],{"class":2593,"line":2776},[414,33186,3035],{"class":2705},[22,33188,33189],{},[25,33190,32882],{},[2354,33192,33193,33196],{},[2357,33194,33195],{},"Fetches the first 10 products for the customer's store.",[2357,33197,33198],{},"You can filter, paginate, or sort as needed.",[19,33200],{},[55,33202,33204],{"id":33203},"step-7-example-usage","Step 7: Example Usage",[22,33206,33207],{},"Here's how you might use these functions in your product workflow:",[2584,33209,33211],{"className":2689,"code":33210,"language":2691,"meta":2433,"style":2433},"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    \u002F\u002F 1. Create the product with an AI-generated image\n    const product = await createProduct(CONNECTION_SHOPIFY!, name, description, price);\n\n    \u002F\u002F 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",[36,33212,33213,33223,33237,33241,33255,33259,33273,33277,33282,33304,33308,33313,33334,33338,33352,33366,33370,33374],{"__ignoreMap":2433},[414,33214,33215,33217,33219,33221],{"class":2593,"line":2594},[414,33216,3928],{"class":2698},[414,33218,2962],{"class":2698},[414,33220,3933],{"class":2597},[414,33222,3936],{"class":2705},[414,33224,33225,33227,33230,33232,33235],{"class":2593,"line":2434},[414,33226,3986],{"class":2698},[414,33228,33229],{"class":2607}," name",[414,33231,2817],{"class":2698},[414,33233,33234],{"class":2601}," \"AI-Generated T-Shirt\"",[414,33236,2706],{"class":2705},[414,33238,33239],{"class":2593,"line":2613},[414,33240,2740],{"emptyLinePlaceholder":2459},[414,33242,33243,33245,33248,33250,33253],{"class":2593,"line":2625},[414,33244,3986],{"class":2698},[414,33246,33247],{"class":2607}," description",[414,33249,2817],{"class":2698},[414,33251,33252],{"class":2601}," \"A stylish t-shirt with a unique, AI-generated design.\"",[414,33254,2706],{"class":2705},[414,33256,33257],{"class":2593,"line":2677},[414,33258,2740],{"emptyLinePlaceholder":2459},[414,33260,33261,33263,33266,33268,33271],{"class":2593,"line":2751},[414,33262,3986],{"class":2698},[414,33264,33265],{"class":2607}," price",[414,33267,2817],{"class":2698},[414,33269,33270],{"class":2607}," 29.99",[414,33272,2706],{"class":2705},[414,33274,33275],{"class":2593,"line":2760},[414,33276,2740],{"emptyLinePlaceholder":2459},[414,33278,33279],{"class":2593,"line":2768},[414,33280,33281],{"class":3527},"    \u002F\u002F 1. Create the product with an AI-generated image\n",[414,33283,33284,33286,33289,33291,33293,33295,33297,33299,33301],{"class":2593,"line":2776},[414,33285,3986],{"class":2698},[414,33287,33288],{"class":2607}," product",[414,33290,2817],{"class":2698},[414,33292,3002],{"class":2698},[414,33294,32915],{"class":2597},[414,33296,2968],{"class":2705},[414,33298,32562],{"class":2607},[414,33300,2837],{"class":2698},[414,33302,33303],{"class":2705},", name, description, price);\n",[414,33305,33306],{"class":2593,"line":2784},[414,33307,2740],{"emptyLinePlaceholder":2459},[414,33309,33310],{"class":2593,"line":2792},[414,33311,33312],{"class":3527},"    \u002F\u002F 2. List products\n",[414,33314,33315,33317,33320,33322,33324,33326,33328,33330,33332],{"class":2593,"line":2804},[414,33316,3986],{"class":2698},[414,33318,33319],{"class":2607}," products",[414,33321,2817],{"class":2698},[414,33323,3002],{"class":2698},[414,33325,33119],{"class":2597},[414,33327,2968],{"class":2705},[414,33329,32562],{"class":2607},[414,33331,2837],{"class":2698},[414,33333,3156],{"class":2705},[414,33335,33336],{"class":2593,"line":2809},[414,33337,2740],{"emptyLinePlaceholder":2459},[414,33339,33340,33342,33344,33346,33349],{"class":2593,"line":2829},[414,33341,28184],{"class":2705},[414,33343,4064],{"class":2597},[414,33345,2968],{"class":2705},[414,33347,33348],{"class":2601},"\"Created product:\"",[414,33350,33351],{"class":2705},", product);\n",[414,33353,33354,33356,33358,33360,33363],{"class":2593,"line":2843},[414,33355,28184],{"class":2705},[414,33357,4064],{"class":2597},[414,33359,2968],{"class":2705},[414,33361,33362],{"class":2601},"\"All products:\"",[414,33364,33365],{"class":2705},", products);\n",[414,33367,33368],{"class":2593,"line":2849},[414,33369,3035],{"class":2705},[414,33371,33372],{"class":2593,"line":2854},[414,33373,2740],{"emptyLinePlaceholder":2459},[414,33375,33376,33378],{"class":2593,"line":2880},[414,33377,4085],{"class":2597},[414,33379,4088],{"class":2705},[19,33381],{},[4156,33383,33384],{},"html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}",{"title":2433,"searchDepth":2434,"depth":2434,"links":33386},[33387,33388,33389,33390,33391,33392,33393,33394],{"id":32484,"depth":2434,"text":32485},{"id":31374,"depth":2434,"text":31375},{"id":31438,"depth":2434,"text":31439},{"id":31524,"depth":2434,"text":31525},{"id":32712,"depth":2434,"text":32713},{"id":32895,"depth":2434,"text":32896},{"id":33099,"depth":2434,"text":33100},{"id":33203,"depth":2434,"text":33204},{"img":33396,"date":33397,"updated":33398,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_build_an_e_commerce_product_integration_with_unified-icon.png","2025-09-08T00:00:00.000Z","2026-05-28T13:29:02.875Z","\u002Fguides\u002Fhow_to_build_an_e_commerce_product_integration_with_unified",{"title":32460,"description":32475},"guides\u002Fhow_to_build_an_e_commerce_product_integration_with_unified","qfl_zO11FzlEv-1kTJzLbvVcKtCdRTL1DAGy3rBCqDo",{"id":33404,"title":33405,"body":33406,"description":34045,"extension":2452,"meta":34046,"navigation":2459,"path":34050,"seo":34051,"stem":34052,"__hash__":34053},"guides\u002Fguides\u002Fhow_to_build_an_invoicing_system_with_unified.md","How to build an invoicing system with Unified.to",{"type":12,"value":33407,"toc":34037},[33408,33411,33413,33418,33425,33427,33435,33440,33449,33451,33454,33462,33464,33468,33471,33477,33482,33492,33598,33603,33613,33633,33638,33643,33658,33762,33767,33770,33781,33791,33796,33799,33809,33953,33957,33968,33994,33996,34005,34008,34035],[15,33409,33405],{"id":33410},"how-to-build-an-invoicing-system-with-unifiedto",[19,33412],{},[22,33414,33415],{},[25,33416,33417],{},"January 3, 2024",[22,33419,33420,33421,33424],{},"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 ",[41,33422,123],{"href":121,"rel":33423},[45],"'s unified accounting API.",[55,33426,2542],{"id":2541},[22,33428,27220,33429,33432,33433,27229],{},[41,33430,27224],{"href":24756,"rel":33431},[45]," article. It will walk you through registering for a free account and onboarding. Once you have completed the onboarding steps, go ahead and ",[22236,33434],{"width":22238,"height":22239,"src":27228,"title":22241,"frameBorder":3604,"allow":22242,"referrerPolicy":23957,"allowFullScreen":2459},[22,33436,33437],{},[4201,33438],{"alt":20627,"src":33439},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_build_an_invoicing_system_with_unified-0.png",[22,33441,33442,33443,33446,33447,27245],{},"The next step is to deploy the ",[41,33444,123],{"href":121,"rel":33445},[45]," Embedded Authorization widget in your product's user interface (UI). Check out our ",[22236,33448],{"width":22238,"height":22239,"src":27244,"title":22241,"frameBorder":3604,"allow":22242,"referrerPolicy":23957,"allowFullScreen":2459},[55,33450,4426],{"id":4425},[22,33452,33453],{},"Here are the steps that you will need to support to build your invoicing app:",[2510,33455,33456,33459],{},[2357,33457,33458],{},"create an invoice",[2357,33460,33461],{},"pay an invoice or cancel an invoice",[22,33463,27261],{},[55,33465,33467],{"id":33466},"step-1-create-an-invoice","Step 1: Create an invoice",[22,33469,33470],{},"To generate an invoice, gather specific details from your end user, including essential information like the amount, line items\u002Fproducts, due date, and customer details.",[22,33472,33473,33476],{},[41,33474,123],{"href":121,"rel":33475},[45]," can help with two of those values: customer and product.",[22,33478,33479],{},[31,33480,33481],{},"Customers",[22,33483,33484,33485,34,33488,97],{},"To get a list of existing customers from your end user's accounting system, simply call the ",[36,33486,33487],{},"listCustomers",[41,33489,27282],{"href":33490,"rel":33491},"https:\u002F\u002Fdocs.unified.to\u002Faccounting\u002Fcustomer\u002FList_all_customers",[45],[2584,33493,33495],{"className":2689,"code":33494,"language":2691,"meta":2433,"style":2433},"import { UnifiedTo } from '@unified-api\u002Ftypescript-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",[36,33496,33497,33509,33513,33527,33531,33539,33543,33547,33551,33572,33586,33590,33594],{"__ignoreMap":2433},[414,33498,33499,33501,33503,33505,33507],{"class":2593,"line":2594},[414,33500,2699],{"class":2698},[414,33502,2713],{"class":2705},[414,33504,2716],{"class":2698},[414,33506,2719],{"class":2601},[414,33508,2706],{"class":2705},[414,33510,33511],{"class":2593,"line":2434},[414,33512,2740],{"emptyLinePlaceholder":2459},[414,33514,33515,33517,33519,33521,33523,33525],{"class":2593,"line":2613},[414,33516,2745],{"class":2698},[414,33518,2814],{"class":2607},[414,33520,2817],{"class":2698},[414,33522,2820],{"class":2698},[414,33524,2823],{"class":2597},[414,33526,2826],{"class":2705},[414,33528,33529],{"class":2593,"line":2625},[414,33530,23194],{"class":2705},[414,33532,33533,33535,33537],{"class":2593,"line":2677},[414,33534,23199],{"class":2705},[414,33536,23202],{"class":2601},[414,33538,2757],{"class":2705},[414,33540,33541],{"class":2593,"line":2751},[414,33542,3548],{"class":2705},[414,33544,33545],{"class":2593,"line":2760},[414,33546,2846],{"class":2705},[414,33548,33549],{"class":2593,"line":2768},[414,33550,2740],{"emptyLinePlaceholder":2459},[414,33552,33553,33555,33557,33559,33562,33564,33566,33568,33570],{"class":2593,"line":2776},[414,33554,2956],{"class":2698},[414,33556,2959],{"class":2698},[414,33558,2962],{"class":2698},[414,33560,33561],{"class":2597}," getCustomers",[414,33563,2968],{"class":2705},[414,33565,2972],{"class":2971},[414,33567,2646],{"class":2698},[414,33569,2977],{"class":2607},[414,33571,3826],{"class":2705},[414,33573,33574,33576,33578,33581,33584],{"class":2593,"line":2784},[414,33575,25149],{"class":2698},[414,33577,3002],{"class":2698},[414,33579,33580],{"class":2705}," sdk.accounting.",[414,33582,33583],{"class":2597},"listAccountingContacts",[414,33585,2826],{"class":2705},[414,33587,33588],{"class":2593,"line":2792},[414,33589,26325],{"class":2705},[414,33591,33592],{"class":2593,"line":2804},[414,33593,25779],{"class":2705},[414,33595,33596],{"class":2593,"line":2809},[414,33597,3035],{"class":2705},[22,33599,33600,33601,27245],{},"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 ",[22236,33602],{"width":22238,"height":22239,"src":27397,"title":22241,"frameBorder":3604,"allow":22242,"referrerPolicy":23957,"allowFullScreen":2459},[22,33604,33605,33606,34,33609,97],{},"If you need to create a new customer, use our ",[36,33607,33608],{},"createCustomer",[41,33610,27282],{"href":33611,"rel":33612},"https:\u002F\u002Fdocs.unified.to\u002Faccounting\u002Fcustomer\u002FCreate_a_customer",[45],[22,33614,2553,33615,33617,33618,33620,33621,319,33624,33627,33628,27422],{},[36,33616,8736],{}," will have specific fields such as ",[36,33619,9043],{}," , ",[36,33622,33623],{},"emails",[36,33625,33626],{},"billing_address",", and tax information that will be relevant to your software.  See our ",[41,33629,33632],{"href":33630,"rel":33631},"https:\u002F\u002Fdocs.unified.to\u002Faccounting\u002Fcustomer\u002Fmodel",[45],"API Documentation page",[22,33634,33635],{},[4201,33636],{"alt":20627,"src":33637},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_build_an_invoicing_system_with_unified-1.png",[22,33639,33640],{},[31,33641,33642],{},"Products",[22,33644,33645,33646,33649,33650,33653,33654,97],{},"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 ",[36,33647,33648],{},"listItems"," API endpoint. We call a product, an ",[36,33651,33652],{},"Item",", and you can find the full data-model on our ",[41,33655,33632],{"href":33656,"rel":33657},"https:\u002F\u002Fdocs.unified.to\u002Faccounting\u002Fitem\u002Fmodel",[45],[2584,33659,33661],{"className":2689,"code":33660,"language":2691,"meta":2433,"style":2433},"import { UnifiedTo } from '@unified-api\u002Ftypescript-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",[36,33662,33663,33675,33679,33693,33697,33705,33709,33713,33717,33738,33750,33754,33758],{"__ignoreMap":2433},[414,33664,33665,33667,33669,33671,33673],{"class":2593,"line":2594},[414,33666,2699],{"class":2698},[414,33668,2713],{"class":2705},[414,33670,2716],{"class":2698},[414,33672,2719],{"class":2601},[414,33674,2706],{"class":2705},[414,33676,33677],{"class":2593,"line":2434},[414,33678,2740],{"emptyLinePlaceholder":2459},[414,33680,33681,33683,33685,33687,33689,33691],{"class":2593,"line":2613},[414,33682,2745],{"class":2698},[414,33684,2814],{"class":2607},[414,33686,2817],{"class":2698},[414,33688,2820],{"class":2698},[414,33690,2823],{"class":2597},[414,33692,2826],{"class":2705},[414,33694,33695],{"class":2593,"line":2625},[414,33696,23194],{"class":2705},[414,33698,33699,33701,33703],{"class":2593,"line":2677},[414,33700,23199],{"class":2705},[414,33702,23202],{"class":2601},[414,33704,2757],{"class":2705},[414,33706,33707],{"class":2593,"line":2751},[414,33708,3548],{"class":2705},[414,33710,33711],{"class":2593,"line":2760},[414,33712,2846],{"class":2705},[414,33714,33715],{"class":2593,"line":2768},[414,33716,2740],{"emptyLinePlaceholder":2459},[414,33718,33719,33721,33723,33725,33728,33730,33732,33734,33736],{"class":2593,"line":2776},[414,33720,2956],{"class":2698},[414,33722,2959],{"class":2698},[414,33724,2962],{"class":2698},[414,33726,33727],{"class":2597}," getItems",[414,33729,2968],{"class":2705},[414,33731,2972],{"class":2971},[414,33733,2646],{"class":2698},[414,33735,2977],{"class":2607},[414,33737,3826],{"class":2705},[414,33739,33740,33742,33744,33746,33748],{"class":2593,"line":2784},[414,33741,25149],{"class":2698},[414,33743,3002],{"class":2698},[414,33745,32998],{"class":2705},[414,33747,33149],{"class":2597},[414,33749,2826],{"class":2705},[414,33751,33752],{"class":2593,"line":2792},[414,33753,26325],{"class":2705},[414,33755,33756],{"class":2593,"line":2804},[414,33757,25779],{"class":2705},[414,33759,33760],{"class":2593,"line":2809},[414,33761,3035],{"class":2705},[22,33763,33764],{},[31,33765,33766],{},"Chart of accounts & tax rates",[22,33768,33769],{},"Each line item in an invoice will be associated with a customer, item, account and tax rate in your end user's accounting application.",[22,33771,33772,33773,34,33776,33780],{},"You can get a list of accounts by calling our ",[36,33774,33775],{},"listAccounts",[41,33777,27282],{"href":33778,"rel":33779},"https:\u002F\u002Fdocs.unified.to\u002Faccounting\u002Faccount\u002FList_all_accounts",[45]," which returns a list from their 'Chart of Accounts'.",[22,33782,33783,33784,34,33787,97],{},"You can also get a list of tax rates by calling our ",[36,33785,33786],{},"listTaxrates",[41,33788,27282],{"href":33789,"rel":33790},"https:\u002F\u002Fdocs.unified.to\u002Faccounting\u002Ftaxrate\u002FList_all_taxrates",[45],[22,33792,33793],{},[31,33794,33795],{},"Invoices",[22,33797,33798],{},"Once the end user has created an invoice, you will want to send that invoice into their accounting system as well.",[22,33800,33801,33802,34,33805,97],{},"This is easily accomplished by using the ",[36,33803,33804],{},"createInvoice",[41,33806,27282],{"href":33807,"rel":33808},"https:\u002F\u002Fdocs.unified.to\u002Faccounting\u002Finvoice\u002FCreate_a_invoice",[45],[2584,33810,33812],{"className":2689,"code":33811,"language":2691,"meta":2433,"style":2433},"import { UnifiedTo } from '@unified-api\u002Ftypescript-sdk';\nimport { AccountingInvoice } from '@unified-api\u002Ftypescript-sdk\u002Fdist\u002Fsdk\u002Fmodels\u002Fshared';\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",[36,33813,33814,33826,33839,33843,33857,33861,33869,33873,33877,33881,33912,33929,33934,33938,33942,33949],{"__ignoreMap":2433},[414,33815,33816,33818,33820,33822,33824],{"class":2593,"line":2594},[414,33817,2699],{"class":2698},[414,33819,2713],{"class":2705},[414,33821,2716],{"class":2698},[414,33823,2719],{"class":2601},[414,33825,2706],{"class":2705},[414,33827,33828,33830,33833,33835,33837],{"class":2593,"line":2434},[414,33829,2699],{"class":2698},[414,33831,33832],{"class":2705}," { AccountingInvoice } ",[414,33834,2716],{"class":2698},[414,33836,27496],{"class":2601},[414,33838,2706],{"class":2705},[414,33840,33841],{"class":2593,"line":2613},[414,33842,2740],{"emptyLinePlaceholder":2459},[414,33844,33845,33847,33849,33851,33853,33855],{"class":2593,"line":2625},[414,33846,2745],{"class":2698},[414,33848,2814],{"class":2607},[414,33850,2817],{"class":2698},[414,33852,2820],{"class":2698},[414,33854,2823],{"class":2597},[414,33856,2826],{"class":2705},[414,33858,33859],{"class":2593,"line":2677},[414,33860,23194],{"class":2705},[414,33862,33863,33865,33867],{"class":2593,"line":2751},[414,33864,23199],{"class":2705},[414,33866,23202],{"class":2601},[414,33868,2757],{"class":2705},[414,33870,33871],{"class":2593,"line":2760},[414,33872,3548],{"class":2705},[414,33874,33875],{"class":2593,"line":2768},[414,33876,2846],{"class":2705},[414,33878,33879],{"class":2593,"line":2776},[414,33880,2740],{"emptyLinePlaceholder":2459},[414,33882,33883,33885,33887,33889,33892,33894,33896,33898,33900,33902,33905,33907,33910],{"class":2593,"line":2784},[414,33884,2956],{"class":2698},[414,33886,2959],{"class":2698},[414,33888,2962],{"class":2698},[414,33890,33891],{"class":2597}," createInvoice",[414,33893,2968],{"class":2705},[414,33895,2972],{"class":2971},[414,33897,2646],{"class":2698},[414,33899,2977],{"class":2607},[414,33901,319],{"class":2705},[414,33903,33904],{"class":2971},"invoice",[414,33906,2646],{"class":2698},[414,33908,33909],{"class":2597}," AccountingInvoice",[414,33911,3826],{"class":2705},[414,33913,33914,33916,33918,33920,33922,33924,33927],{"class":2593,"line":2792},[414,33915,3986],{"class":2698},[414,33917,3470],{"class":2607},[414,33919,2817],{"class":2698},[414,33921,3002],{"class":2698},[414,33923,33580],{"class":2705},[414,33925,33926],{"class":2597},"createAccountingInvoice",[414,33928,2826],{"class":2705},[414,33930,33931],{"class":2593,"line":2804},[414,33932,33933],{"class":2705},"        accountingInvoice: invoice,\n",[414,33935,33936],{"class":2593,"line":2809},[414,33937,26325],{"class":2705},[414,33939,33940],{"class":2593,"line":2829},[414,33941,25779],{"class":2705},[414,33943,33944,33946],{"class":2593,"line":2843},[414,33945,25149],{"class":2698},[414,33947,33948],{"class":2705}," result.accountingInvoice?.id;\n",[414,33950,33951],{"class":2593,"line":2849},[414,33952,3035],{"class":2705},[55,33954,33956],{"id":33955},"step-2-paying-invoices","Step 2: Paying invoices",[22,33958,33959,33960,34,33963,33967],{},"Once that invoice is paid, you will need to communicate this to the accounting application. This is accomplished by using the ",[36,33961,33962],{},"createPayment",[41,33964,27282],{"href":33965,"rel":33966},"https:\u002F\u002Fdocs.unified.to\u002Faccounting\u002Fpayment\u002FCreate_a_payment",[45]," which associates a payment with an invoice.",[22,33969,33970,33971,33974,33975,33978,33979,33982,33983,33985,33986,33991,33992,2431],{},"At a minimum, a ",[36,33972,33973],{},"Payment"," will need an ",[36,33976,33977],{},"invoice_id"," , a ",[36,33980,33981],{},"customer_id"," and an ",[36,33984,31646],{},".  Some integrations may require additional values to be present, so check that ",[41,33987,33990],{"href":33988,"rel":33989},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fquickbooks?tab=support",[45],"integration's feature support page",".  For example, Quickbooks also requires a ",[36,33993,308],{},[55,33995,31252],{"id":31251},[22,33997,33998,33999,34004],{},"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 ",[41,34000,34003],{"href":34001,"rel":34002},"https:\u002F\u002Funified.to\u002Faccounting",[45],"Unified Accounting API"," you can add accounting integrations to your product and support your invoicing use case within days.",[55,34006,34007],{"id":27783},"Additional Resources",[2354,34009,34010,34015,34022,34027,34031],{},[2357,34011,34012],{},[41,34013,34003],{"href":34001,"rel":34014},[45],[2357,34016,34017],{},[41,34018,34021],{"href":34019,"rel":34020},"https:\u002F\u002Fdocs.unified.to\u002Faccounting\u002Foverview",[45],"API Documentation for the Unified Accounting API",[2357,34023,34024],{},[41,34025,27806],{"href":27804,"rel":34026},[45],[2357,34028,34029],{},[22236,34030],{"width":22238,"height":22239,"src":27244,"title":22241,"frameBorder":3604,"allow":22242,"referrerPolicy":23957,"allowFullScreen":2459},[2357,34032,34033],{},[22236,34034],{"width":22238,"height":22239,"src":27397,"title":22241,"frameBorder":3604,"allow":22242,"referrerPolicy":23957,"allowFullScreen":2459},[4156,34036,27817],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":34038},[34039,34040,34041,34042,34043,34044],{"id":2541,"depth":2434,"text":2542},{"id":4425,"depth":2434,"text":4426},{"id":33466,"depth":2434,"text":33467},{"id":33955,"depth":2434,"text":33956},{"id":31251,"depth":2434,"text":31252},{"id":27783,"depth":2434,"text":34007},"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...",{"img":34047,"date":34048,"updated":34049,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_build_an_invoicing_system_with_unified-icon.png","2024-01-03T00:00:00.000Z","2026-05-28T13:34:26.016Z","\u002Fguides\u002Fhow_to_build_an_invoicing_system_with_unified",{"title":33405,"description":34045},"guides\u002Fhow_to_build_an_invoicing_system_with_unified","UVCWOH3d3mJNgRbCf3GvGkAmW6-7L7JvvUYCPR9h9gk",{"id":34055,"title":34056,"body":34057,"description":36163,"extension":2452,"meta":36164,"navigation":2459,"path":36169,"seo":36170,"stem":36171,"__hash__":36172},"guides\u002Fguides\u002Fhow_to_build_enterprise_search_using_rag.md","How to build Enterprise Search using RAG",{"type":12,"value":34058,"toc":36149},[34059,34062,34064,34069,34076,34084,34087,34107,34111,34128,34134,34188,34193,34216,34220,34309,34315,34318,34597,34603,34606,34897,34903,34906,34974,34980,34992,34996,34999,35037,35040,35043,35075,35078,35217,35223,35226,35232,35235,35238,35492,35498,35501,35504,35522,35525,36068,36074,36139,36146],[15,34060,34056],{"id":34061},"how-to-build-enterprise-search-using-rag",[19,34063],{},[22,34065,34066],{},[25,34067,34068],{},"November 19, 2025",[22,34070,34071,34072,34075],{},"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 ",[41,34073,123],{"href":121,"rel":34074},[45],"'s integrations and OpenAI embedding models.",[22,34077,34078,34083],{},[41,34079,34082],{"href":34080,"rel":34081},"https:\u002F\u002Fdeveloper.nvidia.com\u002Fblog\u002Frag-101-demystifying-retrieval-augmented-generation-pipelines\u002F",[45],"RAG"," or Retrieval-Augmented-Generation is an approach for indexing a large amount of information so 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.",[22236,34085],{"width":22238,"height":22239,"src":34086,"title":22241,"frameBorder":3604,"allow":22242,"referrerPolicy":23957,"allowFullScreen":2459},"https:\u002F\u002Fwww.youtube.com\u002Fembed\u002FyymVcO6T6Vs",[22,34088,34089,34090,34095,34096,34100,34101,34106],{},"We will be using a few of Unified.to's integrations to access internal company knowledge in ",[41,34091,34094],{"href":34092,"rel":34093},"https:\u002F\u002Funified.to\u002Fstorage",[45],"file storage"," (eg. Google Drive) and ",[41,34097,34099],{"href":27940,"rel":34098},[45],"knowledge management systems"," (eg. Notion), embed their content using ",[41,34102,34105],{"href":34103,"rel":34104},"https:\u002F\u002Funified.to\u002Fgenai",[45],"OpenAI's models",", and then store them in a vector DB and used to answer questions.",[55,34108,34109],{"id":2541},[31,34110,2542],{},[2354,34112,34113,34116,34119,34122,34125],{},[2357,34114,34115],{},"Node.js 19+",[2357,34117,34118],{},"Unified account with integrations enabled for Google Drive and Notion",[2357,34120,34121],{},"Unified.to API key and GenAI Connection ID",[2357,34123,34124],{},"OpenAI API key (As we are using OpenAI for embedding)",[2357,34126,34127],{},"A vector DB (eg. Pinecone, or Chroma. For the demo we are using a in memory vector store)",[55,34129,34131],{"id":34130},"step-1-setting-your-project-up",[31,34132,34133],{},"Step 1: Setting your project up",[2584,34135,34137],{"className":2689,"code":34136,"language":2691,"meta":2433,"style":2433},"mkdir rag-bot\ncd rag-bot\nnpm init -y\nnpm install dotenv @unified-api\u002Ftypescript-sdk\n",[36,34138,34139,34150,34159,34169],{"__ignoreMap":2433},[414,34140,34141,34144,34147],{"class":2593,"line":2594},[414,34142,34143],{"class":2705},"mkdir rag",[414,34145,34146],{"class":2698},"-",[414,34148,34149],{"class":2705},"bot\n",[414,34151,34152,34155,34157],{"class":2593,"line":2434},[414,34153,34154],{"class":2705},"cd rag",[414,34156,34146],{"class":2698},[414,34158,34149],{"class":2705},[414,34160,34161,34164,34166],{"class":2593,"line":2613},[414,34162,34163],{"class":2705},"npm init ",[414,34165,34146],{"class":2698},[414,34167,34168],{"class":2705},"y\n",[414,34170,34171,34174,34176,34179,34181,34183,34185],{"class":2593,"line":2625},[414,34172,34173],{"class":2705},"npm install dotenv @unified",[414,34175,34146],{"class":2698},[414,34177,34178],{"class":2705},"api",[414,34180,23303],{"class":2698},[414,34182,2691],{"class":2705},[414,34184,34146],{"class":2698},[414,34186,34187],{"class":2705},"sdk\n",[22,34189,34190,34191,2646],{},"Add your credentials and keys to the ",[36,34192,2645],{},[2584,34194,34196],{"className":2649,"code":34195,"language":2651,"meta":2652,"style":2433},"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",[36,34197,34198,34202,34207,34212],{"__ignoreMap":2433},[414,34199,34200],{"class":2593,"line":2594},[414,34201,2659],{},[414,34203,34204],{"class":2593,"line":2434},[414,34205,34206],{},"CONNECTION_GOOGLEDRIVE=your_gdrive_connection_id\n",[414,34208,34209],{"class":2593,"line":2613},[414,34210,34211],{},"CONNECTION_NOTION=your_notion_connection_id\n",[414,34213,34214],{"class":2593,"line":2625},[414,34215,2669],{},[55,34217,34218],{"id":31438},[31,34219,31439],{},[2584,34221,34223],{"className":2689,"code":34222,"language":2691,"meta":2433,"style":2433},"import 'dotenv\u002Fconfig';\nimport { UnifiedTo } from '@unified-api\u002Ftypescript-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",[36,34224,34225,34233,34245,34249,34277,34281,34295,34305],{"__ignoreMap":2433},[414,34226,34227,34229,34231],{"class":2593,"line":2594},[414,34228,2699],{"class":2698},[414,34230,2702],{"class":2601},[414,34232,2706],{"class":2705},[414,34234,34235,34237,34239,34241,34243],{"class":2593,"line":2434},[414,34236,2699],{"class":2698},[414,34238,2713],{"class":2705},[414,34240,2716],{"class":2698},[414,34242,2719],{"class":2601},[414,34244,2706],{"class":2705},[414,34246,34247],{"class":2593,"line":2613},[414,34248,2740],{"emptyLinePlaceholder":2459},[414,34250,34251,34253,34255,34257,34259,34262,34264,34267,34269,34271,34273,34275],{"class":2593,"line":2625},[414,34252,2745],{"class":2698},[414,34254,26738],{"class":2705},[414,34256,2560],{"class":2607},[414,34258,319],{"class":2705},[414,34260,34261],{"class":2607},"CONNECTION_GOOGLEDRIVE",[414,34263,319],{"class":2705},[414,34265,34266],{"class":2607},"CONNECTION_NOTION",[414,34268,319],{"class":2705},[414,34270,3490],{"class":2607},[414,34272,29638],{"class":2705},[414,34274,2798],{"class":2698},[414,34276,2801],{"class":2705},[414,34278,34279],{"class":2593,"line":2677},[414,34280,2740],{"emptyLinePlaceholder":2459},[414,34282,34283,34285,34287,34289,34291,34293],{"class":2593,"line":2751},[414,34284,2745],{"class":2698},[414,34286,2814],{"class":2607},[414,34288,2817],{"class":2698},[414,34290,2820],{"class":2698},[414,34292,2823],{"class":2597},[414,34294,2826],{"class":2705},[414,34296,34297,34299,34301,34303],{"class":2593,"line":2760},[414,34298,2832],{"class":2705},[414,34300,2560],{"class":2607},[414,34302,2837],{"class":2698},[414,34304,2840],{"class":2705},[414,34306,34307],{"class":2593,"line":2768},[414,34308,2846],{"class":2705},[55,34310,34312],{"id":34311},"step-3-fetch-all-the-files-from-google-drive",[31,34313,34314],{},"Step 3: Fetch all the files from Google Drive",[22,34316,34317],{},"We will now use Unified's storage API to retrieve files from a Google Drive.",[2584,34319,34321],{"className":2689,"code":34320,"language":2691,"meta":2433,"style":2433},"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",[36,34322,34323,34342,34359,34371,34383,34397,34404,34423,34427,34431,34435,34440,34459,34481,34490,34494,34498,34506,34510,34514,34533,34537,34549,34553,34582,34586,34593],{"__ignoreMap":2433},[414,34324,34325,34327,34329,34332,34334,34336,34338,34340],{"class":2593,"line":2594},[414,34326,3928],{"class":2698},[414,34328,2962],{"class":2698},[414,34330,34331],{"class":2597}," getAllGoogleDriveFiles",[414,34333,2968],{"class":2705},[414,34335,2972],{"class":2971},[414,34337,2646],{"class":2698},[414,34339,2977],{"class":2607},[414,34341,3826],{"class":2705},[414,34343,34344,34346,34349,34351,34353,34355,34357],{"class":2593,"line":2434},[414,34345,3071],{"class":2698},[414,34347,34348],{"class":2607}," files",[414,34350,2646],{"class":2698},[414,34352,3104],{"class":2607},[414,34354,24922],{"class":2705},[414,34356,2798],{"class":2698},[414,34358,24927],{"class":2705},[414,34360,34361,34363,34365,34367,34369],{"class":2593,"line":2613},[414,34362,24946],{"class":2698},[414,34364,24949],{"class":2705},[414,34366,2798],{"class":2698},[414,34368,24954],{"class":2607},[414,34370,2706],{"class":2705},[414,34372,34373,34375,34377,34379,34381],{"class":2593,"line":2625},[414,34374,3986],{"class":2698},[414,34376,24934],{"class":2607},[414,34378,2817],{"class":2698},[414,34380,24939],{"class":2607},[414,34382,2706],{"class":2705},[414,34384,34385,34387,34390,34392,34395],{"class":2593,"line":2677},[414,34386,24946],{"class":2698},[414,34388,34389],{"class":2705}," hasMore ",[414,34391,2798],{"class":2698},[414,34393,34394],{"class":2607}," true",[414,34396,2706],{"class":2705},[414,34398,34399,34401],{"class":2593,"line":2751},[414,34400,24965],{"class":2698},[414,34402,34403],{"class":2705}," (hasMore) {\n",[414,34405,34406,34409,34411,34413,34415,34418,34421],{"class":2593,"line":2760},[414,34407,34408],{"class":2698},"          const",[414,34410,28445],{"class":2607},[414,34412,2817],{"class":2698},[414,34414,3002],{"class":2698},[414,34416,34417],{"class":2705}," sdk.storage.",[414,34419,34420],{"class":2597},"listStorageFiles",[414,34422,2826],{"class":2705},[414,34424,34425],{"class":2593,"line":2768},[414,34426,25023],{"class":2705},[414,34428,34429],{"class":2593,"line":2776},[414,34430,25013],{"class":2705},[414,34432,34433],{"class":2593,"line":2784},[414,34434,25018],{"class":2705},[414,34436,34437],{"class":2593,"line":2792},[414,34438,34439],{"class":2705},"          });\n",[414,34441,34442,34445,34447,34449,34451,34454,34456],{"class":2593,"line":2804},[414,34443,34444],{"class":2705},"            pages.",[414,34446,25040],{"class":2597},[414,34448,2968],{"class":2705},[414,34450,25045],{"class":2698},[414,34452,34453],{"class":2705},"(response.files ",[414,34455,32868],{"class":2698},[414,34457,34458],{"class":2705}," []));\n",[414,34460,34461,34464,34466,34469,34471,34473,34475,34477,34479],{"class":2593,"line":2809},[414,34462,34463],{"class":2705},"          hasMore ",[414,34465,2798],{"class":2698},[414,34467,34468],{"class":2705}," (response.files?.",[414,34470,25098],{"class":2607},[414,34472,26046],{"class":2698},[414,34474,24954],{"class":2607},[414,34476,3107],{"class":2705},[414,34478,25066],{"class":2698},[414,34480,25115],{"class":2705},[414,34482,34483,34486,34488],{"class":2593,"line":2829},[414,34484,34485],{"class":2705},"          offset ",[414,34487,25112],{"class":2698},[414,34489,25115],{"class":2705},[414,34491,34492],{"class":2593,"line":2843},[414,34493,10641],{"class":2705},[414,34495,34496],{"class":2593,"line":2849},[414,34497,2740],{"emptyLinePlaceholder":2459},[414,34499,34500,34503],{"class":2593,"line":2854},[414,34501,34502],{"class":2698},"      return",[414,34504,34505],{"class":2705}," files;\n",[414,34507,34508],{"class":2593,"line":2880},[414,34509,10535],{"class":2705},[414,34511,34512],{"class":2593,"line":3253},[414,34513,2740],{"emptyLinePlaceholder":2459},[414,34515,34516,34518,34521,34523,34525,34527,34530],{"class":2593,"line":3261},[414,34517,3986],{"class":2698},[414,34519,34520],{"class":2607}," file",[414,34522,2817],{"class":2698},[414,34524,3002],{"class":2698},[414,34526,34417],{"class":2705},[414,34528,34529],{"class":2597},"getStorageFile",[414,34531,34532],{"class":2705},"({ connectionId, id: fileId });\n",[414,34534,34535],{"class":2593,"line":3279},[414,34536,2740],{"emptyLinePlaceholder":2459},[414,34538,34539,34541,34544,34546],{"class":2593,"line":3313},[414,34540,3986],{"class":2698},[414,34542,34543],{"class":2607}," downloadUrl",[414,34545,2817],{"class":2698},[414,34547,34548],{"class":2705}," file.download_url;\n",[414,34550,34551],{"class":2593,"line":3326},[414,34552,2740],{"emptyLinePlaceholder":2459},[414,34554,34555,34557,34559,34561,34563,34565,34568,34570,34572,34574,34576,34578,34580],{"class":2593,"line":3339},[414,34556,3986],{"class":2698},[414,34558,28740],{"class":2607},[414,34560,2817],{"class":2698},[414,34562,3002],{"class":2698},[414,34564,28452],{"class":2597},[414,34566,34567],{"class":2705},"(downloadUrl).",[414,34569,29034],{"class":2597},[414,34571,2968],{"class":2705},[414,34573,24312],{"class":2971},[414,34575,29041],{"class":2698},[414,34577,29044],{"class":2705},[414,34579,2652],{"class":2597},[414,34581,24372],{"class":2705},[414,34583,34584],{"class":2593,"line":3359},[414,34585,2740],{"emptyLinePlaceholder":2459},[414,34587,34588,34590],{"class":2593,"line":6453},[414,34589,25149],{"class":2698},[414,34591,34592],{"class":2705}," content;\n",[414,34594,34595],{"class":2593,"line":6459},[414,34596,3035],{"class":2705},[55,34598,34600],{"id":34599},"step-4-fetch-notion-pages",[31,34601,34602],{},"Step 4: Fetch Notion Pages",[22,34604,34605],{},"Now that we have the data from Google Drive, we will use Unified's connection to Notion to fetch data from Notion as well.",[2584,34607,34609],{"className":2689,"code":34608,"language":2691,"meta":2433,"style":2433},"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",[36,34610,34611,34630,34646,34658,34670,34682,34688,34704,34708,34713,34718,34722,34739,34760,34769,34773,34777,34784,34788,34792,34820,34838,34842,34847,34851,34855,34886,34893],{"__ignoreMap":2433},[414,34612,34613,34615,34617,34620,34622,34624,34626,34628],{"class":2593,"line":2594},[414,34614,3928],{"class":2698},[414,34616,2962],{"class":2698},[414,34618,34619],{"class":2597}," getAllNotionPages",[414,34621,2968],{"class":2705},[414,34623,2972],{"class":2971},[414,34625,2646],{"class":2698},[414,34627,2977],{"class":2607},[414,34629,3826],{"class":2705},[414,34631,34632,34634,34636,34638,34640,34642,34644],{"class":2593,"line":2434},[414,34633,3071],{"class":2698},[414,34635,28365],{"class":2607},[414,34637,2646],{"class":2698},[414,34639,3104],{"class":2607},[414,34641,24922],{"class":2705},[414,34643,2798],{"class":2698},[414,34645,24927],{"class":2705},[414,34647,34648,34650,34652,34654,34656],{"class":2593,"line":2613},[414,34649,24946],{"class":2698},[414,34651,24949],{"class":2705},[414,34653,2798],{"class":2698},[414,34655,24954],{"class":2607},[414,34657,2706],{"class":2705},[414,34659,34660,34662,34664,34666,34668],{"class":2593,"line":2625},[414,34661,3986],{"class":2698},[414,34663,24934],{"class":2607},[414,34665,2817],{"class":2698},[414,34667,24939],{"class":2607},[414,34669,2706],{"class":2705},[414,34671,34672,34674,34676,34678,34680],{"class":2593,"line":2677},[414,34673,24946],{"class":2698},[414,34675,34389],{"class":2705},[414,34677,2798],{"class":2698},[414,34679,34394],{"class":2607},[414,34681,2706],{"class":2705},[414,34683,34684,34686],{"class":2593,"line":2751},[414,34685,24965],{"class":2698},[414,34687,34403],{"class":2705},[414,34689,34690,34692,34694,34696,34698,34700,34702],{"class":2593,"line":2760},[414,34691,30867],{"class":2698},[414,34693,28445],{"class":2607},[414,34695,2817],{"class":2698},[414,34697,3002],{"class":2698},[414,34699,34417],{"class":2705},[414,34701,34420],{"class":2597},[414,34703,2826],{"class":2705},[414,34705,34706],{"class":2593,"line":2768},[414,34707,26325],{"class":2705},[414,34709,34710],{"class":2593,"line":2776},[414,34711,34712],{"class":2705},"        offset,\n",[414,34714,34715],{"class":2593,"line":2784},[414,34716,34717],{"class":2705},"        limit,\n",[414,34719,34720],{"class":2593,"line":2792},[414,34721,30901],{"class":2705},[414,34723,34724,34727,34729,34731,34733,34735,34737],{"class":2593,"line":2804},[414,34725,34726],{"class":2705},"      files.",[414,34728,25040],{"class":2597},[414,34730,2968],{"class":2705},[414,34732,25045],{"class":2698},[414,34734,34453],{"class":2705},[414,34736,32868],{"class":2698},[414,34738,34458],{"class":2705},[414,34740,34741,34744,34746,34748,34750,34752,34754,34756,34758],{"class":2593,"line":2809},[414,34742,34743],{"class":2705},"      hasMore ",[414,34745,2798],{"class":2698},[414,34747,34468],{"class":2705},[414,34749,25098],{"class":2607},[414,34751,26046],{"class":2698},[414,34753,24954],{"class":2607},[414,34755,3107],{"class":2705},[414,34757,25066],{"class":2698},[414,34759,25115],{"class":2705},[414,34761,34762,34765,34767],{"class":2593,"line":2829},[414,34763,34764],{"class":2705},"      offset ",[414,34766,25112],{"class":2698},[414,34768,25115],{"class":2705},[414,34770,34771],{"class":2593,"line":2843},[414,34772,10535],{"class":2705},[414,34774,34775],{"class":2593,"line":2849},[414,34776,2740],{"emptyLinePlaceholder":2459},[414,34778,34779,34781],{"class":2593,"line":2854},[414,34780,2999],{"class":2698},[414,34782,34783],{"class":2705}," pages;\n",[414,34785,34786],{"class":2593,"line":2880},[414,34787,3035],{"class":2705},[414,34789,34790],{"class":2593,"line":3253},[414,34791,2740],{"emptyLinePlaceholder":2459},[414,34793,34794,34796,34798,34801,34803,34805,34807,34809,34811,34814,34816,34818],{"class":2593,"line":3261},[414,34795,3928],{"class":2698},[414,34797,2962],{"class":2698},[414,34799,34800],{"class":2597}," getNotionPageContent",[414,34802,2968],{"class":2705},[414,34804,2972],{"class":2971},[414,34806,2646],{"class":2698},[414,34808,2977],{"class":2607},[414,34810,319],{"class":2705},[414,34812,34813],{"class":2971},"pageId",[414,34815,2646],{"class":2698},[414,34817,2977],{"class":2607},[414,34819,3826],{"class":2705},[414,34821,34822,34824,34826,34828,34830,34833,34836],{"class":2593,"line":3279},[414,34823,3071],{"class":2698},[414,34825,16437],{"class":2607},[414,34827,2817],{"class":2698},[414,34829,3002],{"class":2698},[414,34831,34832],{"class":2705}," sdk.kms.",[414,34834,34835],{"class":2597},"getKmsPage",[414,34837,2826],{"class":2705},[414,34839,34840],{"class":2593,"line":3313},[414,34841,3015],{"class":2705},[414,34843,34844],{"class":2593,"line":3326},[414,34845,34846],{"class":2705},"    id: pageId,\n",[414,34848,34849],{"class":2593,"line":3339},[414,34850,3030],{"class":2705},[414,34852,34853],{"class":2593,"line":3359},[414,34854,2740],{"emptyLinePlaceholder":2459},[414,34856,34857,34860,34862,34864,34866,34868,34870,34872,34874,34877,34879,34882,34884],{"class":2593,"line":6453},[414,34858,34859],{"class":2698}," const",[414,34861,28740],{"class":2607},[414,34863,2817],{"class":2698},[414,34865,3002],{"class":2698},[414,34867,28452],{"class":2597},[414,34869,29031],{"class":2705},[414,34871,29034],{"class":2597},[414,34873,2968],{"class":2705},[414,34875,34876],{"class":2971},"r",[414,34878,29041],{"class":2698},[414,34880,34881],{"class":2705}," r.",[414,34883,2652],{"class":2597},[414,34885,24372],{"class":2705},[414,34887,34888,34891],{"class":2593,"line":6459},[414,34889,34890],{"class":2698}," return",[414,34892,34592],{"class":2705},[414,34894,34895],{"class":2593,"line":6465},[414,34896,3035],{"class":2705},[55,34898,34900],{"id":34899},"step-5-building-the-vector-db",[31,34901,34902],{},"Step 5: Building the vector DB",[22,34904,34905],{},"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.",[2584,34907,34909],{"className":2689,"code":34908,"language":2691,"meta":2433,"style":2433},"type Document = { id: string; source: string; content: string; embedding?: number[] };\nconst vectorDB: Document[] = [];\n",[36,34910,34911,34957],{"__ignoreMap":2433},[414,34912,34913,34915,34918,34920,34922,34924,34926,34928,34930,34933,34935,34937,34939,34941,34943,34945,34947,34950,34952,34954],{"class":2593,"line":2594},[414,34914,3397],{"class":2698},[414,34916,34917],{"class":2597}," Document",[414,34919,2817],{"class":2698},[414,34921,26738],{"class":2705},[414,34923,5072],{"class":2971},[414,34925,2646],{"class":2698},[414,34927,2977],{"class":2607},[414,34929,3394],{"class":2705},[414,34931,34932],{"class":2971},"source",[414,34934,2646],{"class":2698},[414,34936,2977],{"class":2607},[414,34938,3394],{"class":2705},[414,34940,3377],{"class":2971},[414,34942,2646],{"class":2698},[414,34944,2977],{"class":2607},[414,34946,3394],{"class":2705},[414,34948,34949],{"class":2971},"embedding",[414,34951,16892],{"class":2698},[414,34953,3679],{"class":2607},[414,34955,34956],{"class":2705},"[] };\n",[414,34958,34959,34961,34964,34966,34968,34970,34972],{"class":2593,"line":2434},[414,34960,2745],{"class":2698},[414,34962,34963],{"class":2607}," vectorDB",[414,34965,2646],{"class":2698},[414,34967,34917],{"class":2597},[414,34969,24922],{"class":2705},[414,34971,2798],{"class":2698},[414,34973,24927],{"class":2705},[55,34975,34977],{"id":34976},"step-6-embedding-the-documents",[31,34978,34979],{},"Step 6: Embedding the documents",[22,34981,34982,34983,34986,34987,34991],{},"For the purpose of the example, we will be using OpenAI as the embedding provider in this step.  ",[41,34984,123],{"href":121,"rel":34985},[45],"'s Generative AI API supports embeddings on ",[41,34988,34990],{"href":34103,"rel":34989},[45],"several integrations",", such as OpenAI, Cohere and Google Gemini, but you can also use one provider's SDK.  Please remember to chunk the content properly and not embed the entire content at once.",[3629,34993,34995],{"id":34994},"chunking-strategies","Chunking strategies:",[22,34997,34998],{},"Chunking large documents effectively is important to maintain context and relevance. Here are a few best practices for chunking:",[2510,35000,35001,35007,35013,35019,35025,35031],{},[2357,35002,35003,35006],{},[31,35004,35005],{},"Semantic Chunking",": 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.",[2357,35008,35009,35012],{},[31,35010,35011],{},"Overlap Between Chunks",": Include a slight overlap between adjacent chunks. This helps maintain continuity and context, especially for complex ideas that span multiple chunks.",[2357,35014,35015,35018],{},[31,35016,35017],{},"Fixed-Length Chunking",": 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.",[2357,35020,35021,35024],{},[31,35022,35023],{},"Using Document Structure",": If your document has headings, subheadings, or other structural elements, use those to guide the chunking. This ensures that each chunk is logically complete.",[2357,35026,35027,35030],{},[31,35028,35029],{},"Contextual Embeddings",": 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.",[2357,35032,35033,35036],{},[31,35034,35035],{},"Pre-processing and Cleaning",": Before chunking, clean up the text by removing unnecessary whitespace, special characters, or any irrelevant information to improve the quality of the embeddings.",[22,35038,35039],{},"By following these strategies, you'll maintain the semantic integrity of the document and ensure that the vector database can retrieve meaningful context.",[22,35041,35042],{},"There are several popular libraries that help with chunking and embedding with less custom code. A few notable ones include:",[2510,35044,35045,35051,35057,35063,35069],{},[2357,35046,35047,35050],{},[31,35048,35049],{},"LangChain",": 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.",[2357,35052,35053,35056],{},[31,35054,35055],{},"Haystack",": Developed by deepset, Haystack is another framework for building search pipelines. It supports intelligent chunking, document retrieval, and integration with vector databases like FAISS, Milvus, and Pinecone.",[2357,35058,35059,35062],{},[31,35060,35061],{},"Transformers and Datasets from Hugging Face",": 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.",[2357,35064,35065,35068],{},[31,35066,35067],{},"SentenceTransformers",": This library is great for generating embeddings and can be combined with custom chunking logic to break documents into meaningful pieces before embedding.",[2357,35070,35071,35074],{},[31,35072,35073],{},"LlamaIndex (formerly GPT Index)",": This library is designed to help build large language model applications and provides utilities for chunking, indexing, and querying documents effectively.",[22,35076,35077],{},"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.",[2584,35079,35081],{"className":2689,"code":35080,"language":2691,"meta":2433,"style":2433},"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\", \u002F\u002FYou can choose to use text-embedding-3-small too\n    input: text,\n  });\n  return response.data.data[0].embedding;\n}\n",[36,35082,35083,35097,35128,35132,35161,35179,35192,35197,35201,35213],{"__ignoreMap":2433},[414,35084,35085,35087,35090,35092,35095],{"class":2593,"line":2594},[414,35086,2699],{"class":2698},[414,35088,35089],{"class":2705}," { Configuration, OpenAIApi } ",[414,35091,2716],{"class":2698},[414,35093,35094],{"class":2601}," \"openai\"",[414,35096,2706],{"class":2705},[414,35098,35099,35101,35104,35106,35108,35111,35113,35116,35119,35122,35125],{"class":2593,"line":2434},[414,35100,2745],{"class":2698},[414,35102,35103],{"class":2607}," openai",[414,35105,2817],{"class":2698},[414,35107,2820],{"class":2698},[414,35109,35110],{"class":2597}," OpenAIApi",[414,35112,2968],{"class":2705},[414,35114,35115],{"class":2698},"new",[414,35117,35118],{"class":2597}," Configuration",[414,35120,35121],{"class":2705},"({ apiKey: process.env.",[414,35123,35124],{"class":2607},"OPENAI_API_KEY",[414,35126,35127],{"class":2705}," }));\n",[414,35129,35130],{"class":2593,"line":2613},[414,35131,2740],{"emptyLinePlaceholder":2459},[414,35133,35134,35136,35138,35141,35143,35145,35147,35149,35151,35153,35155,35157,35159],{"class":2593,"line":2625},[414,35135,3928],{"class":2698},[414,35137,2962],{"class":2698},[414,35139,35140],{"class":2597}," embedText",[414,35142,2968],{"class":2705},[414,35144,2652],{"class":2971},[414,35146,2646],{"class":2698},[414,35148,2977],{"class":2607},[414,35150,2980],{"class":2705},[414,35152,2646],{"class":2698},[414,35154,2985],{"class":2597},[414,35156,2988],{"class":2705},[414,35158,3461],{"class":2607},[414,35160,2994],{"class":2705},[414,35162,35163,35165,35167,35169,35171,35174,35177],{"class":2593,"line":2677},[414,35164,3071],{"class":2698},[414,35166,28445],{"class":2607},[414,35168,2817],{"class":2698},[414,35170,3002],{"class":2698},[414,35172,35173],{"class":2705}," openai.",[414,35175,35176],{"class":2597},"createEmbedding",[414,35178,2826],{"class":2705},[414,35180,35181,35184,35187,35189],{"class":2593,"line":2751},[414,35182,35183],{"class":2705},"    model: ",[414,35185,35186],{"class":2601},"\"text-embedding-3-large\"",[414,35188,319],{"class":2705},[414,35190,35191],{"class":3527},"\u002F\u002FYou can choose to use text-embedding-3-small too\n",[414,35193,35194],{"class":2593,"line":2760},[414,35195,35196],{"class":2705},"    input: text,\n",[414,35198,35199],{"class":2593,"line":2768},[414,35200,3030],{"class":2705},[414,35202,35203,35205,35208,35210],{"class":2593,"line":2776},[414,35204,2999],{"class":2698},[414,35206,35207],{"class":2705}," response.data.data[",[414,35209,3604],{"class":2607},[414,35211,35212],{"class":2705},"].embedding;\n",[414,35214,35215],{"class":2593,"line":2784},[414,35216,3035],{"class":2705},[55,35218,35220],{"id":35219},"step-7-indexing-everything",[31,35221,35222],{},"Step 7: Indexing Everything",[22,35224,35225],{},"Now that we have all the data collected, it is time to index all of it!",[22,35227,35228,35229,35231],{},"When you store vectors in a vector database like Pinecone or Weaviate, you can attach ",[36,35230,11221],{}," to each vector. This metadata can include things like a unique ID, the original text, source information, or any other relevant attributes.",[22,35233,35234],{},"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.",[22,35236,35237],{},"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.",[2584,35239,35241],{"className":2689,"code":35240,"language":2691,"meta":2433,"style":2433},"async function indexAllContent() {\n  \u002F\u002F 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  \u002F\u002F 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",[36,35242,35243,35254,35259,35280,35295,35317,35332,35341,35346,35356,35361,35366,35371,35376,35381,35385,35389,35393,35398,35419,35434,35455,35469,35484,35488],{"__ignoreMap":2433},[414,35244,35245,35247,35249,35252],{"class":2593,"line":2594},[414,35246,3928],{"class":2698},[414,35248,2962],{"class":2698},[414,35250,35251],{"class":2597}," indexAllContent",[414,35253,3936],{"class":2705},[414,35255,35256],{"class":2593,"line":2434},[414,35257,35258],{"class":3527},"  \u002F\u002F Google Drive\n",[414,35260,35261,35263,35266,35268,35270,35272,35274,35276,35278],{"class":2593,"line":2613},[414,35262,3071],{"class":2698},[414,35264,35265],{"class":2607}," gdriveFiles",[414,35267,2817],{"class":2698},[414,35269,3002],{"class":2698},[414,35271,34331],{"class":2597},[414,35273,2968],{"class":2705},[414,35275,34261],{"class":2607},[414,35277,2837],{"class":2698},[414,35279,3156],{"class":2705},[414,35281,35282,35284,35286,35288,35290,35292],{"class":2593,"line":2625},[414,35283,3967],{"class":2698},[414,35285,3970],{"class":2705},[414,35287,2745],{"class":2698},[414,35289,34520],{"class":2607},[414,35291,3978],{"class":2698},[414,35293,35294],{"class":2705}," gdriveFiles) {\n",[414,35296,35297,35299,35301,35303,35305,35308,35310,35312,35314],{"class":2593,"line":2677},[414,35298,3986],{"class":2698},[414,35300,28740],{"class":2607},[414,35302,2817],{"class":2698},[414,35304,3002],{"class":2698},[414,35306,35307],{"class":2597}," getFileContent",[414,35309,2968],{"class":2705},[414,35311,34261],{"class":2607},[414,35313,2837],{"class":2698},[414,35315,35316],{"class":2705},", file.id);\n",[414,35318,35319,35321,35324,35326,35328,35330],{"class":2593,"line":2751},[414,35320,3986],{"class":2698},[414,35322,35323],{"class":2607}," embedding",[414,35325,2817],{"class":2698},[414,35327,3002],{"class":2698},[414,35329,35140],{"class":2597},[414,35331,29074],{"class":2705},[414,35333,35334,35337,35339],{"class":2593,"line":2760},[414,35335,35336],{"class":2705},"    vectorDB.",[414,35338,25040],{"class":2597},[414,35340,2826],{"class":2705},[414,35342,35343],{"class":2593,"line":2768},[414,35344,35345],{"class":2705},"            id: file.id,\n",[414,35347,35348,35351,35354],{"class":2593,"line":2776},[414,35349,35350],{"class":2705},"            source: ",[414,35352,35353],{"class":2601},"\"gdrive\"",[414,35355,2757],{"class":2705},[414,35357,35358],{"class":2593,"line":2784},[414,35359,35360],{"class":2705},"            content,\n",[414,35362,35363],{"class":2593,"line":2792},[414,35364,35365],{"class":2705},"            embedding,\n",[414,35367,35368],{"class":2593,"line":2804},[414,35369,35370],{"class":2705},"            filename: file.name,\n",[414,35372,35373],{"class":2593,"line":2809},[414,35374,35375],{"class":2705},"            date_created: file.created_at,\n",[414,35377,35378],{"class":2593,"line":2829},[414,35379,35380],{"class":2705},"            owner_id: file.user_id, \n",[414,35382,35383],{"class":2593,"line":2843},[414,35384,25028],{"class":2705},[414,35386,35387],{"class":2593,"line":2849},[414,35388,10535],{"class":2705},[414,35390,35391],{"class":2593,"line":2854},[414,35392,2740],{"emptyLinePlaceholder":2459},[414,35394,35395],{"class":2593,"line":2880},[414,35396,35397],{"class":3527},"  \u002F\u002F Notion\n",[414,35399,35400,35402,35405,35407,35409,35411,35413,35415,35417],{"class":2593,"line":3253},[414,35401,3071],{"class":2698},[414,35403,35404],{"class":2607}," notionPages",[414,35406,2817],{"class":2698},[414,35408,3002],{"class":2698},[414,35410,34619],{"class":2597},[414,35412,2968],{"class":2705},[414,35414,34266],{"class":2607},[414,35416,2837],{"class":2698},[414,35418,3156],{"class":2705},[414,35420,35421,35423,35425,35427,35429,35431],{"class":2593,"line":3261},[414,35422,3967],{"class":2698},[414,35424,3970],{"class":2705},[414,35426,2745],{"class":2698},[414,35428,16437],{"class":2607},[414,35430,3978],{"class":2698},[414,35432,35433],{"class":2705}," notionPages) {\n",[414,35435,35436,35438,35440,35442,35444,35446,35448,35450,35452],{"class":2593,"line":3279},[414,35437,3986],{"class":2698},[414,35439,28740],{"class":2607},[414,35441,2817],{"class":2698},[414,35443,3002],{"class":2698},[414,35445,34800],{"class":2597},[414,35447,2968],{"class":2705},[414,35449,34266],{"class":2607},[414,35451,2837],{"class":2698},[414,35453,35454],{"class":2705},", page.id);\n",[414,35456,35457,35459,35461,35463,35465,35467],{"class":2593,"line":3313},[414,35458,3986],{"class":2698},[414,35460,35323],{"class":2607},[414,35462,2817],{"class":2698},[414,35464,3002],{"class":2698},[414,35466,35140],{"class":2597},[414,35468,29074],{"class":2705},[414,35470,35471,35473,35475,35478,35481],{"class":2593,"line":3326},[414,35472,35336],{"class":2705},[414,35474,25040],{"class":2597},[414,35476,35477],{"class":2705},"({ id: page.id, source: ",[414,35479,35480],{"class":2601},"\"notion\"",[414,35482,35483],{"class":2705},", content, embedding });\n",[414,35485,35486],{"class":2593,"line":3339},[414,35487,4032],{"class":2705},[414,35489,35490],{"class":2593,"line":3359},[414,35491,3035],{"class":2705},[55,35493,35495],{"id":35494},"step-8-finding-answers",[31,35496,35497],{},"Step 8: Finding Answers",[22,35499,35500],{},"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.",[22,35502,35503],{},"The basic flow would be:",[2510,35505,35506,35509,35512,35519],{},[2357,35507,35508],{},"Embed the question asked",[2357,35510,35511],{},"Find similar docs in the Vector DB",[2357,35513,35514,35515,35518],{},"Send the top ",[36,35516,35517],{},"n"," amount of docs as context paired with the question to Unified's GenAI endpoint.",[2357,35520,35521],{},"Return the answer to the user.",[22,35523,35524],{},"For the purpose of the example, we will be sending the top 3 most similar docs.",[2584,35526,35528],{"className":2689,"code":35527,"language":2691,"meta":2433,"style":2433},"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 \u002F (normA * normB);\n}\n\nasync function answerQuestion(question: string) {\n  const questionEmbedding = await embedText(question);\n\n  \u002F\u002F 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",[36,35529,35530,35557,35609,35657,35704,35721,35725,35729,35748,35764,35768,35773,35797,35805,35820,35825,35874,35878,35918,35922,35933,35938,35942,35947,35957,35966,35973,35977,35993,36003,36008,36017,36027,36035,36039,36043,36047,36064],{"__ignoreMap":2433},[414,35531,35532,35534,35537,35539,35541,35543,35545,35548,35551,35553,35555],{"class":2593,"line":2594},[414,35533,16512],{"class":2698},[414,35535,35536],{"class":2597}," cosineSimilarity",[414,35538,2968],{"class":2705},[414,35540,41],{"class":2971},[414,35542,2646],{"class":2698},[414,35544,3679],{"class":2607},[414,35546,35547],{"class":2705},"[], ",[414,35549,35550],{"class":2971},"b",[414,35552,2646],{"class":2698},[414,35554,3679],{"class":2607},[414,35556,3682],{"class":2705},[414,35558,35559,35561,35564,35566,35569,35572,35574,35577,35579,35582,35584,35587,35589,35591,35594,35596,35599,35602,35605,35607],{"class":2593,"line":2434},[414,35560,3071],{"class":2698},[414,35562,35563],{"class":2607}," dot",[414,35565,2817],{"class":2698},[414,35567,35568],{"class":2705}," a.",[414,35570,35571],{"class":2597},"reduce",[414,35573,3096],{"class":2705},[414,35575,35576],{"class":2971},"sum",[414,35578,319],{"class":2705},[414,35580,35581],{"class":2971},"ai",[414,35583,319],{"class":2705},[414,35585,35586],{"class":2971},"i",[414,35588,3107],{"class":2705},[414,35590,3110],{"class":2698},[414,35592,35593],{"class":2705}," sum ",[414,35595,29904],{"class":2698},[414,35597,35598],{"class":2705}," ai ",[414,35600,35601],{"class":2698},"*",[414,35603,35604],{"class":2705}," b[i], ",[414,35606,3604],{"class":2607},[414,35608,3156],{"class":2705},[414,35610,35611,35613,35616,35618,35621,35624,35627,35629,35631,35633,35635,35637,35639,35641,35643,35645,35647,35649,35652,35654],{"class":2593,"line":2613},[414,35612,3071],{"class":2698},[414,35614,35615],{"class":2607}," normA",[414,35617,2817],{"class":2698},[414,35619,35620],{"class":2705}," Math.",[414,35622,35623],{"class":2597},"sqrt",[414,35625,35626],{"class":2705},"(a.",[414,35628,35571],{"class":2597},[414,35630,3096],{"class":2705},[414,35632,35576],{"class":2971},[414,35634,319],{"class":2705},[414,35636,35581],{"class":2971},[414,35638,3107],{"class":2705},[414,35640,3110],{"class":2698},[414,35642,35593],{"class":2705},[414,35644,29904],{"class":2698},[414,35646,35598],{"class":2705},[414,35648,35601],{"class":2698},[414,35650,35651],{"class":2705}," ai, ",[414,35653,3604],{"class":2607},[414,35655,35656],{"class":2705},"));\n",[414,35658,35659,35661,35664,35666,35668,35670,35673,35675,35677,35679,35681,35684,35686,35688,35690,35692,35695,35697,35700,35702],{"class":2593,"line":2625},[414,35660,3071],{"class":2698},[414,35662,35663],{"class":2607}," normB",[414,35665,2817],{"class":2698},[414,35667,35620],{"class":2705},[414,35669,35623],{"class":2597},[414,35671,35672],{"class":2705},"(b.",[414,35674,35571],{"class":2597},[414,35676,3096],{"class":2705},[414,35678,35576],{"class":2971},[414,35680,319],{"class":2705},[414,35682,35683],{"class":2971},"bi",[414,35685,3107],{"class":2705},[414,35687,3110],{"class":2698},[414,35689,35593],{"class":2705},[414,35691,29904],{"class":2698},[414,35693,35694],{"class":2705}," bi ",[414,35696,35601],{"class":2698},[414,35698,35699],{"class":2705}," bi, ",[414,35701,3604],{"class":2607},[414,35703,35656],{"class":2705},[414,35705,35706,35708,35711,35713,35716,35718],{"class":2593,"line":2677},[414,35707,2999],{"class":2698},[414,35709,35710],{"class":2705}," dot ",[414,35712,23303],{"class":2698},[414,35714,35715],{"class":2705}," (normA ",[414,35717,35601],{"class":2698},[414,35719,35720],{"class":2705}," normB);\n",[414,35722,35723],{"class":2593,"line":2751},[414,35724,3035],{"class":2705},[414,35726,35727],{"class":2593,"line":2760},[414,35728,2740],{"emptyLinePlaceholder":2459},[414,35730,35731,35733,35735,35738,35740,35742,35744,35746],{"class":2593,"line":2768},[414,35732,3928],{"class":2698},[414,35734,2962],{"class":2698},[414,35736,35737],{"class":2597}," answerQuestion",[414,35739,2968],{"class":2705},[414,35741,30844],{"class":2971},[414,35743,2646],{"class":2698},[414,35745,2977],{"class":2607},[414,35747,3826],{"class":2705},[414,35749,35750,35752,35755,35757,35759,35761],{"class":2593,"line":2776},[414,35751,3071],{"class":2698},[414,35753,35754],{"class":2607}," questionEmbedding",[414,35756,2817],{"class":2698},[414,35758,3002],{"class":2698},[414,35760,35140],{"class":2597},[414,35762,35763],{"class":2705},"(question);\n",[414,35765,35766],{"class":2593,"line":2784},[414,35767,2740],{"emptyLinePlaceholder":2459},[414,35769,35770],{"class":2593,"line":2792},[414,35771,35772],{"class":3527},"  \u002F\u002F For the purpose of the example we will be sending the top 3 docs\n",[414,35774,35775,35777,35780,35782,35785,35787,35789,35792,35794],{"class":2593,"line":2804},[414,35776,3071],{"class":2698},[414,35778,35779],{"class":2607}," scored",[414,35781,2817],{"class":2698},[414,35783,35784],{"class":2705}," vectorDB.",[414,35786,3093],{"class":2597},[414,35788,2968],{"class":2705},[414,35790,35791],{"class":2971},"doc",[414,35793,29041],{"class":2698},[414,35795,35796],{"class":2705}," ({\n",[414,35798,35799,35802],{"class":2593,"line":2809},[414,35800,35801],{"class":2698},"    ...",[414,35803,35804],{"class":2705},"doc,\n",[414,35806,35807,35810,35813,35816,35818],{"class":2593,"line":2829},[414,35808,35809],{"class":2705},"    score: ",[414,35811,35812],{"class":2597},"cosineSimilarity",[414,35814,35815],{"class":2705},"(questionEmbedding, doc.embedding",[414,35817,2837],{"class":2698},[414,35819,3141],{"class":2705},[414,35821,35822],{"class":2593,"line":2843},[414,35823,35824],{"class":2705},"  }));\n",[414,35826,35827,35829,35832,35834,35837,35840,35842,35844,35846,35848,35850,35852,35855,35857,35860,35863,35865,35867,35869,35872],{"class":2593,"line":2849},[414,35828,3071],{"class":2698},[414,35830,35831],{"class":2607}," topDocs",[414,35833,2817],{"class":2698},[414,35835,35836],{"class":2705}," scored.",[414,35838,35839],{"class":2597},"sort",[414,35841,3096],{"class":2705},[414,35843,41],{"class":2971},[414,35845,319],{"class":2705},[414,35847,35550],{"class":2971},[414,35849,3107],{"class":2705},[414,35851,3110],{"class":2698},[414,35853,35854],{"class":2705}," b.score ",[414,35856,34146],{"class":2698},[414,35858,35859],{"class":2705}," a.score).",[414,35861,35862],{"class":2597},"slice",[414,35864,2968],{"class":2705},[414,35866,3604],{"class":2607},[414,35868,319],{"class":2705},[414,35870,35871],{"class":2607},"3",[414,35873,3156],{"class":2705},[414,35875,35876],{"class":2593,"line":2854},[414,35877,2740],{"emptyLinePlaceholder":2459},[414,35879,35880,35882,35885,35887,35890,35892,35894,35896,35898,35901,35903,35905,35907,35909,35912,35914,35916],{"class":2593,"line":2880},[414,35881,3071],{"class":2698},[414,35883,35884],{"class":2607}," context",[414,35886,2817],{"class":2698},[414,35888,35889],{"class":2705}," topDocs.",[414,35891,3093],{"class":2597},[414,35893,2968],{"class":2705},[414,35895,35791],{"class":2971},[414,35897,29041],{"class":2698},[414,35899,35900],{"class":2705}," doc.content).",[414,35902,3148],{"class":2597},[414,35904,2968],{"class":2705},[414,35906,3349],{"class":2601},[414,35908,3352],{"class":2607},[414,35910,35911],{"class":2601},"---",[414,35913,3352],{"class":2607},[414,35915,3349],{"class":2601},[414,35917,3156],{"class":2705},[414,35919,35920],{"class":2593,"line":3253},[414,35921,32642],{"class":2705},[414,35923,35924,35926,35928,35930],{"class":2593,"line":3261},[414,35925,3071],{"class":2698},[414,35927,32749],{"class":2607},[414,35929,2817],{"class":2698},[414,35931,35932],{"class":2601}," `\n",[414,35934,35935],{"class":2593,"line":3279},[414,35936,35937],{"class":2601},"You are a helpful company knowledge bot. Use the following context to answer the question.\n",[414,35939,35940],{"class":2593,"line":3313},[414,35941,2740],{"emptyLinePlaceholder":2459},[414,35943,35944],{"class":2593,"line":3326},[414,35945,35946],{"class":2601},"Context:\n",[414,35948,35949,35951,35954],{"class":2593,"line":3339},[414,35950,30308],{"class":2601},[414,35952,35953],{"class":2705},"context",[414,35955,35956],{"class":2601},"}Question:\n",[414,35958,35959,35961,35963],{"class":2593,"line":3359},[414,35960,30308],{"class":2601},[414,35962,30844],{"class":2705},[414,35964,35965],{"class":2601},"}Answer in a concise and accurate way.\n",[414,35967,35968,35971],{"class":2593,"line":6453},[414,35969,35970],{"class":2601},"  `",[414,35972,2706],{"class":2705},[414,35974,35975],{"class":2593,"line":6459},[414,35976,2740],{"emptyLinePlaceholder":2459},[414,35978,35979,35981,35983,35985,35987,35989,35991],{"class":2593,"line":6465},[414,35980,3071],{"class":2698},[414,35982,3470],{"class":2607},[414,35984,2817],{"class":2698},[414,35986,3002],{"class":2698},[414,35988,3477],{"class":2705},[414,35990,32779],{"class":2597},[414,35992,2826],{"class":2705},[414,35994,35995,35997,35999,36001],{"class":2593,"line":6471},[414,35996,3487],{"class":2705},[414,35998,3490],{"class":2607},[414,36000,2837],{"class":2698},[414,36002,2757],{"class":2705},[414,36004,36005],{"class":2593,"line":6477},[414,36006,36007],{"class":2705},"    prompt: {\n",[414,36009,36010,36013,36015],{"class":2593,"line":6483},[414,36011,36012],{"class":2705},"      messages: [{ role: ",[414,36014,32805],{"class":2601},[414,36016,32808],{"class":2705},[414,36018,36019,36022,36025],{"class":2593,"line":6489},[414,36020,36021],{"class":2705},"      maxTokens: ",[414,36023,36024],{"class":2607},"256",[414,36026,2757],{"class":2705},[414,36028,36029,36032],{"class":2593,"line":6495},[414,36030,36031],{"class":2705},"      temperature: ",[414,36033,36034],{"class":2607},"0.2\n",[414,36036,36037],{"class":2593,"line":6501},[414,36038,10535],{"class":2705},[414,36040,36041],{"class":2593,"line":6507},[414,36042,3030],{"class":2705},[414,36044,36045],{"class":2593,"line":6513},[414,36046,2740],{"emptyLinePlaceholder":2459},[414,36048,36049,36051,36053,36055,36057,36059,36062],{"class":2593,"line":6519},[414,36050,2999],{"class":2698},[414,36052,32860],{"class":2705},[414,36054,3604],{"class":2607},[414,36056,32865],{"class":2705},[414,36058,32868],{"class":2698},[414,36060,36061],{"class":2601}," \"No answer generated.\"",[414,36063,2706],{"class":2705},[414,36065,36066],{"class":2593,"line":6525},[414,36067,3035],{"class":2705},[55,36069,36071],{"id":36070},"step-9-usage",[31,36072,36073],{},"Step 9: Usage",[2584,36075,36077],{"className":2689,"code":36076,"language":2691,"meta":2433,"style":2433},"(async () => {\n  await indexAllContent();\n  const answer = await answerQuestion(\"How do I request vacation days?\");\n  console.log(\"Bot answer:\", answer);\n})();\n",[36,36078,36079,36092,36100,36120,36134],{"__ignoreMap":2433},[414,36080,36081,36083,36085,36088,36090],{"class":2593,"line":2594},[414,36082,2968],{"class":2705},[414,36084,3928],{"class":2698},[414,36086,36087],{"class":2705}," () ",[414,36089,3110],{"class":2698},[414,36091,2748],{"class":2705},[414,36093,36094,36096,36098],{"class":2593,"line":2434},[414,36095,3687],{"class":2698},[414,36097,35251],{"class":2597},[414,36099,4088],{"class":2705},[414,36101,36102,36104,36107,36109,36111,36113,36115,36118],{"class":2593,"line":2613},[414,36103,3071],{"class":2698},[414,36105,36106],{"class":2607}," answer",[414,36108,2817],{"class":2698},[414,36110,3002],{"class":2698},[414,36112,35737],{"class":2597},[414,36114,2968],{"class":2705},[414,36116,36117],{"class":2601},"\"How do I request vacation days?\"",[414,36119,3156],{"class":2705},[414,36121,36122,36124,36126,36128,36131],{"class":2593,"line":2625},[414,36123,4061],{"class":2705},[414,36125,4064],{"class":2597},[414,36127,2968],{"class":2705},[414,36129,36130],{"class":2601},"\"Bot answer:\"",[414,36132,36133],{"class":2705},", answer);\n",[414,36135,36136],{"class":2593,"line":2677},[414,36137,36138],{"class":2705},"})();\n",[22,36140,36141,36142,36145],{},"The same flow works across industries: ",[41,36143,123],{"href":121,"rel":36144},[45]," supports 36 categories and 1663 integrations to read end-customer data from.",[4156,36147,36148],{},"html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}",{"title":2433,"searchDepth":2434,"depth":2434,"links":36150},[36151,36152,36153,36154,36155,36156,36157,36160,36161,36162],{"id":2541,"depth":2434,"text":2542},{"id":34130,"depth":2434,"text":34133},{"id":31438,"depth":2434,"text":31439},{"id":34311,"depth":2434,"text":34314},{"id":34599,"depth":2434,"text":34602},{"id":34899,"depth":2434,"text":34902},{"id":34976,"depth":2434,"text":34979,"children":36158},[36159],{"id":34994,"depth":2613,"text":34995},{"id":35219,"depth":2434,"text":35222},{"id":35494,"depth":2434,"text":35497},{"id":36070,"depth":2434,"text":36073},"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.to's...",{"img":36165,"date":36166,"updated":36167,"tag":2457,"integrations":36168},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_build_enterprise_search_using_rag-icon.png","2025-11-19T00:00:00.000Z","2026-10-21T00:20:25.355Z","googledrive, notion, openai","\u002Fguides\u002Fhow_to_build_enterprise_search_using_rag",{"title":34056,"description":36163},"guides\u002Fhow_to_build_enterprise_search_using_rag","01bAMECovy3bQ_6U1xYW9XtMrMUES-B52NyBeouGHDM",{"id":36174,"title":36175,"body":36176,"description":36381,"extension":2452,"meta":36382,"navigation":2459,"path":36387,"seo":36388,"stem":36389,"__hash__":36390},"guides\u002Fguides\u002Fhow_to_configure_bullhorn_redirect_uri_for_creating_a_connection.md","How to configure Bullhorn Redirect URI for creating a connection",{"type":12,"value":36177,"toc":36370},[36178,36181,36183,36188,36199,36203,36206,36210,36214,36217,36228,36234,36238,36241,36253,36259,36266,36319,36323,36326,36333,36340,36344,36361],[15,36179,36175],{"id":36180},"how-to-configure-bullhorn-redirect-uri-for-creating-a-connection",[19,36182],{},[22,36184,36185],{},[25,36186,36187],{},"April 8, 2026",[22,36189,36190,36191,36194,36195,36198],{},"To connect Bullhorn to ",[41,36192,123],{"href":121,"rel":36193},[45],", each of your customers needs Bullhorn REST API credentials (OAuth client ID, client secret, API username and API password) whose redirect URI is set to ",[41,36196,123],{"href":121,"rel":36197},[45],"'s OAuth callback. Bullhorn Support sets this up; it's a one-time request per Bullhorn account.",[55,36200,36202],{"id":36201},"why-does-bullhorn-need-a-support-request","Why does Bullhorn need a support request?",[22,36204,36205],{},"Bullhorn's REST API credentials aren't self-service. Bullhorn Support creates the OAuth client ID and client secret and registers the redirect URIs they accept (Bullhorn documentation, as of 21 October 2026). A customer can't change the redirect URI in the Bullhorn web interface.",[55,36207,36209],{"id":36208},"steps-your-customer-must-complete","Steps your customer must complete",[3629,36211,36213],{"id":36212},"_1-ask-bullhorn-support-for-rest-api-credentials","1. Ask Bullhorn Support for REST API credentials",[22,36215,36216],{},"The customer opens a ticket with Bullhorn Support (Bullhorn Resource Center) asking for REST API OAuth credentials for the application, with the redirect URI in step 2. Bullhorn Support returns:",[2354,36218,36219,36222,36225],{},[2357,36220,36221],{},"OAuth client ID",[2357,36223,36224],{},"OAuth client secret",[2357,36226,36227],{},"API username (the customer sets its password)",[22,36229,36230,36233],{},[41,36231,123],{"href":121,"rel":36232},[45],"'s Bullhorn connection form asks for all four: OAuth2 Client ID, OAuth2 Client Secret, API Username and API Password.",[3629,36235,36237],{"id":36236},"_2-include-the-redirect-uri-in-the-request","2. Include the redirect URI in the request",[22,36239,36240],{},"In the same ticket (or a follow-up, if the credentials already exist), the customer asks Bullhorn Support to set the redirect URI for those credentials and gives:",[2354,36242,36243,36246],{},[2357,36244,36245],{},"the API username or application name",[2357,36247,36248,36249,36252],{},"the ",[41,36250,123],{"href":121,"rel":36251},[45]," redirect URI for your region (below)",[22,36254,36255,36256,36258],{},"Example request: \"Please set the redirect URI for our Bullhorn API user to ",[36,36257,21741],{},".\"",[22,36260,36261,36262,36265],{},"Use the redirect URI for the region your ",[41,36263,123],{"href":121,"rel":36264},[45]," workspace is in:",[155,36267,36268,36276],{},[158,36269,36270],{},[161,36271,36272,36274],{},[164,36273,5987],{},[164,36275,4497],{},[174,36277,36278,36286,36294,36302],{},[161,36279,36280,36282],{},[179,36281,5108],{},[179,36283,36284],{},[36,36285,21741],{},[161,36287,36288,36290],{},[179,36289,5118],{},[179,36291,36292],{},[36,36293,21747],{},[161,36295,36296,36298],{},[179,36297,6897],{},[179,36299,36300],{},[36,36301,21753],{},[161,36303,36304,36317],{},[179,36305,36306,36307,36312,36313,36316],{},"If your workspace uses a ",[41,36308,36311],{"href":36309,"rel":36310},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_set_up_a_custom_api_url_with_a_cname",[45],"custom API domain (CNAME)",", available on Pro and Scale in the US and EU regions, use ",[36,36314,36315],{},"https:\u002F\u002FYOUR_CUSTOM_DOMAIN\u002Foauth\u002Fcode"," instead.",[179,36318],{},[3629,36320,36322],{"id":36321},"_3-wait-for-bullhorn-support-to-confirm","3. Wait for Bullhorn Support to confirm",[22,36324,36325],{},"The connection fails until Bullhorn Support confirms the credentials and the redirect URI are in place.",[3629,36327,36329,36330],{"id":36328},"_4-create-the-connection-in-unifiedto","4. Create the connection in ",[41,36331,123],{"href":121,"rel":36332},[45],[22,36334,36335,36336,36339],{},"Your customer then connects Bullhorn through your ",[41,36337,123],{"href":121,"rel":36338},[45]," authorization flow, entering the OAuth2 Client ID, OAuth2 Client Secret, API Username and API Password.",[55,36341,36343],{"id":36342},"what-else-should-you-know","What else should you know?",[2354,36345,36346,36349,36355,36358],{},[2357,36347,36348],{},"Every customer must request the redirect URI change individually for their own Bullhorn account.",[2357,36350,36351,36354],{},[41,36352,123],{"href":121,"rel":36353},[45]," can't set the redirect URI for your customer; only Bullhorn Support can.",[2357,36356,36357],{},"This is a one-time setup for each of your customers using Bullhorn.",[2357,36359,36360],{},"If the customer creates a new API user in the future, they will need to go through this process again.",[22,36362,36363,36364,36369],{},"Once connected, see the ",[41,36365,36368],{"href":36366,"rel":36367},"https:\u002F\u002Fdocs.unified.to\u002Fintegrations\u002Fbullhorn",[45],"Bullhorn integration page"," for the ATS, CRM and HR & Directory objects and fields Bullhorn supports.",{"title":2433,"searchDepth":2434,"depth":2434,"links":36371},[36372,36373,36380],{"id":36201,"depth":2434,"text":36202},{"id":36208,"depth":2434,"text":36209,"children":36374},[36375,36376,36377,36378],{"id":36212,"depth":2613,"text":36213},{"id":36236,"depth":2613,"text":36237},{"id":36321,"depth":2613,"text":36322},{"id":36328,"depth":2613,"text":36379},"4. Create the connection in Unified.to",{"id":36342,"depth":2434,"text":36343},"To connect Bullhorn to Unified.to, each of your customers needs Bullhorn REST API credentials (OAuth client ID, client secret, API username and API password)...",{"img":36383,"date":36384,"updated":36385,"tag":2457,"integrations":36386},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_configure_bullhorn_redirect_uri_for_creating_a_connection-icon.png","2026-04-08T15:20:00.000Z","2026-10-21T13:55:49.929Z","bullhorn","\u002Fguides\u002Fhow_to_configure_bullhorn_redirect_uri_for_creating_a_connection",{"title":36175,"description":36381},"guides\u002Fhow_to_configure_bullhorn_redirect_uri_for_creating_a_connection","q8pc2pRJerqpWr2YmoNlopjmqn-3uXYD4flPc4GUWBU",{"id":36392,"title":36393,"body":36394,"description":37064,"extension":2452,"meta":37065,"navigation":2459,"path":37070,"seo":37071,"stem":37072,"__hash__":37073},"guides\u002Fguides\u002Fhow_to_configure_webhooks_in_hubspot.md","How to configure webhooks in HubSpot",{"type":12,"value":36395,"toc":37049},[36396,36399,36401,36406,36409,36411,36446,36450,36454,36460,36464,36467,36530,36534,36537,36625,36629,36636,36709,36713,36717,36727,36785,36791,36794,36963,36970,36980,36990,36994,36997,37006,37009,37015,37020,37024,37046],[15,36397,36393],{"id":36398},"how-to-configure-webhooks-in-hubspot",[19,36400],{},[22,36402,36403],{},[25,36404,36405],{},"February 23, 2024",[22,36407,36408],{},"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 changes from HubSpot e.g. new leads, updated deals, or deleted contacts.",[55,36410,4890],{"id":4889},[2354,36412,36413,36416,36419,36437],{},[2357,36414,36415],{},"Make sure you have a HubSpot developer account.",[2357,36417,36418],{},"Get your client ID, client secret, and developer API key.",[2357,36420,36421,36422,36425,36426,36429],{},"Point the ",[31,36423,36424],{},"Redirect URL"," in your HubSpot app to ",[36,36427,36428],{},"api.unified.to\u002Foauth\u002Fcode",[2354,36430,36431],{},[2357,36432,36433,36434],{},"If you're using the EU data region, use instead",[36,36435,36436],{},"api-eu.unified.to\u002Foauth\u002Fcode",[2357,36438,36439,36440,36445],{},"Follow our ",[41,36441,36444],{"href":36442,"rel":36443},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_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",[45],"HubSpot developer guide"," to see how to do all of the above.",[55,36447,36449],{"id":36448},"setting-up-webhooks-in-hubspot-legacy-apps","Setting up Webhooks in Hubspot Legacy Apps",[3629,36451,36453],{"id":36452},"select-the-appropriate-legacy-app-to-setup-the-webhook","Select the appropriate Legacy App to setup the webhook",[22,36455,36456],{},[4201,36457],{"alt":36458,"src":36459},"Screenshot_2025-11-25_at_12.21.18_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_configure_webhooks_in_hubspot-0.png",[3629,36461,36463],{"id":36462},"set-the-target-url-for-the-webhook","Set the target URL for the webhook",[22,36465,36466],{},"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.",[2510,36468,36469,36477,36482,36485,36495,36524],{},[2357,36470,36471,36472,97],{},"Navigate to your ",[41,36473,36476],{"href":36474,"rel":36475},"https:\u002F\u002Fapp.hubspot.com\u002F",[45],"HubSpot developer account",[2357,36478,16292,36479],{},[31,36480,36481],{},"Apps.",[2357,36483,36484],{},"Select the app you wish to use to access your customers' data.",[2357,36486,16292,36487,36490,36492],{},[31,36488,36489],{},"Webhooks.",[5888,36491],{},[4201,36493],{"alt":20627,"src":36494},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_configure_webhooks_in_hubspot-1.png",[2357,36496,20156,36497,2646,36500,36514,36516,36517,36520,36521],{},[31,36498,36499],{},"Target URL",[2510,36501,36502,36508],{},[2357,36503,36504,36505],{},"If you are using the US data region, copy and paste in: ",[36,36506,36507],{},"api.unified.to\u002Fwebhook\u002Fworkspace\u002Fhubspot",[2357,36509,36510,36511],{},"If you using the EU data region, copy and paste in: ",[36,36512,36513],{},"api-eu.unified.to\u002Fwebhook\u002Fworkspace\u002Fhubspot",[5888,36515],{},"If your URL is greyed out and you have subscriptions under ",[31,36518,36519],{},"Event subscriptions",", then you'll need to unsubscribe from all of them. ",[25,36522,36523],{},"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.",[2357,36525,36526,36527,36529],{},"You do ",[31,36528,8239],{}," have to create any subscriptions manually. Unified.to will do that on your behalf.",[3629,36531,36533],{"id":36532},"add-scopes-for-your-webhooks","Add scopes for your webhooks",[22,36535,36536],{},"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.",[2510,36538,36539,36549,36613],{},[2357,36540,36541,36542,36545,36546],{},"With your app page still open, click ",[31,36543,36544],{},"Basic Info"," and then click ",[31,36547,36548],{},"Auth.",[2357,36550,36551,36552,2646,36555],{},"Scroll down to ",[31,36553,36554],{},"Scopes",[2510,36556,36557,36566,36587,36593,36606],{},[2357,36558,36559,36560,36563,36564,97],{},"Add ",[36,36561,36562],{},"crm.objects.owners.read","as ",[31,36565,9018],{},[2357,36567,36568,36569,36572],{},"For any events where you want to read data, add them as ",[31,36570,36571],{},"Required.",[2510,36573,36574],{},[2357,36575,36576,36577,741,36580,36583,36584,36586],{},"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 ",[36,36578,36579],{},"crm.objects.contacts.read",[36,36581,36582],{},"crm.objects.companies.read"," as ",[31,36585,9018],{}," because Unified.to will pass all of these as required scopes in each auth flow.",[2357,36588,36589,36590,97],{},"For any events where you want to write data, add them as ",[31,36591,36592],{},"Optional",[2357,36594,36595,36596,36583,36598,36600,36601,36583,36604,97],{},"For example, if you want to receive notifications about updates to HubSpot companies, you'll need to add ",[36,36597,36582],{},[31,36599,9018],{},". If you want to write data to companies, add ",[36,36602,36603],{},"crm.objects.companies.write",[31,36605,36592],{},[2357,36607,36608,36609,97],{},"To see the full list of HubSpot scopes that Unified.to supports, see: ",[41,36610,36611],{"href":36611,"rel":36612},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fhubspot?tab=oauth2",[45],[2357,36614,8879,36615,36618,36619,36621],{},[36,36616,36617],{},"oauth"," scope is also required for all HubSpot integrations. This will be added by default if your app was created after April 2024.",[5888,36620],{},[4201,36622],{"alt":36623,"src":36624},"Screenshot_2024-08-26_at_2.35.36_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_configure_webhooks_in_hubspot-2.png",[3629,36626,36628],{"id":36627},"select-permission-scopes-on-unifiedto","Select permission scopes on Unified.to",[22,36630,36631,36632,36635],{},"When prompting your customers to authorize access to their third-party accounts, you will need to select the corresponding scopes in ",[41,36633,123],{"href":121,"rel":36634},[45]," as well. The following steps show you how to do that when using our Embedded Authorization component.",[2510,36637,36638,36653,36659],{},[2357,36639,36640,36641,36644,36645,36651],{},"On app.unified.to, click on ",[31,36642,36643],{},"Settings"," and then ",[41,36646,36649],{"href":36647,"rel":36648},"https:\u002F\u002Fapp.unified.to\u002Fsettings\u002Fembed?tab=Authorization",[45],[31,36650,16467],{},[31,36652,97],{},[2357,36654,36655,36656,97],{},"You will see a preview of the Embedded Authorization component on the left and a list of configuration options on the right. Click on ",[31,36657,36658],{},"Options",[2357,36660,36551,36661,36664,36665,36667,36668,4149,36670,36672,36673,36676,36677],{},[31,36662,36663],{},"Permission scopes"," and select ",[31,36666,29627],{}," 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 ",[36,36669,36617],{},[36,36671,36562],{}," on ",[41,36674,123],{"href":121,"rel":36675},[45]," as well; Unified maps these automatically.\n",[2510,36678,36679,36693,36699],{},[2357,36680,36681,36682,741,36684,36687,36689],{},"For example, using the examples from above for reading Contacts and Companies, the scopes in Unified.to would be  ",[36,36683,16401],{},[36,36685,36686],{},"crm_company_read",[5888,36688],{},[4201,36690],{"alt":36691,"src":36692},"c9a0cf8d-eca3-4b74-8d52-d84a2fb6029f.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_configure_webhooks_in_hubspot-3.png",[2357,36694,36695,36696,97],{},"A mapping of Unified scopes to their HubSpot counterparts can be found ",[41,36697,28103],{"href":36611,"rel":36698},[45],[2357,36700,36701,36702,36705,36706,36708],{},"Tip: Under ",[31,36703,36704],{},"Integration categories,"," select ",[31,36707,23529],{}," to only see scopes related to CRM data objects.",[55,36710,36712],{"id":36711},"setting-up-webhooks-in-hubspot-development-platform","Setting up Webhooks in Hubspot Development Platform",[3629,36714,36716],{"id":36715},"create-webhook-configuration-file","Create Webhook configuration file",[22,36718,36719,36720,36722,36723,36726],{},"In your hubspot project folder, create a new folder ",[36,36721,29627],{}," and inside add in the ",[36,36724,36725],{},"webhook-hsmeta.json"," file.",[2584,36728,36730],{"className":16485,"code":36729,"language":16487,"meta":2433,"style":2433},"project-folder\u002F\n└── src\u002F\n    └── app\u002F\n        ├── app-hsmeta.json\n        └── webhooks\u002F\n            └── webhook-hsmeta.json\n",[36,36731,36732,36745,36752,36759,36769,36776],{"__ignoreMap":2433},[414,36733,36734,36737,36739,36742],{"class":2593,"line":2594},[414,36735,36736],{"class":2705},"project",[414,36738,34146],{"class":2698},[414,36740,36741],{"class":2705},"folder",[414,36743,36744],{"class":2698},"\u002F\n",[414,36746,36747,36750],{"class":2593,"line":2434},[414,36748,36749],{"class":2705},"└── src",[414,36751,36744],{"class":2698},[414,36753,36754,36757],{"class":2593,"line":2613},[414,36755,36756],{"class":2705},"    └── app",[414,36758,36744],{"class":2698},[414,36760,36761,36764,36766],{"class":2593,"line":2625},[414,36762,36763],{"class":2705},"        ├── app",[414,36765,34146],{"class":2698},[414,36767,36768],{"class":2705},"hsmeta.json\n",[414,36770,36771,36774],{"class":2593,"line":2677},[414,36772,36773],{"class":2705},"        └── webhooks",[414,36775,36744],{"class":2698},[414,36777,36778,36781,36783],{"class":2593,"line":2751},[414,36779,36780],{"class":2705},"            └── webhook",[414,36782,34146],{"class":2698},[414,36784,36768],{"class":2705},[3629,36786,36788],{"id":36787},"setup-webhook-configuration",[31,36789,36790],{},"Setup Webhook configuration",[22,36792,36793],{},"Now that you have the webhook config file ready, let's setup the configuration as follows:",[2584,36795,36797],{"className":16485,"code":36796,"language":16487,"meta":2433,"style":2433},"{\n  \"uid\": \"webhooks\",\n  \"type\": \"webhooks\",\n  \"config\": {\n    \"settings\": {\n      \"targetUrl\": \"https:\u002F\u002Fapi.unified.to\u002Fwebhook\u002Fworkspace\u002Fhubspot\",\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",[36,36798,36799,36803,36815,36825,36832,36839,36851,36861,36865,36872,36879,36883,36895,36907,36916,36920,36924,36935,36943,36947,36951,36955,36959],{"__ignoreMap":2433},[414,36800,36801],{"class":2593,"line":2594},[414,36802,8916],{"class":2705},[414,36804,36805,36808,36810,36813],{"class":2593,"line":2434},[414,36806,36807],{"class":2601},"  \"uid\"",[414,36809,7340],{"class":2705},[414,36811,36812],{"class":2601},"\"webhooks\"",[414,36814,2757],{"class":2705},[414,36816,36817,36819,36821,36823],{"class":2593,"line":2613},[414,36818,15528],{"class":2601},[414,36820,7340],{"class":2705},[414,36822,36812],{"class":2601},[414,36824,2757],{"class":2705},[414,36826,36827,36830],{"class":2593,"line":2625},[414,36828,36829],{"class":2601},"  \"config\"",[414,36831,10477],{"class":2705},[414,36833,36834,36837],{"class":2593,"line":2677},[414,36835,36836],{"class":2601},"    \"settings\"",[414,36838,10477],{"class":2705},[414,36840,36841,36844,36846,36849],{"class":2593,"line":2751},[414,36842,36843],{"class":2601},"      \"targetUrl\"",[414,36845,7340],{"class":2705},[414,36847,36848],{"class":2601},"\"https:\u002F\u002Fapi.unified.to\u002Fwebhook\u002Fworkspace\u002Fhubspot\"",[414,36850,2757],{"class":2705},[414,36852,36853,36856,36858],{"class":2593,"line":2760},[414,36854,36855],{"class":2601},"      \"maxConcurrentRequests\"",[414,36857,7340],{"class":2705},[414,36859,36860],{"class":2607},"10\n",[414,36862,36863],{"class":2593,"line":2768},[414,36864,3548],{"class":2705},[414,36866,36867,36870],{"class":2593,"line":2776},[414,36868,36869],{"class":2601},"    \"subscriptions\"",[414,36871,10477],{"class":2705},[414,36873,36874,36877],{"class":2593,"line":2784},[414,36875,36876],{"class":2601},"      \"legacyCrmObjects\"",[414,36878,8960],{"class":2705},[414,36880,36881],{"class":2593,"line":2792},[414,36882,10590],{"class":2705},[414,36884,36885,36888,36890,36893],{"class":2593,"line":2804},[414,36886,36887],{"class":2601},"          \"subscriptionType\"",[414,36889,7340],{"class":2705},[414,36891,36892],{"class":2601},"\"deals.propertyChange\"",[414,36894,2757],{"class":2705},[414,36896,36897,36900,36902,36905],{"class":2593,"line":2809},[414,36898,36899],{"class":2601},"          \"propertyName\"",[414,36901,7340],{"class":2705},[414,36903,36904],{"class":2601},"\"dealstage\"",[414,36906,2757],{"class":2705},[414,36908,36909,36912,36914],{"class":2593,"line":2829},[414,36910,36911],{"class":2601},"          \"active\"",[414,36913,7340],{"class":2705},[414,36915,10733],{"class":2607},[414,36917,36918],{"class":2593,"line":2843},[414,36919,3768],{"class":2705},[414,36921,36922],{"class":2593,"line":2849},[414,36923,10590],{"class":2705},[414,36925,36926,36928,36930,36933],{"class":2593,"line":2854},[414,36927,36887],{"class":2601},[414,36929,7340],{"class":2705},[414,36931,36932],{"class":2601},"\"deals.associationChange\"",[414,36934,2757],{"class":2705},[414,36936,36937,36939,36941],{"class":2593,"line":2880},[414,36938,36911],{"class":2601},[414,36940,7340],{"class":2705},[414,36942,10733],{"class":2607},[414,36944,36945],{"class":2593,"line":3253},[414,36946,10641],{"class":2705},[414,36948,36949],{"class":2593,"line":3261},[414,36950,10530],{"class":2705},[414,36952,36953],{"class":2593,"line":3279},[414,36954,10535],{"class":2705},[414,36956,36957],{"class":2593,"line":3313},[414,36958,4032],{"class":2705},[414,36960,36961],{"class":2593,"line":3326},[414,36962,3035],{"class":2705},[22,36964,36965,36966,36969],{},"For the ",[36,36967,36968],{},"targetUrl"," :",[2510,36971,36972,36976],{},[2357,36973,36504,36974],{},[36,36975,36507],{},[2357,36977,36510,36978],{},[36,36979,36513],{},[22,36981,36965,36982,36985,36986,36989],{},[36,36983,36984],{},"subscriptions"," we need to use the ",[36,36987,36988],{},"legacyCrmObjects"," to define which object we want to get events for.",[3629,36991,36993],{"id":36992},"deploy-hubspot-project","Deploy Hubspot Project",[22,36995,36996],{},"Once you've setup your webhook configuration, you can now upload the project via:",[2584,36998,37000],{"className":16485,"code":36999,"language":16487,"meta":2433,"style":2433},"hs project upload\n",[36,37001,37002],{"__ignoreMap":2433},[414,37003,37004],{"class":2593,"line":2594},[414,37005,36999],{"class":2705},[22,37007,37008],{},"Once uploaded, your configuration should now show up in your app's webhook list:",[22,37010,37011],{},[4201,37012],{"alt":37013,"src":37014},"Screenshot_2025-11-25_at_12.34.02_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_configure_webhooks_in_hubspot-4.png",[22,37016,5728,37017,97],{},[41,37018,5733],{"href":5731,"rel":37019},[45],[55,37021,37023],{"id":37022},"see-also","See also",[2354,37025,37026,37033,37039],{},[2357,37027,37028],{},[41,37029,37032],{"href":37030,"rel":37031},"https:\u002F\u002Fdocs.unified.to\u002Fconcepts\u002Fwebhooks#introduction-to-webhooks",[45],"Introduction to webhooks",[2357,37034,37035],{},[41,37036,37038],{"href":5078,"rel":37037},[45],"Create a webhook subscription",[2357,37040,37041],{},[41,37042,37045],{"href":37043,"rel":37044},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_set_up_your_scopes_in_hubspot",[45],"How to set up your scopes in HubSpot",[4156,37047,37048],{},"html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}",{"title":2433,"searchDepth":2434,"depth":2434,"links":37050},[37051,37052,37058,37063],{"id":4889,"depth":2434,"text":4890},{"id":36448,"depth":2434,"text":36449,"children":37053},[37054,37055,37056,37057],{"id":36452,"depth":2613,"text":36453},{"id":36462,"depth":2613,"text":36463},{"id":36532,"depth":2613,"text":36533},{"id":36627,"depth":2613,"text":36628},{"id":36711,"depth":2434,"text":36712,"children":37059},[37060,37061,37062],{"id":36715,"depth":2613,"text":36716},{"id":36787,"depth":2613,"text":36790},{"id":36992,"depth":2613,"text":36993},{"id":37022,"depth":2434,"text":37023},"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...",{"img":37066,"date":37067,"updated":37068,"tag":2457,"integrations":37069},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_configure_webhooks_in_hubspot-icon.png","2024-02-23T00:00:00.000Z","2026-10-13T00:41:32.136Z","hubspot","\u002Fguides\u002Fhow_to_configure_webhooks_in_hubspot",{"title":36393,"description":37064},"guides\u002Fhow_to_configure_webhooks_in_hubspot","tjuJwaV1PEbDS-YZrseEnGUBd5Aa9vyNrexj21Pla3E",{"id":37075,"title":37076,"body":37077,"description":37135,"extension":2452,"meta":37136,"navigation":2459,"path":37140,"seo":37141,"stem":37142,"__hash__":37143},"guides\u002Fguides\u002Fhow_to_configure_webhooks_in_thrive_learning.md","How to configure webhooks in Thrive Learning",{"type":12,"value":37078,"toc":37133},[37079,37082,37084,37089,37092,37128],[15,37080,37076],{"id":37081},"how-to-configure-webhooks-in-thrive-learning",[19,37083],{},[22,37085,37086],{},[25,37087,37088],{},"August 26, 2026",[22,37090,37091],{},"Instructions on how to configure native webhooks in Thrive Learning:",[2510,37093,37094,37097,37100,37114],{},[2357,37095,37096],{},"Create Unified webhooks for the objects you want (lms_content, lms_course, lms_student, hris_employee, lms_activity).",[2357,37098,37099],{},"Thrive webhooks must be configured in the Thrive application.",[2357,37101,37102,37103],{},"Ask your customer to contact their Thrive admin or implementation team to set up the relevant subscriptions:\n",[2510,37104,37105,37108,37111],{},[2357,37106,37107],{},"user_subscription (for students\u002Femployees)",[2357,37109,37110],{},"content_subscription (for content\u002Fcourses)",[2357,37112,37113],{},"completion_subscription (for activity)",[2357,37115,37116,37117,37121,37122,37124,37125,37127],{},"Point each subscription URL at the Unified workspace webhook URL:  ",[41,37118,37119],{"href":37119,"rel":37120},"https:\u002F\u002Fapi.unified.to\u002Fwebhook\u002Fworkspace\u002Fthrive?workspace_id=YOUR_WORKSPACE_ID&connection_id=YOUR_CONNECTION_ID",[45],". Change the Unified API host for other regions (",[36,37123,18740],{}," for EU, ",[36,37126,18743],{}," for Australia).",[22,37129,5728,37130,97],{},[41,37131,5733],{"href":5731,"rel":37132},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":37134},[],"Instructions on how to configure native webhooks in Thrive Learning,",{"img":7949,"date":37137,"updated":37138,"tag":2457,"integrations":37139},"2026-08-26T21:07:00.000Z","2026-10-13T00:41:41.493Z","thrive","\u002Fguides\u002Fhow_to_configure_webhooks_in_thrive_learning",{"title":37076,"description":37135},"guides\u002Fhow_to_configure_webhooks_in_thrive_learning","KBM1MmRs5P60-8lCQLdLeWMhL9GJcefE1vIdTmNVx4Q",{"id":37145,"title":37146,"body":37147,"description":37749,"extension":2452,"meta":37750,"navigation":2459,"path":37753,"seo":37754,"stem":37755,"__hash__":37756},"guides\u002Fguides\u002Fhow_to_configure_webhooks_in_toast_for_unified.md","How to configure webhooks in Toast for Unified",{"type":12,"value":37148,"toc":37740},[37149,37152,37154,37159,37165,37168,37198,37200,37229,37233,37244,37253,37256,37273,37276,37280,37286,37315,37318,37325,37329,37339,37342,37436,37446,37450,37621,37625,37628,37655,37657,37737],[15,37150,37146],{"id":37151},"how-to-configure-webhooks-in-toast-for-unified",[19,37153],{},[22,37155,37156],{},[25,37157,37158],{},"August 12, 2026",[22,37160,37161,37162,37164],{},"Toast pushes restaurant events to a partner webhook URL. Toast does ",[31,37163,8239],{}," offer a\nprogrammatic subscribe API for these subscriptions; they are created in the Toast\nDeveloper Portal and\u002For with the Toast Integrations team. Point that URL at Unified so\nyour Unified webhooks receive native events.",[22,37166,37167],{},"Official Toast docs:",[2354,37169,37170,37177,37184,37191],{},[2357,37171,37172],{},[41,37173,37176],{"href":37174,"rel":37175},"https:\u002F\u002Fdoc.toasttab.com\u002Fdoc\u002Fdevguide\u002FapiWebhookBasics.html",[45],"Webhook basics",[2357,37178,37179],{},[41,37180,37183],{"href":37181,"rel":37182},"https:\u002F\u002Fdoc.toasttab.com\u002Fdoc\u002Fdevguide\u002FapiSubscriptions.html",[45],"Subscriptions",[2357,37185,37186],{},[41,37187,37190],{"href":37188,"rel":37189},"https:\u002F\u002Fdoc.toasttab.com\u002Fdoc\u002Fdevguide\u002FapiMessageSigning.html",[45],"Message signing",[2357,37192,37193],{},[41,37194,37197],{"href":37195,"rel":37196},"https:\u002F\u002Fdoc.toasttab.com\u002Fdoc\u002Fdevguide\u002FapiWebhooksReference.html",[45],"Webhooks reference",[55,37199,2542],{"id":2541},[2510,37201,37202,37205,37218],{},[2357,37203,37204],{},"A Toast partner \u002F developer account with access to the Toast Developer Portal.",[2357,37206,37207,37208,37211,37212,10753,37215,20056],{},"At least one Unified ",[31,37209,37210],{},"Toast"," connection for the restaurant (auth must include the\nrestaurant GUID in ",[36,37213,37214],{},"other_auth_info[3]",[36,37216,37217],{},"Toast-Restaurant-External-ID",[2357,37219,37220,37221,37224,37225,37228],{},"One or more Unified ",[31,37222,37223],{},"native"," webhooks on that connection for the object types you care\nabout (created in the Unified dashboard or via the Unified webhooks API). Creating the\nUnified webhook stores a ",[36,37226,37227],{},"toast-{restaurantGuid}"," subscription marker so inbound Toast\ndeliveries can be matched.",[55,37230,37232],{"id":37231},"_1-get-your-unified-workspace-webhook-url","1. Get your Unified workspace webhook URL",[22,37234,37235,37236,37239,37240,37243],{},"Unified receives Toast deliveries on the ",[31,37237,37238],{},"workspace"," webhook endpoint for the ",[36,37241,37242],{},"toast","\nintegration:",[2584,37245,37247],{"className":2649,"code":37246,"language":2651,"meta":2652,"style":2433},"https:\u002F\u002F{api-host}\u002Fwebhook\u002Fworkspace\u002Ftoast?workspace_id={your_workspace_id}\n",[36,37248,37249],{"__ignoreMap":2433},[414,37250,37251],{"class":2593,"line":2594},[414,37252,37246],{},[22,37254,37255],{},"Replace:",[2354,37257,37258,37267],{},[2357,37259,37260,37263,37264],{},[36,37261,37262],{},"{api-host}",": your Unified API host for the region (US \u002F EU \u002F AU), e.g. ",[36,37265,37266],{},"api.unified.to",[2357,37268,37269,37272],{},[36,37270,37271],{},"{your_workspace_id}",": the Unified workspace that owns the Toast connection(s)",[22,37274,37275],{},"Use the same URL for every Toast event category you subscribe to. Unified fans out each\ndelivery to the matching native webhooks for that restaurant.",[55,37277,37279],{"id":37278},"_2-create-toast-webhook-subscriptions","2. Create Toast webhook subscriptions",[22,37281,37282,37283,2646],{},"In the ",[31,37284,37285],{},"Toast Developer Portal → Webhooks",[2510,37287,37288,37294,37301,37308],{},[2357,37289,20149,37290,37293],{},[31,37291,37292],{},"Add webhook"," (or ask Toast Integrations to create the subscription if portal\ncreate is not enabled for your partner account).",[2357,37295,37296,37297,37300],{},"Set ",[31,37298,37299],{},"Webhook URL"," to the Unified URL from step 1.",[2357,37302,37303,37304,37307],{},"Choose an ",[31,37305,37306],{},"Event category"," (one subscription per category; each category gets its own\nsecret key).",[2357,37309,37310,37311,37314],{},"Save the subscription and copy the ",[31,37312,37313],{},"secret key"," shown on the subscription details page.",[22,37316,37317],{},"Repeat for each category you need (see mapping below). Toast environments (sandbox vs\nproduction) have separate subscriptions and secrets.",[22,37319,37320,37321,37324],{},"To remove a subscription later, contact Toast Integrations or delete it in the Developer\nPortal. Unified ",[36,37322,37323],{},"unsubscribe"," only clears local matching cache; it cannot delete Toast-side\nsubscriptions.",[55,37326,37328],{"id":37327},"_3-recommended-store-signing-secrets-on-the-connection","3. (Recommended) Store signing secrets on the connection",[22,37330,37331,37332,37335,37336,97],{},"Toast signs each POST with HMAC-SHA256 and sends ",[36,37333,37334],{},"Toast-Signature"," (Base64). The secret is\n",[31,37337,37338],{},"per event category",[22,37340,37341],{},"If you store secrets on the Toast connection auth metadata, Unified verifies the signature\nbefore dispatching:",[2584,37343,37345],{"className":7323,"code":37344,"language":7325,"meta":2433,"style":2433},"{\n  \"toast_webhook_secrets\": {\n    \"stock\": \"\u003Csecret-from-stock-subscription>\",\n    \"menus\": \"\u003Csecret-from-menus-subscription>\",\n    \"partner\": \"\u003Csecret-from-partner-subscription>\",\n    \"order_updated\": \"\u003Csecret-from-orders-subscription>\",\n    \"channel_order_updated\": \"\u003Csecret-from-channel-orders-subscription>\",\n    \"restaurant_availability\": \"\u003Csecret-from-availability-subscription>\"\n  }\n}\n",[36,37346,37347,37351,37358,37370,37382,37394,37406,37418,37428,37432],{"__ignoreMap":2433},[414,37348,37349],{"class":2593,"line":2594},[414,37350,8916],{"class":2705},[414,37352,37353,37356],{"class":2593,"line":2434},[414,37354,37355],{"class":2607},"  \"toast_webhook_secrets\"",[414,37357,10477],{"class":2705},[414,37359,37360,37363,37365,37368],{"class":2593,"line":2613},[414,37361,37362],{"class":2607},"    \"stock\"",[414,37364,7340],{"class":2705},[414,37366,37367],{"class":2601},"\"\u003Csecret-from-stock-subscription>\"",[414,37369,2757],{"class":2705},[414,37371,37372,37375,37377,37380],{"class":2593,"line":2625},[414,37373,37374],{"class":2607},"    \"menus\"",[414,37376,7340],{"class":2705},[414,37378,37379],{"class":2601},"\"\u003Csecret-from-menus-subscription>\"",[414,37381,2757],{"class":2705},[414,37383,37384,37387,37389,37392],{"class":2593,"line":2677},[414,37385,37386],{"class":2607},"    \"partner\"",[414,37388,7340],{"class":2705},[414,37390,37391],{"class":2601},"\"\u003Csecret-from-partner-subscription>\"",[414,37393,2757],{"class":2705},[414,37395,37396,37399,37401,37404],{"class":2593,"line":2751},[414,37397,37398],{"class":2607},"    \"order_updated\"",[414,37400,7340],{"class":2705},[414,37402,37403],{"class":2601},"\"\u003Csecret-from-orders-subscription>\"",[414,37405,2757],{"class":2705},[414,37407,37408,37411,37413,37416],{"class":2593,"line":2760},[414,37409,37410],{"class":2607},"    \"channel_order_updated\"",[414,37412,7340],{"class":2705},[414,37414,37415],{"class":2601},"\"\u003Csecret-from-channel-orders-subscription>\"",[414,37417,2757],{"class":2705},[414,37419,37420,37423,37425],{"class":2593,"line":2768},[414,37421,37422],{"class":2607},"    \"restaurant_availability\"",[414,37424,7340],{"class":2705},[414,37426,37427],{"class":2601},"\"\u003Csecret-from-availability-subscription>\"\n",[414,37429,37430],{"class":2593,"line":2776},[414,37431,4032],{"class":2705},[414,37433,37434],{"class":2593,"line":2784},[414,37435,3035],{"class":2705},[22,37437,37438,37439,37442,37443,37445],{},"Put this object under the connection's ",[36,37440,37441],{},"auth.meta"," (or merge into existing ",[36,37444,37441],{},").\nIf a category has no secret configured, Unified accepts the delivery without signature\nchecks (Toast treats signing as recommended, not required).",[55,37447,37449],{"id":37448},"_4-event-category-unified-object-mapping","4. Event category → Unified object mapping",[155,37451,37452,37468],{},[158,37453,37454],{},[161,37455,37456,37459,37462,37465],{},[164,37457,37458],{},"Toast event category",[164,37460,37461],{},"Toast event types",[164,37463,37464],{},"Unified object(s)",[164,37466,37467],{},"Unified webhook event",[174,37469,37470,37506,37533,37557,37587],{},[161,37471,37472,37485,37491,37502],{},[179,37473,37474,37475,37478,37479,4149,37482,2980],{},"Orders (",[36,37476,37477],{},"eventCategory"," = ",[36,37480,37481],{},"order_updated",[36,37483,37484],{},"channel_order_updated",[179,37486,37487,319,37489],{},[36,37488,37481],{},[36,37490,37484],{},[179,37492,37493,319,37496,319,37499],{},[36,37494,37495],{},"accounting_order",[36,37497,37498],{},"accounting_salesorder",[36,37500,37501],{},"payment_payment",[179,37503,37504],{},[36,37505,4953],{},[161,37507,37508,37513,37524,37529],{},[179,37509,37510],{},[36,37511,37512],{},"stock",[179,37514,37515,319,37518,319,37521],{},[36,37516,37517],{},"in_stock",[36,37519,37520],{},"out_of_stock",[36,37522,37523],{},"low_quantity",[179,37525,37526],{},[36,37527,37528],{},"commerce_inventory",[179,37530,37531],{},[36,37532,4953],{},[161,37534,37535,37540,37545,37552],{},[179,37536,37537],{},[36,37538,37539],{},"menus",[179,37541,37542],{},[36,37543,37544],{},"menus_updated",[179,37546,37547,319,37549],{},[36,37548,11161],{},[36,37550,37551],{},"commerce_collection",[179,37553,37554,37556],{},[36,37555,4953],{}," (publish signal — re-list catalog)",[161,37558,37559,37567,37578,37583],{},[179,37560,37561,10753,37564],{},[36,37562,37563],{},"restaurant_availability",[36,37565,37566],{},"restaurant_availability_toggle",[179,37568,37569,319,37572,319,37575],{},[36,37570,37571],{},"availability_online",[36,37573,37574],{},"availability_offline",[36,37576,37577],{},"toggle_availability_*",[179,37579,37580],{},[36,37581,37582],{},"commerce_availability",[179,37584,37585],{},[36,37586,4953],{},[161,37588,37589,37594,37605,37613],{},[179,37590,37591],{},[36,37592,37593],{},"partner",[179,37595,37596,319,37599,319,37602],{},[36,37597,37598],{},"partner_added",[36,37600,37601],{},"partner_updated",[36,37603,37604],{},"partner_removed",[179,37606,37607,319,37610],{},[36,37608,37609],{},"commerce_location",[36,37611,37612],{},"hris_location",[179,37614,37615,10753,37617,10753,37619],{},[36,37616,4949],{},[36,37618,4953],{},[36,37620,4959],{},[55,37622,37624],{"id":37623},"_5-create-matching-unified-native-webhooks","5. Create matching Unified native webhooks",[22,37626,37627],{},"For each row you care about in the table above:",[2510,37629,37630,37646,37652],{},[2357,37631,37632,37633,37636,37637,37639,37640,10753,37642,10753,37644,20056],{},"Create a Unified webhook with ",[36,37634,37635],{},"webhook_type: native",", the Toast ",[36,37638,85],{},", the\nobject type, and the event (",[36,37641,4949],{},[36,37643,4953],{},[36,37645,4959],{},[2357,37647,37648,37649,37651],{},"Point the webhook's delivery URL at ",[31,37650,16348],{}," application (Unified will POST converted\nunified objects there when Toast fires).",[2357,37653,37654],{},"Ensure the Toast connection's restaurant GUID matches the location that will emit events.",[55,37656,5622],{"id":5621},[155,37658,37659,37669],{},[158,37660,37661],{},[161,37662,37663,37666],{},[164,37664,37665],{},"Symptom",[164,37667,37668],{},"What to check",[174,37670,37671,37679,37695,37709,37717,37728],{},[161,37672,37673,37676],{},[179,37674,37675],{},"Toast shows failures to the URL",[179,37677,37678],{},"Workspace ID query param; HTTPS; region host",[161,37680,37681,37684],{},[179,37682,37683],{},"Toast 2xx but no Unified delivery",[179,37685,37686,37687,37690,37691,37694],{},"Native webhook exists for that object\u002Fevent; connection restaurant GUID matches ",[36,37688,37689],{},"details.restaurantGuid","; subscription marker ",[36,37692,37693],{},"toast-{guid}"," on webhook meta",[161,37696,37697,37700],{},[179,37698,37699],{},"Signature failures",[179,37701,37702,37703,34,37706,37708],{},"Secret for that ",[31,37704,37705],{},"exact",[36,37707,37477],{},"; secrets differ per category and environment",[161,37710,37711,37714],{},[179,37712,37713],{},"Empty menu payloads",[179,37715,37716],{},"Expected — treat as 're-list catalog'",[161,37718,37719,37722],{},[179,37720,37721],{},"Partner events never match",[179,37723,37724,37725],{},"Connection must already exist for that ",[36,37726,37727],{},"restaurantGuid",[161,37729,37730,37735],{},[179,37731,5728,37732,97],{},[41,37733,5733],{"href":5731,"rel":37734},[45],[179,37736],{},[4156,37738,37739],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}",{"title":2433,"searchDepth":2434,"depth":2434,"links":37741},[37742,37743,37744,37745,37746,37747,37748],{"id":2541,"depth":2434,"text":2542},{"id":37231,"depth":2434,"text":37232},{"id":37278,"depth":2434,"text":37279},{"id":37327,"depth":2434,"text":37328},{"id":37448,"depth":2434,"text":37449},{"id":37623,"depth":2434,"text":37624},{"id":5621,"depth":2434,"text":5622},"Toast pushes restaurant events to a partner webhook URL. Toast does not offer a",{"img":7949,"date":37751,"updated":37752,"tag":2457,"integrations":37242},"2026-08-12T21:48:00.000Z","2026-10-13T00:41:37.512Z","\u002Fguides\u002Fhow_to_configure_webhooks_in_toast_for_unified",{"title":37146,"description":37749},"guides\u002Fhow_to_configure_webhooks_in_toast_for_unified","o_OwL_4eIxtkIG3hsS07A2xWzywWdjj6W6UpN5itImM",{"id":37758,"title":37759,"body":37760,"description":39202,"extension":2452,"meta":39203,"navigation":2459,"path":39208,"seo":39209,"stem":39210,"__hash__":39211},"guides\u002Fguides\u002Fhow_to_connect_anthropic_to_real_time_saas_data_with_unified_mcp_server.md","How to Connect Anthropic to Real-Time SaaS Data with Unified.to MCP Server",{"type":12,"value":37761,"toc":39194},[37762,37765,37767,37772,37775,37785,37788,37792,37803,37806,37839,37843,37846,37851,38575,38579,38582,38614,38617,38621,39128,39132,39135,39170,39180,39191],[15,37763,37759],{"id":37764},"how-to-connect-anthropic-to-real-time-saas-data-with-unifiedto-mcp-server",[19,37766],{},[22,37768,37769],{},[25,37770,37771],{},"August 28, 2025",[22,37773,37774],{},"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.",[22,37776,2486,37777,37780,37781,37784],{},[41,37778,123],{"href":121,"rel":37779},[45],"'s MCP server, you can skip that complexity. ",[41,37782,123],{"href":121,"rel":37783},[45]," exposes 1663 SaaS integrations as real-time, callable tools that Claude can use directly — no custom integration logic required.",[22,37786,37787],{},"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.",[55,37789,37791],{"id":37790},"authentication","Authentication",[22,37793,37794,37795,37798,37799,37802],{},"Every request to the ",[41,37796,123],{"href":121,"rel":37797},[45]," MCP server must include a token. Send it as a bearer token in the ",[36,37800,37801],{},"Authorization: Bearer {token}"," header. Passing the token as a URL parameter is deprecated.",[22,37804,37805],{},"There are two authentication flows:",[2354,37807,37808,37820],{},[2357,37809,37810,37813,37815,37816,37819],{},[31,37811,37812],{},"Private (workspace key + connection)",[5888,37814],{},"Use your Unified.to workspace API key and add a ",[36,37817,37818],{},"connection"," parameter. This should never be exposed publicly.",[2357,37821,37822,37825,37827,37828,741,37831,37834,37835,37838],{},[31,37823,37824],{},"Public (connection-scoped)",[5888,37826],{},"Generate a connection-scoped URL with the Core MCP tool ",[36,37829,37830],{},"get_unified_connection_mcp_url",[36,37832,37833],{},"mode=user","; it returns a signed token scoped to one connection that never exposes your workspace API key. ",[36,37836,37837],{},"mode=api"," embeds your workspace API key and must not be shared.",[55,37840,37842],{"id":37841},"integrating-with-anthropic-api","Integrating with Anthropic API",[22,37844,37845],{},"Model names change often; use a current model from your provider's model list.",[22,37847,37848],{},[31,37849,37850],{},"Manual Tool Orchestration:",[2510,37852,37853,38429,38510,38516],{},[2357,37854,37855,37856,37859,37860],{},"Call Unified's ",[36,37857,37858],{},"\u002Ftools"," endpoint and pass the tool list to Claude:",[2584,37861,37865],{"className":37862,"code":37863,"language":37864,"meta":2433,"style":2433},"language-python shiki shiki-themes github-dark github-dark github-light","import os\n\nimport anthropic\nimport requests\n\nUNIFIED_API_KEY = os.environ[\"UNIFIED_API_KEY\"]\nCONNECTION_ID = os.environ[\"CONNECTION_ID\"]\n# Regional host without a path: US https:\u002F\u002Fmcp-api.unified.to, EU https:\u002F\u002Fmcp-api-eu.unified.to, AU https:\u002F\u002Fapi-au.unified.to\nUNIFIED_MCP_URL = os.environ.get(\"UNIFIED_MCP_URL\", \"https:\u002F\u002Fmcp-api.unified.to\")\n\ntools = requests.get(\n    f\"{UNIFIED_MCP_URL}\u002Ftools\",\n    headers={\"Authorization\": f\"Bearer {UNIFIED_API_KEY}\"},\n    params={\"type\": \"anthropic\", \"connection\": CONNECTION_ID},\n).json()\n\nclient = anthropic.Anthropic()  # reads ANTHROPIC_API_KEY\nmessages = [{\"role\": \"user\", \"content\": \"List the candidates and then analyse the resumes from their applications.\"}]\n\nwhile True:\n    resp = client.messages.create(\n        model=\"claude-sonnet-5-5\",\n        max_tokens=4096,\n        tools=tools,\n        messages=messages,\n    )\n    if resp.stop_reason != \"tool_use\":\n        break\n    messages.append({\"role\": \"assistant\", \"content\": resp.content})\n    results = []\n    for block in resp.content:\n        if block.type == \"tool_use\":\n            result = requests.post(\n                f\"{UNIFIED_MCP_URL}\u002Ftools\u002F{block.name}\u002Fcall\",\n                headers={\n                    \"Authorization\": f\"Bearer {UNIFIED_API_KEY}\",\n                    \"Content-Type\": \"application\u002Fjson\",\n                },\n                params={\"connection\": CONNECTION_ID},\n                json=block.input,\n            )\n            results.append({\"type\": \"tool_result\", \"tool_use_id\": block.id, \"content\": result.text})\n    messages.append({\"role\": \"user\", \"content\": results})\n\nprint(\"\".join(b.text for b in resp.content if b.type == \"text\"))\n","python",[36,37866,37867,37874,37878,37885,37892,37896,37910,37923,37928,37948,37952,37962,37977,38005,38032,38037,38041,38054,38085,38089,38100,38110,38122,38134,38144,38154,38159,38174,38179,38198,38208,38221,38235,38245,38270,38279,38296,38308,38313,38330,38340,38345,38370,38387,38391],{"__ignoreMap":2433},[414,37868,37869,37871],{"class":2593,"line":2594},[414,37870,2699],{"class":2698},[414,37872,37873],{"class":2705}," os\n",[414,37875,37876],{"class":2593,"line":2434},[414,37877,2740],{"emptyLinePlaceholder":2459},[414,37879,37880,37882],{"class":2593,"line":2613},[414,37881,2699],{"class":2698},[414,37883,37884],{"class":2705}," anthropic\n",[414,37886,37887,37889],{"class":2593,"line":2625},[414,37888,2699],{"class":2698},[414,37890,37891],{"class":2705}," requests\n",[414,37893,37894],{"class":2593,"line":2677},[414,37895,2740],{"emptyLinePlaceholder":2459},[414,37897,37898,37900,37902,37905,37908],{"class":2593,"line":2751},[414,37899,2560],{"class":2607},[414,37901,2817],{"class":2698},[414,37903,37904],{"class":2705}," os.environ[",[414,37906,37907],{"class":2601},"\"UNIFIED_API_KEY\"",[414,37909,9376],{"class":2705},[414,37911,37912,37914,37916,37918,37921],{"class":2593,"line":2760},[414,37913,28751],{"class":2607},[414,37915,2817],{"class":2698},[414,37917,37904],{"class":2705},[414,37919,37920],{"class":2601},"\"CONNECTION_ID\"",[414,37922,9376],{"class":2705},[414,37924,37925],{"class":2593,"line":2768},[414,37926,37927],{"class":3527},"# Regional host without a path: US https:\u002F\u002Fmcp-api.unified.to, EU https:\u002F\u002Fmcp-api-eu.unified.to, AU https:\u002F\u002Fapi-au.unified.to\n",[414,37929,37930,37933,37935,37938,37941,37943,37946],{"class":2593,"line":2776},[414,37931,37932],{"class":2607},"UNIFIED_MCP_URL",[414,37934,2817],{"class":2698},[414,37936,37937],{"class":2705}," os.environ.get(",[414,37939,37940],{"class":2601},"\"UNIFIED_MCP_URL\"",[414,37942,319],{"class":2705},[414,37944,37945],{"class":2601},"\"https:\u002F\u002Fmcp-api.unified.to\"",[414,37947,3141],{"class":2705},[414,37949,37950],{"class":2593,"line":2784},[414,37951,2740],{"emptyLinePlaceholder":2459},[414,37953,37954,37957,37959],{"class":2593,"line":2792},[414,37955,37956],{"class":2705},"tools ",[414,37958,2798],{"class":2698},[414,37960,37961],{"class":2705}," requests.get(\n",[414,37963,37964,37967,37969,37972,37975],{"class":2593,"line":2804},[414,37965,37966],{"class":2698},"    f",[414,37968,7395],{"class":2601},[414,37970,37971],{"class":2607},"{UNIFIED_MCP_URL}",[414,37973,37974],{"class":2601},"\u002Ftools\"",[414,37976,2757],{"class":2705},[414,37978,37979,37982,37984,37986,37989,37991,37994,37997,38000,38002],{"class":2593,"line":2809},[414,37980,37981],{"class":2971},"    headers",[414,37983,2798],{"class":2698},[414,37985,28091],{"class":2705},[414,37987,37988],{"class":2601},"\"Authorization\"",[414,37990,7340],{"class":2705},[414,37992,37993],{"class":2698},"f",[414,37995,37996],{"class":2601},"\"Bearer ",[414,37998,37999],{"class":2607},"{UNIFIED_API_KEY}",[414,38001,7395],{"class":2601},[414,38003,38004],{"class":2705},"},\n",[414,38006,38007,38010,38012,38014,38016,38018,38021,38023,38026,38028,38030],{"class":2593,"line":2829},[414,38008,38009],{"class":2971},"    params",[414,38011,2798],{"class":2698},[414,38013,28091],{"class":2705},[414,38015,8978],{"class":2601},[414,38017,7340],{"class":2705},[414,38019,38020],{"class":2601},"\"anthropic\"",[414,38022,319],{"class":2705},[414,38024,38025],{"class":2601},"\"connection\"",[414,38027,7340],{"class":2705},[414,38029,28751],{"class":2607},[414,38031,38004],{"class":2705},[414,38033,38034],{"class":2593,"line":2843},[414,38035,38036],{"class":2705},").json()\n",[414,38038,38039],{"class":2593,"line":2849},[414,38040,2740],{"emptyLinePlaceholder":2459},[414,38042,38043,38046,38048,38051],{"class":2593,"line":2854},[414,38044,38045],{"class":2705},"client ",[414,38047,2798],{"class":2698},[414,38049,38050],{"class":2705}," anthropic.Anthropic()  ",[414,38052,38053],{"class":3527},"# reads ANTHROPIC_API_KEY\n",[414,38055,38056,38059,38061,38064,38067,38069,38072,38074,38077,38079,38082],{"class":2593,"line":2880},[414,38057,38058],{"class":2705},"messages ",[414,38060,2798],{"class":2698},[414,38062,38063],{"class":2705}," [{",[414,38065,38066],{"class":2601},"\"role\"",[414,38068,7340],{"class":2705},[414,38070,38071],{"class":2601},"\"user\"",[414,38073,319],{"class":2705},[414,38075,38076],{"class":2601},"\"content\"",[414,38078,7340],{"class":2705},[414,38080,38081],{"class":2601},"\"List the candidates and then analyse the resumes from their applications.\"",[414,38083,38084],{"class":2705},"}]\n",[414,38086,38087],{"class":2593,"line":3253},[414,38088,2740],{"emptyLinePlaceholder":2459},[414,38090,38091,38094,38097],{"class":2593,"line":3261},[414,38092,38093],{"class":2698},"while",[414,38095,38096],{"class":2607}," True",[414,38098,38099],{"class":2705},":\n",[414,38101,38102,38105,38107],{"class":2593,"line":3279},[414,38103,38104],{"class":2705},"    resp ",[414,38106,2798],{"class":2698},[414,38108,38109],{"class":2705}," client.messages.create(\n",[414,38111,38112,38115,38117,38120],{"class":2593,"line":3313},[414,38113,38114],{"class":2971},"        model",[414,38116,2798],{"class":2698},[414,38118,38119],{"class":2601},"\"claude-sonnet-5-5\"",[414,38121,2757],{"class":2705},[414,38123,38124,38127,38129,38132],{"class":2593,"line":3326},[414,38125,38126],{"class":2971},"        max_tokens",[414,38128,2798],{"class":2698},[414,38130,38131],{"class":2607},"4096",[414,38133,2757],{"class":2705},[414,38135,38136,38139,38141],{"class":2593,"line":3339},[414,38137,38138],{"class":2971},"        tools",[414,38140,2798],{"class":2698},[414,38142,38143],{"class":2705},"tools,\n",[414,38145,38146,38149,38151],{"class":2593,"line":3359},[414,38147,38148],{"class":2971},"        messages",[414,38150,2798],{"class":2698},[414,38152,38153],{"class":2705},"messages,\n",[414,38155,38156],{"class":2593,"line":6453},[414,38157,38158],{"class":2705},"    )\n",[414,38160,38161,38163,38166,38169,38172],{"class":2593,"line":6459},[414,38162,25828],{"class":2698},[414,38164,38165],{"class":2705}," resp.stop_reason ",[414,38167,38168],{"class":2698},"!=",[414,38170,38171],{"class":2601}," \"tool_use\"",[414,38173,38099],{"class":2705},[414,38175,38176],{"class":2593,"line":6465},[414,38177,38178],{"class":2698},"        break\n",[414,38180,38181,38184,38186,38188,38191,38193,38195],{"class":2593,"line":6471},[414,38182,38183],{"class":2705},"    messages.append({",[414,38185,38066],{"class":2601},[414,38187,7340],{"class":2705},[414,38189,38190],{"class":2601},"\"assistant\"",[414,38192,319],{"class":2705},[414,38194,38076],{"class":2601},[414,38196,38197],{"class":2705},": resp.content})\n",[414,38199,38200,38203,38205],{"class":2593,"line":6477},[414,38201,38202],{"class":2705},"    results ",[414,38204,2798],{"class":2698},[414,38206,38207],{"class":2705}," []\n",[414,38209,38210,38212,38215,38218],{"class":2593,"line":6483},[414,38211,31134],{"class":2698},[414,38213,38214],{"class":2705}," block ",[414,38216,38217],{"class":2698},"in",[414,38219,38220],{"class":2705}," resp.content:\n",[414,38222,38223,38225,38228,38231,38233],{"class":2593,"line":6489},[414,38224,25092],{"class":2698},[414,38226,38227],{"class":2705}," block.type ",[414,38229,38230],{"class":2698},"==",[414,38232,38171],{"class":2601},[414,38234,38099],{"class":2705},[414,38236,38237,38240,38242],{"class":2593,"line":6495},[414,38238,38239],{"class":2705},"            result ",[414,38241,2798],{"class":2698},[414,38243,38244],{"class":2705}," requests.post(\n",[414,38246,38247,38250,38252,38254,38257,38259,38262,38265,38268],{"class":2593,"line":6501},[414,38248,38249],{"class":2698},"                f",[414,38251,7395],{"class":2601},[414,38253,37971],{"class":2607},[414,38255,38256],{"class":2601},"\u002Ftools\u002F",[414,38258,28091],{"class":2607},[414,38260,38261],{"class":2705},"block.name",[414,38263,38264],{"class":2607},"}",[414,38266,38267],{"class":2601},"\u002Fcall\"",[414,38269,2757],{"class":2705},[414,38271,38272,38275,38277],{"class":2593,"line":6507},[414,38273,38274],{"class":2971},"                headers",[414,38276,2798],{"class":2698},[414,38278,8916],{"class":2705},[414,38280,38281,38284,38286,38288,38290,38292,38294],{"class":2593,"line":6513},[414,38282,38283],{"class":2601},"                    \"Authorization\"",[414,38285,7340],{"class":2705},[414,38287,37993],{"class":2698},[414,38289,37996],{"class":2601},[414,38291,37999],{"class":2607},[414,38293,7395],{"class":2601},[414,38295,2757],{"class":2705},[414,38297,38298,38301,38303,38306],{"class":2593,"line":6519},[414,38299,38300],{"class":2601},"                    \"Content-Type\"",[414,38302,7340],{"class":2705},[414,38304,38305],{"class":2601},"\"application\u002Fjson\"",[414,38307,2757],{"class":2705},[414,38309,38310],{"class":2593,"line":6525},[414,38311,38312],{"class":2705},"                },\n",[414,38314,38315,38318,38320,38322,38324,38326,38328],{"class":2593,"line":6531},[414,38316,38317],{"class":2971},"                params",[414,38319,2798],{"class":2698},[414,38321,28091],{"class":2705},[414,38323,38025],{"class":2601},[414,38325,7340],{"class":2705},[414,38327,28751],{"class":2607},[414,38329,38004],{"class":2705},[414,38331,38332,38335,38337],{"class":2593,"line":6537},[414,38333,38334],{"class":2971},"                json",[414,38336,2798],{"class":2698},[414,38338,38339],{"class":2705},"block.input,\n",[414,38341,38342],{"class":2593,"line":6543},[414,38343,38344],{"class":2705},"            )\n",[414,38346,38347,38350,38352,38354,38357,38359,38362,38365,38367],{"class":2593,"line":6549},[414,38348,38349],{"class":2705},"            results.append({",[414,38351,8978],{"class":2601},[414,38353,7340],{"class":2705},[414,38355,38356],{"class":2601},"\"tool_result\"",[414,38358,319],{"class":2705},[414,38360,38361],{"class":2601},"\"tool_use_id\"",[414,38363,38364],{"class":2705},": block.id, ",[414,38366,38076],{"class":2601},[414,38368,38369],{"class":2705},": result.text})\n",[414,38371,38372,38374,38376,38378,38380,38382,38384],{"class":2593,"line":6555},[414,38373,38183],{"class":2705},[414,38375,38066],{"class":2601},[414,38377,7340],{"class":2705},[414,38379,38071],{"class":2601},[414,38381,319],{"class":2705},[414,38383,38076],{"class":2601},[414,38385,38386],{"class":2705},": results})\n",[414,38388,38389],{"class":2593,"line":6561},[414,38390,2740],{"emptyLinePlaceholder":2459},[414,38392,38393,38396,38398,38401,38404,38407,38410,38412,38415,38418,38421,38423,38426],{"class":2593,"line":6567},[414,38394,38395],{"class":2607},"print",[414,38397,2968],{"class":2705},[414,38399,38400],{"class":2601},"\"\"",[414,38402,38403],{"class":2705},".join(b.text ",[414,38405,38406],{"class":2698},"for",[414,38408,38409],{"class":2705}," b ",[414,38411,38217],{"class":2698},[414,38413,38414],{"class":2705}," resp.content ",[414,38416,38417],{"class":2698},"if",[414,38419,38420],{"class":2705}," b.type ",[414,38422,38230],{"class":2698},[414,38424,38425],{"class":2601}," \"text\"",[414,38427,38428],{"class":2705},"))\n",[2357,38430,38431,38432,38435,38436],{},"Claude will return a ",[36,38433,38434],{},"tool_use"," block:",[2584,38437,38439],{"className":7323,"code":38438,"language":7325,"meta":2433,"style":2433},"[\n  {\n    \"type\": \"tool_use\",\n    \"id\": \"toolu_...\",\n    \"name\": \"list_candidates\",\n    \"input\": { \"limit\": \"100\" }\n  }\n]\n",[36,38440,38441,38445,38449,38460,38472,38484,38502,38506],{"__ignoreMap":2433},[414,38442,38443],{"class":2593,"line":2594},[414,38444,9310],{"class":2705},[414,38446,38447],{"class":2593,"line":2434},[414,38448,18235],{"class":2705},[414,38450,38451,38453,38455,38458],{"class":2593,"line":2613},[414,38452,7337],{"class":2607},[414,38454,7340],{"class":2705},[414,38456,38457],{"class":2601},"\"tool_use\"",[414,38459,2757],{"class":2705},[414,38461,38462,38465,38467,38470],{"class":2593,"line":2625},[414,38463,38464],{"class":2607},"    \"id\"",[414,38466,7340],{"class":2705},[414,38468,38469],{"class":2601},"\"toolu_...\"",[414,38471,2757],{"class":2705},[414,38473,38474,38477,38479,38482],{"class":2593,"line":2677},[414,38475,38476],{"class":2607},"    \"name\"",[414,38478,7340],{"class":2705},[414,38480,38481],{"class":2601},"\"list_candidates\"",[414,38483,2757],{"class":2705},[414,38485,38486,38489,38492,38495,38497,38500],{"class":2593,"line":2751},[414,38487,38488],{"class":2607},"    \"input\"",[414,38490,38491],{"class":2705},": { ",[414,38493,38494],{"class":2607},"\"limit\"",[414,38496,7340],{"class":2705},[414,38498,38499],{"class":2601},"\"100\"",[414,38501,8986],{"class":2705},[414,38503,38504],{"class":2593,"line":2760},[414,38505,4032],{"class":2705},[414,38507,38508],{"class":2593,"line":2768},[414,38509,9376],{"class":2705},[2357,38511,37855,38512,38515],{},[36,38513,38514],{},"\u002Ftools\u002F{id}\u002Fcall"," endpoint with the arguments.",[2357,38517,38518,38519,38522,38523],{},"Append Claude's response as an assistant message, then return the result as a ",[36,38520,38521],{},"tool_result"," block at the start of the next user message:",[2584,38524,38526],{"className":7323,"code":38525,"language":7325,"meta":2433,"style":2433},"[\n  {\n    \"type\": \"tool_result\",\n    \"tool_use_id\": \"toolu_...\",\n    \"content\": \"...\"\n  }\n]\n",[36,38527,38528,38532,38536,38546,38557,38567,38571],{"__ignoreMap":2433},[414,38529,38530],{"class":2593,"line":2594},[414,38531,9310],{"class":2705},[414,38533,38534],{"class":2593,"line":2434},[414,38535,18235],{"class":2705},[414,38537,38538,38540,38542,38544],{"class":2593,"line":2613},[414,38539,7337],{"class":2607},[414,38541,7340],{"class":2705},[414,38543,38356],{"class":2601},[414,38545,2757],{"class":2705},[414,38547,38548,38551,38553,38555],{"class":2593,"line":2625},[414,38549,38550],{"class":2607},"    \"tool_use_id\"",[414,38552,7340],{"class":2705},[414,38554,38469],{"class":2601},[414,38556,2757],{"class":2705},[414,38558,38559,38562,38564],{"class":2593,"line":2677},[414,38560,38561],{"class":2607},"    \"content\"",[414,38563,7340],{"class":2705},[414,38565,38566],{"class":2601},"\"...\"\n",[414,38568,38569],{"class":2593,"line":2751},[414,38570,4032],{"class":2705},[414,38572,38573],{"class":2593,"line":2760},[414,38574,9376],{"class":2705},[55,38576,38578],{"id":38577},"controlling-tool-access","Controlling Tool Access",[22,38580,38581],{},"Unified.to MCP gives you granular control over how tools are exposed to Anthropic:",[2354,38583,38584,38590,38596,38602,38608],{},[2357,38585,38586,38589],{},[36,38587,38588],{},"permissions"," → restrict available scopes.",[2357,38591,38592,38595],{},[36,38593,38594],{},"tools"," → allowlist specific tool IDs.",[2357,38597,38598,38601],{},[36,38599,38600],{},"aliases"," → adds extra descriptions to improve tool matching.",[2357,38603,38604,38607],{},[36,38605,38606],{},"hide_sensitive=true"," → strips names, emails and phone numbers from results.",[2357,38609,38610,38613],{},[36,38611,38612],{},"include_external_tools=true"," → expose all vendor API endpoints, not just Unified.to's normalized models.",[22,38615,38616],{},"These options help you keep Anthropic outputs predictable and secure in production-grade workflows.",[3629,38618,38620],{"id":38619},"sample-snippet","Sample Snippet",[2584,38622,38624],{"className":16485,"code":38623,"language":16487,"meta":2433,"style":2433},"import Anthropic from '@anthropic-ai\u002Fsdk';\n\u002F\u002F Claude model\nconst model = 'claude-sonnet-5-5';\n\u002F\u002F Unified connection ID that the MCP server should use\nconst connection = process.env.CONNECTION_ID;\n\u002F\u002F Regional host without a path: US https:\u002F\u002Fmcp-api.unified.to, EU https:\u002F\u002Fmcp-api-eu.unified.to, AU https:\u002F\u002Fapi-au.unified.to\nconst UNIFIED_MCP_URL = process.env.UNIFIED_MCP_URL || 'https:\u002F\u002Fmcp-api.unified.to';\n\u002F\u002F Set to true to expose the vendor's own API endpoints as tools\nconst includeExternal = false;\nconst message = 'List the candidates and then analyse the resumes from their applications.';\n\u002F\u002F Optional: list of specific tools that you want to use\nconst toolIds = ['get_messaging_message','list_messaging_message']\n\nconst params = new URLSearchParams({\n    connection,\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 = `${UNIFIED_MCP_URL}\u002Fmcp?${params.toString()}`;\n\nconst completion = await anthropic.beta.messages.create({\n    model,\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: serverUrl,\n            name: 'unifiedMCP',\n            \u002F\u002F Anthropic calls the MCP server, so send a connection-scoped signed token\n            \u002F\u002F (one connection only); the workspace API key stays on your server\n            authorization_token: process.env.UNIFIED_MCP_TOKEN,\n        },\n    ],\n    tools: [{ type: 'mcp_toolset', mcp_server_name: 'unifiedMCP' }],\n    betas: ['mcp-client-2025-11-20'],\n});\n\nconsole.log('response', JSON.stringify(completion, null, 2));\n",[36,38625,38626,38640,38645,38659,38664,38679,38684,38704,38709,38723,38736,38741,38763,38767,38782,38787,38804,38808,38812,38828,38853,38857,38861,38877,38886,38890,38894,38924,38928,38946,38951,38960,38965,38969,38978,38983,38987,38991,39000,39005,39009,39019,39024,39034,39039,39044,39054,39058,39062,39077,39087,39091,39095],{"__ignoreMap":2433},[414,38627,38628,38630,38633,38635,38638],{"class":2593,"line":2594},[414,38629,2699],{"class":2698},[414,38631,38632],{"class":2705}," Anthropic ",[414,38634,2716],{"class":2698},[414,38636,38637],{"class":2601}," '@anthropic-ai\u002Fsdk'",[414,38639,2706],{"class":2705},[414,38641,38642],{"class":2593,"line":2434},[414,38643,38644],{"class":3527},"\u002F\u002F Claude model\n",[414,38646,38647,38649,38652,38654,38657],{"class":2593,"line":2613},[414,38648,2745],{"class":2698},[414,38650,38651],{"class":2607}," model",[414,38653,2817],{"class":2698},[414,38655,38656],{"class":2601}," 'claude-sonnet-5-5'",[414,38658,2706],{"class":2705},[414,38660,38661],{"class":2593,"line":2625},[414,38662,38663],{"class":3527},"\u002F\u002F Unified connection ID that the MCP server should use\n",[414,38665,38666,38668,38671,38673,38675,38677],{"class":2593,"line":2677},[414,38667,2745],{"class":2698},[414,38669,38670],{"class":2607}," connection",[414,38672,2817],{"class":2698},[414,38674,25869],{"class":2705},[414,38676,28751],{"class":2607},[414,38678,2706],{"class":2705},[414,38680,38681],{"class":2593,"line":2751},[414,38682,38683],{"class":3527},"\u002F\u002F Regional host without a path: US https:\u002F\u002Fmcp-api.unified.to, EU https:\u002F\u002Fmcp-api-eu.unified.to, AU https:\u002F\u002Fapi-au.unified.to\n",[414,38685,38686,38688,38691,38693,38695,38697,38699,38702],{"class":2593,"line":2760},[414,38687,2745],{"class":2698},[414,38689,38690],{"class":2607}," UNIFIED_MCP_URL",[414,38692,2817],{"class":2698},[414,38694,25869],{"class":2705},[414,38696,37932],{"class":2607},[414,38698,26046],{"class":2698},[414,38700,38701],{"class":2601}," 'https:\u002F\u002Fmcp-api.unified.to'",[414,38703,2706],{"class":2705},[414,38705,38706],{"class":2593,"line":2768},[414,38707,38708],{"class":3527},"\u002F\u002F Set to true to expose the vendor's own API endpoints as tools\n",[414,38710,38711,38713,38716,38718,38721],{"class":2593,"line":2776},[414,38712,2745],{"class":2698},[414,38714,38715],{"class":2607}," includeExternal",[414,38717,2817],{"class":2698},[414,38719,38720],{"class":2607}," false",[414,38722,2706],{"class":2705},[414,38724,38725,38727,38729,38731,38734],{"class":2593,"line":2784},[414,38726,2745],{"class":2698},[414,38728,29663],{"class":2607},[414,38730,2817],{"class":2698},[414,38732,38733],{"class":2601}," 'List the candidates and then analyse the resumes from their applications.'",[414,38735,2706],{"class":2705},[414,38737,38738],{"class":2593,"line":2792},[414,38739,38740],{"class":3527},"\u002F\u002F Optional: list of specific tools that you want to use\n",[414,38742,38743,38745,38748,38750,38753,38756,38758,38761],{"class":2593,"line":2804},[414,38744,2745],{"class":2698},[414,38746,38747],{"class":2607}," toolIds",[414,38749,2817],{"class":2698},[414,38751,38752],{"class":2705}," [",[414,38754,38755],{"class":2601},"'get_messaging_message'",[414,38757,11464],{"class":2705},[414,38759,38760],{"class":2601},"'list_messaging_message'",[414,38762,9376],{"class":2705},[414,38764,38765],{"class":2593,"line":2809},[414,38766,2740],{"emptyLinePlaceholder":2459},[414,38768,38769,38771,38774,38776,38778,38780],{"class":2593,"line":2829},[414,38770,2745],{"class":2698},[414,38772,38773],{"class":2607}," params",[414,38775,2817],{"class":2698},[414,38777,2820],{"class":2698},[414,38779,28144],{"class":2597},[414,38781,2826],{"class":2705},[414,38783,38784],{"class":2593,"line":2843},[414,38785,38786],{"class":2705},"    connection,\n",[414,38788,38789,38792,38794,38797,38799,38802],{"class":2593,"line":2849},[414,38790,38791],{"class":2705},"    include_external_tools: includeExternal ",[414,38793,3610],{"class":2698},[414,38795,38796],{"class":2601}," 'true'",[414,38798,36969],{"class":2698},[414,38800,38801],{"class":2601}," 'false'",[414,38803,2757],{"class":2705},[414,38805,38806],{"class":2593,"line":2854},[414,38807,2846],{"class":2705},[414,38809,38810],{"class":2593,"line":2880},[414,38811,2740],{"emptyLinePlaceholder":2459},[414,38813,38814,38816,38819,38821,38824,38826],{"class":2593,"line":3253},[414,38815,38417],{"class":2698},[414,38817,38818],{"class":2705}," (toolIds.",[414,38820,25098],{"class":2607},[414,38822,38823],{"class":2698}," >",[414,38825,24954],{"class":2607},[414,38827,3826],{"class":2705},[414,38829,38830,38833,38836,38838,38841,38844,38846,38848,38851],{"class":2593,"line":3261},[414,38831,38832],{"class":2705},"    params.",[414,38834,38835],{"class":2597},"append",[414,38837,2968],{"class":2705},[414,38839,38840],{"class":2601},"'tools'",[414,38842,38843],{"class":2705},", toolIds.",[414,38845,3148],{"class":2597},[414,38847,2968],{"class":2705},[414,38849,38850],{"class":2601},"','",[414,38852,35656],{"class":2705},[414,38854,38855],{"class":2593,"line":3279},[414,38856,3035],{"class":2705},[414,38858,38859],{"class":2593,"line":3313},[414,38860,2740],{"emptyLinePlaceholder":2459},[414,38862,38863,38865,38868,38870,38872,38875],{"class":2593,"line":3326},[414,38864,2745],{"class":2698},[414,38866,38867],{"class":2607}," anthropic",[414,38869,2817],{"class":2698},[414,38871,2820],{"class":2698},[414,38873,38874],{"class":2597}," Anthropic",[414,38876,2826],{"class":2705},[414,38878,38879,38881,38884],{"class":2593,"line":3339},[414,38880,30547],{"class":2705},[414,38882,38883],{"class":2607},"ANTHROPIC_API_KEY",[414,38885,2757],{"class":2705},[414,38887,38888],{"class":2593,"line":3359},[414,38889,2846],{"class":2705},[414,38891,38892],{"class":2593,"line":6453},[414,38893,2740],{"emptyLinePlaceholder":2459},[414,38895,38896,38898,38901,38903,38905,38907,38910,38913,38915,38917,38920,38922],{"class":2593,"line":6459},[414,38897,2745],{"class":2698},[414,38899,38900],{"class":2607}," serverUrl",[414,38902,2817],{"class":2698},[414,38904,3113],{"class":2601},[414,38906,37932],{"class":2607},[414,38908,38909],{"class":2601},"}\u002Fmcp?${",[414,38911,38912],{"class":2705},"params",[414,38914,97],{"class":2601},[414,38916,24233],{"class":2597},[414,38918,38919],{"class":2601},"()",[414,38921,3308],{"class":2601},[414,38923,2706],{"class":2705},[414,38925,38926],{"class":2593,"line":6465},[414,38927,2740],{"emptyLinePlaceholder":2459},[414,38929,38930,38932,38935,38937,38939,38942,38944],{"class":2593,"line":6471},[414,38931,2745],{"class":2698},[414,38933,38934],{"class":2607}," completion",[414,38936,2817],{"class":2698},[414,38938,3002],{"class":2698},[414,38940,38941],{"class":2705}," anthropic.beta.messages.",[414,38943,28901],{"class":2597},[414,38945,2826],{"class":2705},[414,38947,38948],{"class":2593,"line":6477},[414,38949,38950],{"class":2705},"    model,\n",[414,38952,38953,38956,38958],{"class":2593,"line":6483},[414,38954,38955],{"class":2705},"    max_tokens: ",[414,38957,32816],{"class":2607},[414,38959,2757],{"class":2705},[414,38961,38962],{"class":2593,"line":6489},[414,38963,38964],{"class":2705},"    messages: [\n",[414,38966,38967],{"class":2593,"line":6495},[414,38968,10590],{"class":2705},[414,38970,38971,38974,38976],{"class":2593,"line":6501},[414,38972,38973],{"class":2705},"            role: ",[414,38975,30893],{"class":2601},[414,38977,2757],{"class":2705},[414,38979,38980],{"class":2593,"line":6507},[414,38981,38982],{"class":2705},"            content: message,\n",[414,38984,38985],{"class":2593,"line":6513},[414,38986,3768],{"class":2705},[414,38988,38989],{"class":2593,"line":6519},[414,38990,3778],{"class":2705},[414,38992,38993,38996,38998],{"class":2593,"line":6525},[414,38994,38995],{"class":2705},"    stream: ",[414,38997,10771],{"class":2607},[414,38999,2757],{"class":2705},[414,39001,39002],{"class":2593,"line":6531},[414,39003,39004],{"class":2705},"    mcp_servers: [\n",[414,39006,39007],{"class":2593,"line":6537},[414,39008,10590],{"class":2705},[414,39010,39011,39014,39017],{"class":2593,"line":6543},[414,39012,39013],{"class":2705},"            type: ",[414,39015,39016],{"class":2601},"'url'",[414,39018,2757],{"class":2705},[414,39020,39021],{"class":2593,"line":6549},[414,39022,39023],{"class":2705},"            url: serverUrl,\n",[414,39025,39026,39029,39032],{"class":2593,"line":6555},[414,39027,39028],{"class":2705},"            name: ",[414,39030,39031],{"class":2601},"'unifiedMCP'",[414,39033,2757],{"class":2705},[414,39035,39036],{"class":2593,"line":6561},[414,39037,39038],{"class":3527},"            \u002F\u002F Anthropic calls the MCP server, so send a connection-scoped signed token\n",[414,39040,39041],{"class":2593,"line":6567},[414,39042,39043],{"class":3527},"            \u002F\u002F (one connection only); the workspace API key stays on your server\n",[414,39045,39046,39049,39052],{"class":2593,"line":6573},[414,39047,39048],{"class":2705},"            authorization_token: process.env.",[414,39050,39051],{"class":2607},"UNIFIED_MCP_TOKEN",[414,39053,2757],{"class":2705},[414,39055,39056],{"class":2593,"line":6579},[414,39057,3768],{"class":2705},[414,39059,39060],{"class":2593,"line":6585},[414,39061,3778],{"class":2705},[414,39063,39064,39067,39070,39073,39075],{"class":2593,"line":6591},[414,39065,39066],{"class":2705},"    tools: [{ type: ",[414,39068,39069],{"class":2601},"'mcp_toolset'",[414,39071,39072],{"class":2705},", mcp_server_name: ",[414,39074,39031],{"class":2601},[414,39076,10469],{"class":2705},[414,39078,39079,39082,39085],{"class":2593,"line":6597},[414,39080,39081],{"class":2705},"    betas: [",[414,39083,39084],{"class":2601},"'mcp-client-2025-11-20'",[414,39086,10497],{"class":2705},[414,39088,39089],{"class":2593,"line":6603},[414,39090,2846],{"class":2705},[414,39092,39093],{"class":2593,"line":6609},[414,39094,2740],{"emptyLinePlaceholder":2459},[414,39096,39097,39100,39102,39104,39107,39109,39111,39113,39115,39118,39121,39123,39126],{"class":2593,"line":6615},[414,39098,39099],{"class":2705},"console.",[414,39101,4064],{"class":2597},[414,39103,2968],{"class":2705},[414,39105,39106],{"class":2601},"'response'",[414,39108,319],{"class":2705},[414,39110,24222],{"class":2607},[414,39112,97],{"class":2705},[414,39114,24227],{"class":2597},[414,39116,39117],{"class":2705},"(completion, ",[414,39119,39120],{"class":2607},"null",[414,39122,319],{"class":2705},[414,39124,39125],{"class":2607},"2",[414,39127,35656],{"class":2705},[55,39129,39131],{"id":39130},"coverage-and-infrastructure","Coverage and Infrastructure",[22,39133,39134],{},"Unified.to MCP is built for real-world AI use cases:",[2354,39136,39137,39143,39149,39158,39164],{},[2357,39138,39139,39142],{},[31,39140,39141],{},"22,566 real-time tools"," (growing weekly)",[2357,39144,39145,39148],{},[31,39146,39147],{},"1663 integrations across 36 categories"," (ATS, CRM, HRIS, Accounting, Messaging, File Storage, and more)",[2357,39150,39151,7340,39154,39157],{},[31,39152,39153],{},"No stored customer records",[41,39155,123],{"href":121,"rel":39156},[45]," stores no customer records; logs hold operational metadata only",[2357,39159,39160,39163],{},[31,39161,39162],{},"Scoped security controls"," — permissions, aliases, and PII redaction",[2357,39165,39166,39169],{},[31,39167,39168],{},"Multi-region deployment"," — US, EU, and AU data centers for compliance",[22,39171,39172,39175,39176,39179],{},[41,39173,123],{"href":121,"rel":39174},[45]," MCP works with major LLM providers, including ",[31,39177,39178],{},"OpenAI, Anthropic, Google Gemini and Cohere."," That means you can build once and connect to any agent client.",[22,39181,39182,4149,39187],{},[41,39183,39186],{"href":39184,"rel":39185},"https:\u002F\u002Fdocs.unified.to\u002Fmcp?utm_source=chatgpt.com",[45],"Explore the MCP docs",[41,39188,4154],{"href":39189,"rel":39190},"https:\u002F\u002Fcalendly.com\u002Fd\u002Fcph9-g8n-jzg\u002Fconnect-with-unified?utm_source=chatgpt.com",[45],[4156,39192,39193],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}",{"title":2433,"searchDepth":2434,"depth":2434,"links":39195},[39196,39197,39198,39201],{"id":37790,"depth":2434,"text":37791},{"id":37841,"depth":2434,"text":37842},{"id":38577,"depth":2434,"text":38578,"children":39199},[39200],{"id":38619,"depth":2613,"text":38620},{"id":39130,"depth":2434,"text":39131},"Anthropic's Claude models can power sophisticated workflows — but most products still need access to live customer data from CRMs, ATSs, HRIS, or accounting...",{"img":39204,"date":39205,"updated":39206,"tag":2457,"integrations":39207},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_connect_anthropic_to_real_time_saas_data_with_unified_mcp_server-icon.png","2025-08-28T00:00:00.000Z","2026-10-09T18:39:18.205Z","anthropic","\u002Fguides\u002Fhow_to_connect_anthropic_to_real_time_saas_data_with_unified_mcp_server",{"title":37759,"description":39202},"guides\u002Fhow_to_connect_anthropic_to_real_time_saas_data_with_unified_mcp_server","GFOSaCC-Z_QKcfQkhxzQ30HONPFb6JS35XZhcI8bpP0",{"id":39213,"title":39214,"body":39215,"description":40593,"extension":2452,"meta":40594,"navigation":2459,"path":40598,"seo":40599,"stem":40600,"__hash__":40601},"guides\u002Fguides\u002Fhow_to_connect_cohere_to_real_time_saas_data_with_unified_mcp_server.md","How to Connect Cohere to Real-Time SaaS Data with Unified.to MCP Server",{"type":12,"value":39216,"toc":40581},[39217,39220,39222,39226,39229,39238,39241,39243,39250,39252,39274,39282,39289,39293,39817,39821,39826,39835,39840,39856,39860,39869,39873,39876,39898,39901,39903,40525,40527,40533,40558,40561,40563,40570,40579],[15,39218,39214],{"id":39219},"how-to-connect-cohere-to-real-time-saas-data-with-unifiedto-mcp-server",[19,39221],{},[22,39223,39224],{},[25,39225,37771],{},[22,39227,39228],{},"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.",[22,39230,2486,39231,37780,39234,39237],{},[41,39232,123],{"href":121,"rel":39233},[45],[41,39235,123],{"href":121,"rel":39236},[45]," exposes 1663 SaaS integrations as real-time, callable tools that Cohere can use directly — no custom integration logic required.",[22,39239,39240],{},"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.",[55,39242,37791],{"id":37790},[22,39244,37794,39245,37798,39248,37802],{},[41,39246,123],{"href":121,"rel":39247},[45],[36,39249,37801],{},[22,39251,37805],{},[2354,39253,39254,39262],{},[2357,39255,39256,39258,37815,39260,37819],{},[31,39257,37812],{},[5888,39259],{},[36,39261,37818],{},[2357,39263,39264,39266,37827,39268,741,39270,37834,39272,37838],{},[31,39265,37824],{},[5888,39267],{},[36,39269,37830],{},[36,39271,37833],{},[36,39273,37837],{},[55,39275,39277,39278,39281],{"id":39276},"integrating-unifiedto-mcp-server-with-cohere","Integrating ",[41,39279,123],{"href":121,"rel":39280},[45]," MCP Server with Cohere",[22,39283,39284,39285,39288],{},"Cohere's chat API can directly consume tools defined by ",[41,39286,123],{"href":121,"rel":39287},[45]," MCP. Model names change often; use a current model from your provider's model list.",[22,39290,39291],{},[31,39292,37850],{},[2510,39294,39295,39796,39802],{},[2357,39296,37855,39297,39300,39301],{},[36,39298,39299],{},"\u002Ftools?type=cohere"," endpoint and pass the tool list to Cohere:",[2584,39302,39304],{"className":37862,"code":39303,"language":37864,"meta":2433,"style":2433},"import os\n\nimport cohere\nimport requests\n\nUNIFIED_API_KEY = os.environ[\"UNIFIED_API_KEY\"]\nCONNECTION_ID = os.environ[\"CONNECTION_ID\"]\n# Regional host without a path: US https:\u002F\u002Fmcp-api.unified.to, EU https:\u002F\u002Fmcp-api-eu.unified.to, AU https:\u002F\u002Fapi-au.unified.to\nUNIFIED_MCP_URL = os.environ.get(\"UNIFIED_MCP_URL\", \"https:\u002F\u002Fmcp-api.unified.to\")\nMODEL = \"command-a-plus-05-2026\"\n\ntools = requests.get(\n    f\"{UNIFIED_MCP_URL}\u002Ftools\",\n    headers={\"Authorization\": f\"Bearer {UNIFIED_API_KEY}\"},\n    params={\"type\": \"cohere\", \"connection\": CONNECTION_ID},\n).json()\n\nco = cohere.ClientV2(api_key=os.environ[\"COHERE_API_KEY\"])\nmessages = [{\"role\": \"user\", \"content\": \"Score this candidate for the Software Engineer job.\"}]\nresponse = co.chat(model=MODEL, messages=messages, tools=tools)\n\nwhile response.message.tool_calls:\n    messages.append(response.message)\n    for tc in response.message.tool_calls:\n        result = requests.post(\n            f\"{UNIFIED_MCP_URL}\u002Ftools\u002F{tc.function.name}\u002Fcall\",\n            headers={\n                \"Authorization\": f\"Bearer {UNIFIED_API_KEY}\",\n                \"Content-Type\": \"application\u002Fjson\",\n            },\n            params={\"connection\": CONNECTION_ID},\n            data=tc.function.arguments or \"{}\",\n        )\n        messages.append({\n            \"role\": \"tool\",\n            \"tool_call_id\": tc.id,\n            \"content\": [{\"type\": \"document\", \"document\": {\"data\": result.text}}],\n        })\n    response = co.chat(model=MODEL, messages=messages, tools=tools)\n\nprint(response.message.content[0].text)\n",[36,39305,39306,39312,39316,39323,39329,39333,39345,39357,39361,39377,39387,39391,39399,39411,39433,39458,39462,39466,39490,39515,39548,39552,39559,39564,39575,39584,39606,39615,39632,39643,39648,39665,39688,39693,39698,39710,39718,39746,39751,39780,39784],{"__ignoreMap":2433},[414,39307,39308,39310],{"class":2593,"line":2594},[414,39309,2699],{"class":2698},[414,39311,37873],{"class":2705},[414,39313,39314],{"class":2593,"line":2434},[414,39315,2740],{"emptyLinePlaceholder":2459},[414,39317,39318,39320],{"class":2593,"line":2613},[414,39319,2699],{"class":2698},[414,39321,39322],{"class":2705}," cohere\n",[414,39324,39325,39327],{"class":2593,"line":2625},[414,39326,2699],{"class":2698},[414,39328,37891],{"class":2705},[414,39330,39331],{"class":2593,"line":2677},[414,39332,2740],{"emptyLinePlaceholder":2459},[414,39334,39335,39337,39339,39341,39343],{"class":2593,"line":2751},[414,39336,2560],{"class":2607},[414,39338,2817],{"class":2698},[414,39340,37904],{"class":2705},[414,39342,37907],{"class":2601},[414,39344,9376],{"class":2705},[414,39346,39347,39349,39351,39353,39355],{"class":2593,"line":2760},[414,39348,28751],{"class":2607},[414,39350,2817],{"class":2698},[414,39352,37904],{"class":2705},[414,39354,37920],{"class":2601},[414,39356,9376],{"class":2705},[414,39358,39359],{"class":2593,"line":2768},[414,39360,37927],{"class":3527},[414,39362,39363,39365,39367,39369,39371,39373,39375],{"class":2593,"line":2776},[414,39364,37932],{"class":2607},[414,39366,2817],{"class":2698},[414,39368,37937],{"class":2705},[414,39370,37940],{"class":2601},[414,39372,319],{"class":2705},[414,39374,37945],{"class":2601},[414,39376,3141],{"class":2705},[414,39378,39379,39382,39384],{"class":2593,"line":2784},[414,39380,39381],{"class":2607},"MODEL",[414,39383,2817],{"class":2698},[414,39385,39386],{"class":2601}," \"command-a-plus-05-2026\"\n",[414,39388,39389],{"class":2593,"line":2792},[414,39390,2740],{"emptyLinePlaceholder":2459},[414,39392,39393,39395,39397],{"class":2593,"line":2804},[414,39394,37956],{"class":2705},[414,39396,2798],{"class":2698},[414,39398,37961],{"class":2705},[414,39400,39401,39403,39405,39407,39409],{"class":2593,"line":2809},[414,39402,37966],{"class":2698},[414,39404,7395],{"class":2601},[414,39406,37971],{"class":2607},[414,39408,37974],{"class":2601},[414,39410,2757],{"class":2705},[414,39412,39413,39415,39417,39419,39421,39423,39425,39427,39429,39431],{"class":2593,"line":2829},[414,39414,37981],{"class":2971},[414,39416,2798],{"class":2698},[414,39418,28091],{"class":2705},[414,39420,37988],{"class":2601},[414,39422,7340],{"class":2705},[414,39424,37993],{"class":2698},[414,39426,37996],{"class":2601},[414,39428,37999],{"class":2607},[414,39430,7395],{"class":2601},[414,39432,38004],{"class":2705},[414,39434,39435,39437,39439,39441,39443,39445,39448,39450,39452,39454,39456],{"class":2593,"line":2843},[414,39436,38009],{"class":2971},[414,39438,2798],{"class":2698},[414,39440,28091],{"class":2705},[414,39442,8978],{"class":2601},[414,39444,7340],{"class":2705},[414,39446,39447],{"class":2601},"\"cohere\"",[414,39449,319],{"class":2705},[414,39451,38025],{"class":2601},[414,39453,7340],{"class":2705},[414,39455,28751],{"class":2607},[414,39457,38004],{"class":2705},[414,39459,39460],{"class":2593,"line":2849},[414,39461,38036],{"class":2705},[414,39463,39464],{"class":2593,"line":2854},[414,39465,2740],{"emptyLinePlaceholder":2459},[414,39467,39468,39471,39473,39476,39479,39481,39484,39487],{"class":2593,"line":2880},[414,39469,39470],{"class":2705},"co ",[414,39472,2798],{"class":2698},[414,39474,39475],{"class":2705}," cohere.ClientV2(",[414,39477,39478],{"class":2971},"api_key",[414,39480,2798],{"class":2698},[414,39482,39483],{"class":2705},"os.environ[",[414,39485,39486],{"class":2601},"\"COHERE_API_KEY\"",[414,39488,39489],{"class":2705},"])\n",[414,39491,39492,39494,39496,39498,39500,39502,39504,39506,39508,39510,39513],{"class":2593,"line":3253},[414,39493,38058],{"class":2705},[414,39495,2798],{"class":2698},[414,39497,38063],{"class":2705},[414,39499,38066],{"class":2601},[414,39501,7340],{"class":2705},[414,39503,38071],{"class":2601},[414,39505,319],{"class":2705},[414,39507,38076],{"class":2601},[414,39509,7340],{"class":2705},[414,39511,39512],{"class":2601},"\"Score this candidate for the Software Engineer job.\"",[414,39514,38084],{"class":2705},[414,39516,39517,39520,39522,39525,39528,39530,39532,39534,39536,39538,39541,39543,39545],{"class":2593,"line":3261},[414,39518,39519],{"class":2705},"response ",[414,39521,2798],{"class":2698},[414,39523,39524],{"class":2705}," co.chat(",[414,39526,39527],{"class":2971},"model",[414,39529,2798],{"class":2698},[414,39531,39381],{"class":2607},[414,39533,319],{"class":2705},[414,39535,20738],{"class":2971},[414,39537,2798],{"class":2698},[414,39539,39540],{"class":2705},"messages, ",[414,39542,38594],{"class":2971},[414,39544,2798],{"class":2698},[414,39546,39547],{"class":2705},"tools)\n",[414,39549,39550],{"class":2593,"line":3279},[414,39551,2740],{"emptyLinePlaceholder":2459},[414,39553,39554,39556],{"class":2593,"line":3313},[414,39555,38093],{"class":2698},[414,39557,39558],{"class":2705}," response.message.tool_calls:\n",[414,39560,39561],{"class":2593,"line":3326},[414,39562,39563],{"class":2705},"    messages.append(response.message)\n",[414,39565,39566,39568,39571,39573],{"class":2593,"line":3339},[414,39567,31134],{"class":2698},[414,39569,39570],{"class":2705}," tc ",[414,39572,38217],{"class":2698},[414,39574,39558],{"class":2705},[414,39576,39577,39580,39582],{"class":2593,"line":3359},[414,39578,39579],{"class":2705},"        result ",[414,39581,2798],{"class":2698},[414,39583,38244],{"class":2705},[414,39585,39586,39589,39591,39593,39595,39597,39600,39602,39604],{"class":2593,"line":6453},[414,39587,39588],{"class":2698},"            f",[414,39590,7395],{"class":2601},[414,39592,37971],{"class":2607},[414,39594,38256],{"class":2601},[414,39596,28091],{"class":2607},[414,39598,39599],{"class":2705},"tc.function.name",[414,39601,38264],{"class":2607},[414,39603,38267],{"class":2601},[414,39605,2757],{"class":2705},[414,39607,39608,39611,39613],{"class":2593,"line":6459},[414,39609,39610],{"class":2971},"            headers",[414,39612,2798],{"class":2698},[414,39614,8916],{"class":2705},[414,39616,39617,39620,39622,39624,39626,39628,39630],{"class":2593,"line":6465},[414,39618,39619],{"class":2601},"                \"Authorization\"",[414,39621,7340],{"class":2705},[414,39623,37993],{"class":2698},[414,39625,37996],{"class":2601},[414,39627,37999],{"class":2607},[414,39629,7395],{"class":2601},[414,39631,2757],{"class":2705},[414,39633,39634,39637,39639,39641],{"class":2593,"line":6471},[414,39635,39636],{"class":2601},"                \"Content-Type\"",[414,39638,7340],{"class":2705},[414,39640,38305],{"class":2601},[414,39642,2757],{"class":2705},[414,39644,39645],{"class":2593,"line":6477},[414,39646,39647],{"class":2705},"            },\n",[414,39649,39650,39653,39655,39657,39659,39661,39663],{"class":2593,"line":6483},[414,39651,39652],{"class":2971},"            params",[414,39654,2798],{"class":2698},[414,39656,28091],{"class":2705},[414,39658,38025],{"class":2601},[414,39660,7340],{"class":2705},[414,39662,28751],{"class":2607},[414,39664,38004],{"class":2705},[414,39666,39667,39670,39672,39675,39678,39681,39684,39686],{"class":2593,"line":6489},[414,39668,39669],{"class":2971},"            data",[414,39671,2798],{"class":2698},[414,39673,39674],{"class":2705},"tc.function.arguments ",[414,39676,39677],{"class":2698},"or",[414,39679,39680],{"class":2601}," \"",[414,39682,39683],{"class":2607},"{}",[414,39685,7395],{"class":2601},[414,39687,2757],{"class":2705},[414,39689,39690],{"class":2593,"line":6495},[414,39691,39692],{"class":2705},"        )\n",[414,39694,39695],{"class":2593,"line":6501},[414,39696,39697],{"class":2705},"        messages.append({\n",[414,39699,39700,39703,39705,39708],{"class":2593,"line":6507},[414,39701,39702],{"class":2601},"            \"role\"",[414,39704,7340],{"class":2705},[414,39706,39707],{"class":2601},"\"tool\"",[414,39709,2757],{"class":2705},[414,39711,39712,39715],{"class":2593,"line":6513},[414,39713,39714],{"class":2601},"            \"tool_call_id\"",[414,39716,39717],{"class":2705},": tc.id,\n",[414,39719,39720,39723,39726,39728,39730,39733,39735,39737,39740,39743],{"class":2593,"line":6519},[414,39721,39722],{"class":2601},"            \"content\"",[414,39724,39725],{"class":2705},": [{",[414,39727,8978],{"class":2601},[414,39729,7340],{"class":2705},[414,39731,39732],{"class":2601},"\"document\"",[414,39734,319],{"class":2705},[414,39736,39732],{"class":2601},[414,39738,39739],{"class":2705},": {",[414,39741,39742],{"class":2601},"\"data\"",[414,39744,39745],{"class":2705},": result.text}}],\n",[414,39747,39748],{"class":2593,"line":6525},[414,39749,39750],{"class":2705},"        })\n",[414,39752,39753,39756,39758,39760,39762,39764,39766,39768,39770,39772,39774,39776,39778],{"class":2593,"line":6531},[414,39754,39755],{"class":2705},"    response ",[414,39757,2798],{"class":2698},[414,39759,39524],{"class":2705},[414,39761,39527],{"class":2971},[414,39763,2798],{"class":2698},[414,39765,39381],{"class":2607},[414,39767,319],{"class":2705},[414,39769,20738],{"class":2971},[414,39771,2798],{"class":2698},[414,39773,39540],{"class":2705},[414,39775,38594],{"class":2971},[414,39777,2798],{"class":2698},[414,39779,39547],{"class":2705},[414,39781,39782],{"class":2593,"line":6537},[414,39783,2740],{"emptyLinePlaceholder":2459},[414,39785,39786,39788,39791,39793],{"class":2593,"line":6543},[414,39787,38395],{"class":2607},[414,39789,39790],{"class":2705},"(response.message.content[",[414,39792,3604],{"class":2607},[414,39794,39795],{"class":2705},"].text)\n",[2357,39797,39798,39799,39801],{},"When Cohere requests a tool call, call Unified's ",[36,39800,38514],{}," endpoint.",[2357,39803,39804,39805,39808,39809,39812,39813,39816],{},"Append the assistant message and a ",[36,39806,39807],{},"tool"," message with the ",[36,39810,39811],{},"tool_call_id"," and the result, then call ",[36,39814,39815],{},"co.chat"," again until Cohere stops requesting tools.",[3629,39818,39820],{"id":39819},"example-prompt-and-response","Example Prompt and Response",[22,39822,39823],{},[31,39824,39825],{},"Prompt:",[2584,39827,39829],{"className":2649,"code":39828,"language":2651,"meta":2652,"style":2433},"\"Score this candidate for the Software Engineer job.\"\n",[36,39830,39831],{"__ignoreMap":2433},[414,39832,39833],{"class":2593,"line":2594},[414,39834,39828],{},[22,39836,39837],{},[31,39838,39839],{},"What happens:",[2354,39841,39842,39845,39850,39853],{},[2357,39843,39844],{},"Your app passes Cohere the tools Unified MCP exposes for the connection.",[2357,39846,39847,39848,97],{},"Cohere requests the tools that fetch the candidate and the job, and your app runs each call through ",[36,39849,38514],{},[2357,39851,39852],{},"Cohere scores the candidate from the returned data.",[2357,39854,39855],{},"Cohere returns a response like:",[22,39857,39858],{},[31,39859,9300],{},[2584,39861,39863],{"className":2649,"code":39862,"language":2651,"meta":2652,"style":2433},"Candidate Jane Doe scored 92\u002F100 for the Software Engineer job. Strengths: Python, distributed systems. Recommended for interview.\n",[36,39864,39865],{"__ignoreMap":2433},[414,39866,39867],{"class":2593,"line":2594},[414,39868,39862],{},[55,39870,39872],{"id":39871},"advanced-mcp-options","Advanced MCP Options",[22,39874,39875],{},"Unified.to MCP gives you granular control over how tools are exposed to Cohere:",[2354,39877,39878,39882,39886,39890,39894],{},[2357,39879,39880,38589],{},[36,39881,38588],{},[2357,39883,39884,38595],{},[36,39885,38594],{},[2357,39887,39888,38601],{},[36,39889,38600],{},[2357,39891,39892,38607],{},[36,39893,38606],{},[2357,39895,39896,38613],{},[36,39897,38612],{},[22,39899,39900],{},"These options help you keep Cohere outputs predictable and secure in production-grade workflows.",[3629,39902,38620],{"id":38619},[2584,39904,39906],{"className":16485,"code":39905,"language":16487,"meta":2433,"style":2433},"import { CohereClientV2 } from 'cohere-ai';\n\n\u002F\u002F Unified connection ID that the tools should use\nconst connection = process.env.CONNECTION_ID;\n\u002F\u002F Regional host without a path: US https:\u002F\u002Fmcp-api.unified.to, EU https:\u002F\u002Fmcp-api-eu.unified.to, AU https:\u002F\u002Fapi-au.unified.to\nconst UNIFIED_MCP_URL = process.env.UNIFIED_MCP_URL || 'https:\u002F\u002Fmcp-api.unified.to';\n\u002F\u002F Set to true to expose the vendor's own API endpoints as tools\nconst includeExternal = false;\nconst message = 'Score this candidate for the Software Engineer job.';\n\u002F\u002F 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    connection,\n    include_external_tools: includeExternal ? 'true' : 'false',\n});\n\nif (toolIds.length > 0) {\n    params.append('tools', toolIds.join(','));\n}\n\n\u002F\u002F type selects the tool-list format and applies to GET \u002Ftools only\nconst toolsParams = new URLSearchParams(params);\ntoolsParams.set('type', 'cohere');\n\nconst tools = await fetch(`${UNIFIED_MCP_URL}\u002Ftools?${toolsParams.toString()}`, {\n    headers: { Authorization: `Bearer ${process.env.UNIFIED_API_KEY}` },\n});\nconst toolsJson = await tools.json();\nconst completion = await cohereClient.chat({\n    model: 'command-a-plus-05-2026',\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    \u002F\u002F call mcp server with toolCallId\n    const toolCallResponse = await fetch(`${UNIFIED_MCP_URL}\u002Ftools\u002F${toolCall.function?.name}\u002Fcall?${params.toString()}`, {\n        method: 'POST',\n        headers: {\n            Authorization: `Bearer ${process.env.UNIFIED_API_KEY}`,\n            'Content-Type': 'application\u002Fjson',\n        },\n        body: toolCall.function?.arguments || '{}',\n    });\n    const toolCallResponseJson = await toolCallResponse.json();\n    console.log(JSON.stringify(toolCallResponseJson, null, 2));\n}\n",[36,39907,39908,39922,39926,39931,39945,39949,39967,39971,39983,39996,40000,40018,40034,40048,40052,40056,40070,40074,40088,40092,40096,40110,40130,40134,40138,40143,40159,40179,40183,40220,40243,40247,40265,40282,40291,40295,40299,40307,40311,40315,40319,40324,40328,40332,40336,40357,40362,40411,40420,40425,40446,40458,40462,40474,40478,40496,40521],{"__ignoreMap":2433},[414,39909,39910,39912,39915,39917,39920],{"class":2593,"line":2594},[414,39911,2699],{"class":2698},[414,39913,39914],{"class":2705}," { CohereClientV2 } ",[414,39916,2716],{"class":2698},[414,39918,39919],{"class":2601}," 'cohere-ai'",[414,39921,2706],{"class":2705},[414,39923,39924],{"class":2593,"line":2434},[414,39925,2740],{"emptyLinePlaceholder":2459},[414,39927,39928],{"class":2593,"line":2613},[414,39929,39930],{"class":3527},"\u002F\u002F Unified connection ID that the tools should use\n",[414,39932,39933,39935,39937,39939,39941,39943],{"class":2593,"line":2625},[414,39934,2745],{"class":2698},[414,39936,38670],{"class":2607},[414,39938,2817],{"class":2698},[414,39940,25869],{"class":2705},[414,39942,28751],{"class":2607},[414,39944,2706],{"class":2705},[414,39946,39947],{"class":2593,"line":2677},[414,39948,38683],{"class":3527},[414,39950,39951,39953,39955,39957,39959,39961,39963,39965],{"class":2593,"line":2751},[414,39952,2745],{"class":2698},[414,39954,38690],{"class":2607},[414,39956,2817],{"class":2698},[414,39958,25869],{"class":2705},[414,39960,37932],{"class":2607},[414,39962,26046],{"class":2698},[414,39964,38701],{"class":2601},[414,39966,2706],{"class":2705},[414,39968,39969],{"class":2593,"line":2760},[414,39970,38708],{"class":3527},[414,39972,39973,39975,39977,39979,39981],{"class":2593,"line":2768},[414,39974,2745],{"class":2698},[414,39976,38715],{"class":2607},[414,39978,2817],{"class":2698},[414,39980,38720],{"class":2607},[414,39982,2706],{"class":2705},[414,39984,39985,39987,39989,39991,39994],{"class":2593,"line":2776},[414,39986,2745],{"class":2698},[414,39988,29663],{"class":2607},[414,39990,2817],{"class":2698},[414,39992,39993],{"class":2601}," 'Score this candidate for the Software Engineer job.'",[414,39995,2706],{"class":2705},[414,39997,39998],{"class":2593,"line":2784},[414,39999,38740],{"class":3527},[414,40001,40002,40004,40006,40008,40010,40012,40014,40016],{"class":2593,"line":2792},[414,40003,2745],{"class":2698},[414,40005,38747],{"class":2607},[414,40007,2817],{"class":2698},[414,40009,38752],{"class":2705},[414,40011,38755],{"class":2601},[414,40013,11464],{"class":2705},[414,40015,38760],{"class":2601},[414,40017,9376],{"class":2705},[414,40019,40020,40022,40025,40027,40029,40032],{"class":2593,"line":2804},[414,40021,2745],{"class":2698},[414,40023,40024],{"class":2607}," cohereClient",[414,40026,2817],{"class":2698},[414,40028,2820],{"class":2698},[414,40030,40031],{"class":2597}," CohereClientV2",[414,40033,2826],{"class":2705},[414,40035,40036,40039,40042,40044,40046],{"class":2593,"line":2809},[414,40037,40038],{"class":2705},"    token: process.env.",[414,40040,40041],{"class":2607},"COHERE_API_KEY",[414,40043,26046],{"class":2698},[414,40045,3734],{"class":2601},[414,40047,2757],{"class":2705},[414,40049,40050],{"class":2593,"line":2829},[414,40051,2846],{"class":2705},[414,40053,40054],{"class":2593,"line":2843},[414,40055,2740],{"emptyLinePlaceholder":2459},[414,40057,40058,40060,40062,40064,40066,40068],{"class":2593,"line":2849},[414,40059,2745],{"class":2698},[414,40061,38773],{"class":2607},[414,40063,2817],{"class":2698},[414,40065,2820],{"class":2698},[414,40067,28144],{"class":2597},[414,40069,2826],{"class":2705},[414,40071,40072],{"class":2593,"line":2854},[414,40073,38786],{"class":2705},[414,40075,40076,40078,40080,40082,40084,40086],{"class":2593,"line":2880},[414,40077,38791],{"class":2705},[414,40079,3610],{"class":2698},[414,40081,38796],{"class":2601},[414,40083,36969],{"class":2698},[414,40085,38801],{"class":2601},[414,40087,2757],{"class":2705},[414,40089,40090],{"class":2593,"line":3253},[414,40091,2846],{"class":2705},[414,40093,40094],{"class":2593,"line":3261},[414,40095,2740],{"emptyLinePlaceholder":2459},[414,40097,40098,40100,40102,40104,40106,40108],{"class":2593,"line":3279},[414,40099,38417],{"class":2698},[414,40101,38818],{"class":2705},[414,40103,25098],{"class":2607},[414,40105,38823],{"class":2698},[414,40107,24954],{"class":2607},[414,40109,3826],{"class":2705},[414,40111,40112,40114,40116,40118,40120,40122,40124,40126,40128],{"class":2593,"line":3313},[414,40113,38832],{"class":2705},[414,40115,38835],{"class":2597},[414,40117,2968],{"class":2705},[414,40119,38840],{"class":2601},[414,40121,38843],{"class":2705},[414,40123,3148],{"class":2597},[414,40125,2968],{"class":2705},[414,40127,38850],{"class":2601},[414,40129,35656],{"class":2705},[414,40131,40132],{"class":2593,"line":3326},[414,40133,3035],{"class":2705},[414,40135,40136],{"class":2593,"line":3339},[414,40137,2740],{"emptyLinePlaceholder":2459},[414,40139,40140],{"class":2593,"line":3359},[414,40141,40142],{"class":3527},"\u002F\u002F type selects the tool-list format and applies to GET \u002Ftools only\n",[414,40144,40145,40147,40150,40152,40154,40156],{"class":2593,"line":6453},[414,40146,2745],{"class":2698},[414,40148,40149],{"class":2607}," toolsParams",[414,40151,2817],{"class":2698},[414,40153,2820],{"class":2698},[414,40155,28144],{"class":2597},[414,40157,40158],{"class":2705},"(params);\n",[414,40160,40161,40164,40167,40169,40172,40174,40177],{"class":2593,"line":6459},[414,40162,40163],{"class":2705},"toolsParams.",[414,40165,40166],{"class":2597},"set",[414,40168,2968],{"class":2705},[414,40170,40171],{"class":2601},"'type'",[414,40173,319],{"class":2705},[414,40175,40176],{"class":2601},"'cohere'",[414,40178,3156],{"class":2705},[414,40180,40181],{"class":2593,"line":6465},[414,40182,2740],{"emptyLinePlaceholder":2459},[414,40184,40185,40187,40190,40192,40194,40196,40198,40201,40203,40206,40209,40211,40213,40215,40217],{"class":2593,"line":6471},[414,40186,2745],{"class":2698},[414,40188,40189],{"class":2607}," tools",[414,40191,2817],{"class":2698},[414,40193,3002],{"class":2698},[414,40195,28452],{"class":2597},[414,40197,2968],{"class":2705},[414,40199,40200],{"class":2601},"`${",[414,40202,37932],{"class":2607},[414,40204,40205],{"class":2601},"}\u002Ftools?${",[414,40207,40208],{"class":2705},"toolsParams",[414,40210,97],{"class":2601},[414,40212,24233],{"class":2597},[414,40214,38919],{"class":2601},[414,40216,3308],{"class":2601},[414,40218,40219],{"class":2705},", {\n",[414,40221,40222,40225,40227,40230,40232,40235,40237,40239,40241],{"class":2593,"line":6477},[414,40223,40224],{"class":2705},"    headers: { Authorization: ",[414,40226,24527],{"class":2601},[414,40228,40229],{"class":2705},"process",[414,40231,97],{"class":2601},[414,40233,40234],{"class":2705},"env",[414,40236,97],{"class":2601},[414,40238,2560],{"class":2607},[414,40240,3308],{"class":2601},[414,40242,2840],{"class":2705},[414,40244,40245],{"class":2593,"line":6483},[414,40246,2846],{"class":2705},[414,40248,40249,40251,40254,40256,40258,40261,40263],{"class":2593,"line":6489},[414,40250,2745],{"class":2698},[414,40252,40253],{"class":2607}," toolsJson",[414,40255,2817],{"class":2698},[414,40257,3002],{"class":2698},[414,40259,40260],{"class":2705}," tools.",[414,40262,7325],{"class":2597},[414,40264,4088],{"class":2705},[414,40266,40267,40269,40271,40273,40275,40278,40280],{"class":2593,"line":6495},[414,40268,2745],{"class":2698},[414,40270,38934],{"class":2607},[414,40272,2817],{"class":2698},[414,40274,3002],{"class":2698},[414,40276,40277],{"class":2705}," cohereClient.",[414,40279,30878],{"class":2597},[414,40281,2826],{"class":2705},[414,40283,40284,40286,40289],{"class":2593,"line":6501},[414,40285,35183],{"class":2705},[414,40287,40288],{"class":2601},"'command-a-plus-05-2026'",[414,40290,2757],{"class":2705},[414,40292,40293],{"class":2593,"line":6507},[414,40294,38964],{"class":2705},[414,40296,40297],{"class":2593,"line":6513},[414,40298,10590],{"class":2705},[414,40300,40301,40303,40305],{"class":2593,"line":6519},[414,40302,38973],{"class":2705},[414,40304,30893],{"class":2601},[414,40306,2757],{"class":2705},[414,40308,40309],{"class":2593,"line":6525},[414,40310,38982],{"class":2705},[414,40312,40313],{"class":2593,"line":6531},[414,40314,3768],{"class":2705},[414,40316,40317],{"class":2593,"line":6537},[414,40318,3778],{"class":2705},[414,40320,40321],{"class":2593,"line":6543},[414,40322,40323],{"class":2705},"    tools: toolsJson,\n",[414,40325,40326],{"class":2593,"line":6549},[414,40327,2846],{"class":2705},[414,40329,40330],{"class":2593,"line":6555},[414,40331,2740],{"emptyLinePlaceholder":2459},[414,40333,40334],{"class":2593,"line":6561},[414,40335,2740],{"emptyLinePlaceholder":2459},[414,40337,40338,40340,40342,40344,40347,40349,40352,40354],{"class":2593,"line":6567},[414,40339,38406],{"class":2698},[414,40341,3970],{"class":2705},[414,40343,2745],{"class":2698},[414,40345,40346],{"class":2607}," toolCall",[414,40348,3978],{"class":2698},[414,40350,40351],{"class":2705}," completion?.message?.toolCalls ",[414,40353,32868],{"class":2698},[414,40355,40356],{"class":2705}," []) {\n",[414,40358,40359],{"class":2593,"line":6573},[414,40360,40361],{"class":3527},"    \u002F\u002F call mcp server with toolCallId\n",[414,40363,40364,40366,40369,40371,40373,40375,40377,40379,40381,40384,40387,40389,40391,40394,40396,40399,40401,40403,40405,40407,40409],{"class":2593,"line":6579},[414,40365,3986],{"class":2698},[414,40367,40368],{"class":2607}," toolCallResponse",[414,40370,2817],{"class":2698},[414,40372,3002],{"class":2698},[414,40374,28452],{"class":2597},[414,40376,2968],{"class":2705},[414,40378,40200],{"class":2601},[414,40380,37932],{"class":2607},[414,40382,40383],{"class":2601},"}\u002Ftools\u002F${",[414,40385,40386],{"class":2705},"toolCall",[414,40388,97],{"class":2601},[414,40390,16512],{"class":2705},[414,40392,40393],{"class":2601},"?.",[414,40395,9043],{"class":2705},[414,40397,40398],{"class":2601},"}\u002Fcall?${",[414,40400,38912],{"class":2705},[414,40402,97],{"class":2601},[414,40404,24233],{"class":2597},[414,40406,38919],{"class":2601},[414,40408,3308],{"class":2601},[414,40410,40219],{"class":2705},[414,40412,40413,40416,40418],{"class":2593,"line":6585},[414,40414,40415],{"class":2705},"        method: ",[414,40417,29388],{"class":2601},[414,40419,2757],{"class":2705},[414,40421,40422],{"class":2593,"line":6591},[414,40423,40424],{"class":2705},"        headers: {\n",[414,40426,40427,40430,40432,40434,40436,40438,40440,40442,40444],{"class":2593,"line":6597},[414,40428,40429],{"class":2705},"            Authorization: ",[414,40431,24527],{"class":2601},[414,40433,40229],{"class":2705},[414,40435,97],{"class":2601},[414,40437,40234],{"class":2705},[414,40439,97],{"class":2601},[414,40441,2560],{"class":2607},[414,40443,3308],{"class":2601},[414,40445,2757],{"class":2705},[414,40447,40448,40451,40453,40456],{"class":2593,"line":6603},[414,40449,40450],{"class":2601},"            'Content-Type'",[414,40452,7340],{"class":2705},[414,40454,40455],{"class":2601},"'application\u002Fjson'",[414,40457,2757],{"class":2705},[414,40459,40460],{"class":2593,"line":6609},[414,40461,3768],{"class":2705},[414,40463,40464,40467,40469,40472],{"class":2593,"line":6615},[414,40465,40466],{"class":2705},"        body: toolCall.function?.arguments ",[414,40468,32868],{"class":2698},[414,40470,40471],{"class":2601}," '{}'",[414,40473,2757],{"class":2705},[414,40475,40476],{"class":2593,"line":6621},[414,40477,25779],{"class":2705},[414,40479,40480,40482,40485,40487,40489,40492,40494],{"class":2593,"line":6627},[414,40481,3986],{"class":2698},[414,40483,40484],{"class":2607}," toolCallResponseJson",[414,40486,2817],{"class":2698},[414,40488,3002],{"class":2698},[414,40490,40491],{"class":2705}," toolCallResponse.",[414,40493,7325],{"class":2597},[414,40495,4088],{"class":2705},[414,40497,40498,40500,40502,40504,40506,40508,40510,40513,40515,40517,40519],{"class":2593,"line":6633},[414,40499,28184],{"class":2705},[414,40501,4064],{"class":2597},[414,40503,2968],{"class":2705},[414,40505,24222],{"class":2607},[414,40507,97],{"class":2705},[414,40509,24227],{"class":2597},[414,40511,40512],{"class":2705},"(toolCallResponseJson, ",[414,40514,39120],{"class":2607},[414,40516,319],{"class":2705},[414,40518,39125],{"class":2607},[414,40520,35656],{"class":2705},[414,40522,40523],{"class":2593,"line":6639},[414,40524,3035],{"class":2705},[55,40526,39131],{"id":39130},[22,40528,40529,40532],{},[41,40530,123],{"href":121,"rel":40531},[45]," MCP runs as part of the Unified API:",[2354,40534,40535,40539,40543,40550,40554],{},[2357,40536,40537,39142],{},[31,40538,39141],{},[2357,40540,40541,39148],{},[31,40542,39147],{},[2357,40544,40545,7340,40547,39157],{},[31,40546,39153],{},[41,40548,123],{"href":121,"rel":40549},[45],[2357,40551,40552,39163],{},[31,40553,39162],{},[2357,40555,40556,39169],{},[31,40557,39168],{},[22,40559,40560],{},"This ensures your Cohere workflows aren't just demos — they're secure, scalable, and designed for production-grade use cases.",[55,40562,21285],{"id":16754},[22,40564,40565,39175,40568,39179],{},[41,40566,123],{"href":121,"rel":40567},[45],[31,40569,39178],{},[22,40571,40572,4149,40575,40578],{},[41,40573,39186],{"href":39184,"rel":40574},[45],[41,40576,4154],{"href":39189,"rel":40577},[45]," to see it live in action.",[4156,40580,39193],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":40582},[40583,40584,40588,40591,40592],{"id":37790,"depth":2434,"text":37791},{"id":39276,"depth":2434,"text":40585,"children":40586},"Integrating Unified.to MCP Server with Cohere",[40587],{"id":39819,"depth":2613,"text":39820},{"id":39871,"depth":2434,"text":39872,"children":40589},[40590],{"id":38619,"depth":2613,"text":38620},{"id":39130,"depth":2434,"text":39131},{"id":16754,"depth":2434,"text":21285},"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...",{"img":40595,"date":39205,"updated":40596,"tag":2457,"integrations":40597},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_connect_cohere_to_real_time_saas_data_with_unified_mcp_server-icon.png","2026-10-09T14:46:31.160Z","cohere","\u002Fguides\u002Fhow_to_connect_cohere_to_real_time_saas_data_with_unified_mcp_server",{"title":39214,"description":40593},"guides\u002Fhow_to_connect_cohere_to_real_time_saas_data_with_unified_mcp_server","eH_i6F4vcFCe6lxougTsEq0nU5YZO2j1uIcYcClY7uA",{"id":40603,"title":40604,"body":40605,"description":41435,"extension":2452,"meta":41436,"navigation":2459,"path":41440,"seo":41441,"stem":41442,"__hash__":41443},"guides\u002Fguides\u002Fhow_to_connect_google_gemini_to_real_time_saas_data_with_unified_mcp_server.md","How to Connect Google Gemini to Real-Time SaaS Data with Unified.to MCP Server",{"type":12,"value":40606,"toc":41427},[40607,40610,40612,40616,40623,40642,40645,40647,40654,40656,40678,40682,40684,40688,40839,40841,40844,40866,40869,40872,41375,41377,41379,41404,41411,41424],[15,40608,40604],{"id":40609},"how-to-connect-google-gemini-to-real-time-saas-data-with-unifiedto-mcp-server",[19,40611],{},[22,40613,40614],{},[25,40615,37771],{},[22,40617,40618,40619,40622],{},"Google Gemini can power powerful workflows — but most products still need access to ",[31,40620,40621],{},"live customer data"," from CRMs, ATSs, HRIS, or accounting systems. That usually means writing brittle glue code, normalizing APIs, and maintaining webhook jobs.",[22,40624,2486,40625,40630,40633,40634,40637,40638,40641],{},[41,40626,40628],{"href":121,"rel":40627},[45],[31,40629,123],{},[31,40631,40632],{},"'s MCP server",", you can skip that complexity. ",[41,40635,123],{"href":121,"rel":40636},[45]," exposes 1663 SaaS integrations as ",[31,40639,40640],{},"real-time, callable tools"," that Gemini can use directly — no custom integration logic required.",[22,40643,40644],{},"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.",[55,40646,37791],{"id":37790},[22,40648,37794,40649,37798,40652,37802],{},[41,40650,123],{"href":121,"rel":40651},[45],[36,40653,37801],{},[22,40655,37805],{},[2354,40657,40658,40666],{},[2357,40659,40660,40662,37815,40664,37819],{},[31,40661,37812],{},[5888,40663],{},[36,40665,37818],{},[2357,40667,40668,40670,37827,40672,741,40674,37834,40676,37838],{},[31,40669,37824],{},[5888,40671],{},[36,40673,37830],{},[36,40675,37833],{},[36,40677,37837],{},[55,40679,40681],{"id":40680},"integrating-with-google-gemini-api","Integrating with Google Gemini API",[22,40683,37845],{},[22,40685,40686],{},[31,40687,37850],{},[2510,40689,40690,40700,40740,40744],{},[2357,40691,37855,40692,40695,40696,40699],{},[36,40693,40694],{},"\u002Ftools?type=gemini"," endpoint and pass the tool list as ",[36,40697,40698],{},"function_declarations"," to Gemini.",[2357,40701,40702,40703],{},"Gemini will return a function call request:",[2584,40704,40706],{"className":2649,"code":40705,"language":2651,"meta":2652,"style":2433},"{\n  \"functionCall\": {\n    \"id\": \"...\",\n    \"name\": \"list_candidates\",\n    \"args\": { \"limit\": \"100\" }\n  }\n}\n",[36,40707,40708,40712,40717,40722,40727,40732,40736],{"__ignoreMap":2433},[414,40709,40710],{"class":2593,"line":2594},[414,40711,8916],{},[414,40713,40714],{"class":2593,"line":2434},[414,40715,40716],{},"  \"functionCall\": {\n",[414,40718,40719],{"class":2593,"line":2613},[414,40720,40721],{},"    \"id\": \"...\",\n",[414,40723,40724],{"class":2593,"line":2625},[414,40725,40726],{},"    \"name\": \"list_candidates\",\n",[414,40728,40729],{"class":2593,"line":2677},[414,40730,40731],{},"    \"args\": { \"limit\": \"100\" }\n",[414,40733,40734],{"class":2593,"line":2751},[414,40735,4032],{},[414,40737,40738],{"class":2593,"line":2760},[414,40739,3035],{},[2357,40741,37855,40742,39801],{},[36,40743,38514],{},[2357,40745,40746,40747,40750,40751],{},"Respond to Gemini with the tool result as a ",[36,40748,40749],{},"functionResponse"," in your next message:",[2584,40752,40754],{"className":7323,"code":40753,"language":7325,"meta":2433,"style":2433},"{\n  \"role\": \"user\",\n  \"parts\": [\n    {\n      \"functionResponse\": {\n        \"id\": \"...\",\n        \"name\": \"list_candidates\",\n        \"response\": { ... }\n      }\n    }\n  ]\n}\n",[36,40755,40756,40760,40771,40778,40782,40789,40801,40812,40823,40827,40831,40835],{"__ignoreMap":2433},[414,40757,40758],{"class":2593,"line":2594},[414,40759,8916],{"class":2705},[414,40761,40762,40765,40767,40769],{"class":2593,"line":2434},[414,40763,40764],{"class":2607},"  \"role\"",[414,40766,7340],{"class":2705},[414,40768,38071],{"class":2601},[414,40770,2757],{"class":2705},[414,40772,40773,40776],{"class":2593,"line":2613},[414,40774,40775],{"class":2607},"  \"parts\"",[414,40777,8960],{"class":2705},[414,40779,40780],{"class":2593,"line":2625},[414,40781,15559],{"class":2705},[414,40783,40784,40787],{"class":2593,"line":2677},[414,40785,40786],{"class":2607},"      \"functionResponse\"",[414,40788,10477],{"class":2705},[414,40790,40791,40794,40796,40799],{"class":2593,"line":2751},[414,40792,40793],{"class":2607},"        \"id\"",[414,40795,7340],{"class":2705},[414,40797,40798],{"class":2601},"\"...\"",[414,40800,2757],{"class":2705},[414,40802,40803,40806,40808,40810],{"class":2593,"line":2760},[414,40804,40805],{"class":2607},"        \"name\"",[414,40807,7340],{"class":2705},[414,40809,38481],{"class":2601},[414,40811,2757],{"class":2705},[414,40813,40814,40817,40819,40821],{"class":2593,"line":2768},[414,40815,40816],{"class":2607},"        \"response\"",[414,40818,38491],{"class":2705},[414,40820,25045],{"class":7401},[414,40822,8986],{"class":2705},[414,40824,40825],{"class":2593,"line":2776},[414,40826,28493],{"class":2705},[414,40828,40829],{"class":2593,"line":2784},[414,40830,10535],{"class":2705},[414,40832,40833],{"class":2593,"line":2792},[414,40834,8991],{"class":2705},[414,40836,40837],{"class":2593,"line":2804},[414,40838,3035],{"class":2705},[55,40840,38578],{"id":38577},[22,40842,40843],{},"Unified.to MCP gives you granular control over how tools are exposed to Gemini:",[2354,40845,40846,40850,40854,40858,40862],{},[2357,40847,40848,38589],{},[36,40849,38588],{},[2357,40851,40852,38595],{},[36,40853,38594],{},[2357,40855,40856,38601],{},[36,40857,38600],{},[2357,40859,40860,38607],{},[36,40861,38606],{},[2357,40863,40864,38613],{},[36,40865,38612],{},[22,40867,40868],{},"These options help you keep Gemini outputs predictable and secure in production-grade workflows.",[3629,40870,40871],{"id":38619},"Sample Snippet:",[2584,40873,40875],{"className":16485,"code":40874,"language":16487,"meta":2433,"style":2433},"import { GoogleGenAI, mcpToTool } from '@google\u002Fgenai';\nimport { Client } from '@modelcontextprotocol\u002Fsdk\u002Fclient\u002Findex.js';\nimport { StreamableHTTPClientTransport } from '@modelcontextprotocol\u002Fsdk\u002Fclient\u002FstreamableHttp.js';\n\u002F\u002F Construct a new GEMINI client via GoogleGenAI\n\n\u002F\u002F Gemini model\nconst model = 'gemini-3.8-flash';\n\u002F\u002F Unified connection ID that the MCP server should use\nconst connection = process.env.CONNECTION_ID;\n\u002F\u002F Regional host without a path: US https:\u002F\u002Fmcp-api.unified.to, EU https:\u002F\u002Fmcp-api-eu.unified.to, AU https:\u002F\u002Fapi-au.unified.to\nconst UNIFIED_MCP_URL = process.env.UNIFIED_MCP_URL || 'https:\u002F\u002Fmcp-api.unified.to';\nconst message = 'Score this candidate for the Software Engineer job.';\n\u002F\u002F 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\u002F\u002F Construct the required params\nconst params = new URLSearchParams({\n    connection,\n    include_external_tools: 'true', \u002F\u002F set to 'false' to hide the vendor's own API endpoints\n});\n\nif (toolIds.length > 0) {\n    params.append('tools', toolIds.join(','));\n}\n\nconst serverUrl = `${UNIFIED_MCP_URL}\u002Fmcp?${params.toString()}`;\n\nconst transport = new StreamableHTTPClientTransport(new URL(serverUrl), {\n    requestInit: {\n        headers: { Authorization: `Bearer ${process.env.UNIFIED_API_KEY}` },\n    },\n});\nconst client = new Client({\n    name: 'unified-mcp',\n    version: '1.0.0',\n});\n\nawait client.connect(transport);\n\nconst completion = await gemini.models.generateContent({\n    model,\n    contents: message,\n    config: {\n        tools: [mcpToTool(client)],\n    },\n});\n\nconsole.log(completion.text);\n\nawait client.close();\n",[36,40876,40877,40891,40905,40919,40924,40928,40933,40946,40950,40964,40968,40986,40998,41002,41020,41024,41040,41053,41057,41061,41066,41080,41084,41097,41101,41105,41119,41139,41143,41147,41173,41177,41201,41206,41227,41231,41235,41251,41260,41270,41274,41278,41292,41296,41314,41318,41323,41328,41339,41343,41347,41351,41360,41364],{"__ignoreMap":2433},[414,40878,40879,40881,40884,40886,40889],{"class":2593,"line":2594},[414,40880,2699],{"class":2698},[414,40882,40883],{"class":2705}," { GoogleGenAI, mcpToTool } ",[414,40885,2716],{"class":2698},[414,40887,40888],{"class":2601}," '@google\u002Fgenai'",[414,40890,2706],{"class":2705},[414,40892,40893,40895,40898,40900,40903],{"class":2593,"line":2434},[414,40894,2699],{"class":2698},[414,40896,40897],{"class":2705}," { Client } ",[414,40899,2716],{"class":2698},[414,40901,40902],{"class":2601}," '@modelcontextprotocol\u002Fsdk\u002Fclient\u002Findex.js'",[414,40904,2706],{"class":2705},[414,40906,40907,40909,40912,40914,40917],{"class":2593,"line":2613},[414,40908,2699],{"class":2698},[414,40910,40911],{"class":2705}," { StreamableHTTPClientTransport } ",[414,40913,2716],{"class":2698},[414,40915,40916],{"class":2601}," '@modelcontextprotocol\u002Fsdk\u002Fclient\u002FstreamableHttp.js'",[414,40918,2706],{"class":2705},[414,40920,40921],{"class":2593,"line":2625},[414,40922,40923],{"class":3527},"\u002F\u002F Construct a new GEMINI client via GoogleGenAI\n",[414,40925,40926],{"class":2593,"line":2677},[414,40927,2740],{"emptyLinePlaceholder":2459},[414,40929,40930],{"class":2593,"line":2751},[414,40931,40932],{"class":3527},"\u002F\u002F Gemini model\n",[414,40934,40935,40937,40939,40941,40944],{"class":2593,"line":2760},[414,40936,2745],{"class":2698},[414,40938,38651],{"class":2607},[414,40940,2817],{"class":2698},[414,40942,40943],{"class":2601}," 'gemini-3.8-flash'",[414,40945,2706],{"class":2705},[414,40947,40948],{"class":2593,"line":2768},[414,40949,38663],{"class":3527},[414,40951,40952,40954,40956,40958,40960,40962],{"class":2593,"line":2776},[414,40953,2745],{"class":2698},[414,40955,38670],{"class":2607},[414,40957,2817],{"class":2698},[414,40959,25869],{"class":2705},[414,40961,28751],{"class":2607},[414,40963,2706],{"class":2705},[414,40965,40966],{"class":2593,"line":2784},[414,40967,38683],{"class":3527},[414,40969,40970,40972,40974,40976,40978,40980,40982,40984],{"class":2593,"line":2792},[414,40971,2745],{"class":2698},[414,40973,38690],{"class":2607},[414,40975,2817],{"class":2698},[414,40977,25869],{"class":2705},[414,40979,37932],{"class":2607},[414,40981,26046],{"class":2698},[414,40983,38701],{"class":2601},[414,40985,2706],{"class":2705},[414,40987,40988,40990,40992,40994,40996],{"class":2593,"line":2804},[414,40989,2745],{"class":2698},[414,40991,29663],{"class":2607},[414,40993,2817],{"class":2698},[414,40995,39993],{"class":2601},[414,40997,2706],{"class":2705},[414,40999,41000],{"class":2593,"line":2809},[414,41001,38740],{"class":3527},[414,41003,41004,41006,41008,41010,41012,41014,41016,41018],{"class":2593,"line":2829},[414,41005,2745],{"class":2698},[414,41007,38747],{"class":2607},[414,41009,2817],{"class":2698},[414,41011,38752],{"class":2705},[414,41013,38755],{"class":2601},[414,41015,11464],{"class":2705},[414,41017,38760],{"class":2601},[414,41019,9376],{"class":2705},[414,41021,41022],{"class":2593,"line":2843},[414,41023,2740],{"emptyLinePlaceholder":2459},[414,41025,41026,41028,41031,41033,41035,41038],{"class":2593,"line":2849},[414,41027,2745],{"class":2698},[414,41029,41030],{"class":2607}," gemini",[414,41032,2817],{"class":2698},[414,41034,2820],{"class":2698},[414,41036,41037],{"class":2597}," GoogleGenAI",[414,41039,2826],{"class":2705},[414,41041,41042,41044,41047,41049,41051],{"class":2593,"line":2854},[414,41043,30547],{"class":2705},[414,41045,41046],{"class":2607},"GEMINI_API_KEY",[414,41048,26046],{"class":2698},[414,41050,3734],{"class":2601},[414,41052,2757],{"class":2705},[414,41054,41055],{"class":2593,"line":2880},[414,41056,2846],{"class":2705},[414,41058,41059],{"class":2593,"line":3253},[414,41060,2740],{"emptyLinePlaceholder":2459},[414,41062,41063],{"class":2593,"line":3261},[414,41064,41065],{"class":3527},"\u002F\u002F Construct the required params\n",[414,41067,41068,41070,41072,41074,41076,41078],{"class":2593,"line":3279},[414,41069,2745],{"class":2698},[414,41071,38773],{"class":2607},[414,41073,2817],{"class":2698},[414,41075,2820],{"class":2698},[414,41077,28144],{"class":2597},[414,41079,2826],{"class":2705},[414,41081,41082],{"class":2593,"line":3313},[414,41083,38786],{"class":2705},[414,41085,41086,41089,41092,41094],{"class":2593,"line":3326},[414,41087,41088],{"class":2705},"    include_external_tools: ",[414,41090,41091],{"class":2601},"'true'",[414,41093,319],{"class":2705},[414,41095,41096],{"class":3527},"\u002F\u002F set to 'false' to hide the vendor's own API endpoints\n",[414,41098,41099],{"class":2593,"line":3339},[414,41100,2846],{"class":2705},[414,41102,41103],{"class":2593,"line":3359},[414,41104,2740],{"emptyLinePlaceholder":2459},[414,41106,41107,41109,41111,41113,41115,41117],{"class":2593,"line":6453},[414,41108,38417],{"class":2698},[414,41110,38818],{"class":2705},[414,41112,25098],{"class":2607},[414,41114,38823],{"class":2698},[414,41116,24954],{"class":2607},[414,41118,3826],{"class":2705},[414,41120,41121,41123,41125,41127,41129,41131,41133,41135,41137],{"class":2593,"line":6459},[414,41122,38832],{"class":2705},[414,41124,38835],{"class":2597},[414,41126,2968],{"class":2705},[414,41128,38840],{"class":2601},[414,41130,38843],{"class":2705},[414,41132,3148],{"class":2597},[414,41134,2968],{"class":2705},[414,41136,38850],{"class":2601},[414,41138,35656],{"class":2705},[414,41140,41141],{"class":2593,"line":6465},[414,41142,3035],{"class":2705},[414,41144,41145],{"class":2593,"line":6471},[414,41146,2740],{"emptyLinePlaceholder":2459},[414,41148,41149,41151,41153,41155,41157,41159,41161,41163,41165,41167,41169,41171],{"class":2593,"line":6477},[414,41150,2745],{"class":2698},[414,41152,38900],{"class":2607},[414,41154,2817],{"class":2698},[414,41156,3113],{"class":2601},[414,41158,37932],{"class":2607},[414,41160,38909],{"class":2601},[414,41162,38912],{"class":2705},[414,41164,97],{"class":2601},[414,41166,24233],{"class":2597},[414,41168,38919],{"class":2601},[414,41170,3308],{"class":2601},[414,41172,2706],{"class":2705},[414,41174,41175],{"class":2593,"line":6483},[414,41176,2740],{"emptyLinePlaceholder":2459},[414,41178,41179,41181,41184,41186,41188,41191,41193,41195,41198],{"class":2593,"line":6489},[414,41180,2745],{"class":2698},[414,41182,41183],{"class":2607}," transport",[414,41185,2817],{"class":2698},[414,41187,2820],{"class":2698},[414,41189,41190],{"class":2597}," StreamableHTTPClientTransport",[414,41192,2968],{"class":2705},[414,41194,35115],{"class":2698},[414,41196,41197],{"class":2597}," URL",[414,41199,41200],{"class":2705},"(serverUrl), {\n",[414,41202,41203],{"class":2593,"line":6495},[414,41204,41205],{"class":2705},"    requestInit: {\n",[414,41207,41208,41211,41213,41215,41217,41219,41221,41223,41225],{"class":2593,"line":6501},[414,41209,41210],{"class":2705},"        headers: { Authorization: ",[414,41212,24527],{"class":2601},[414,41214,40229],{"class":2705},[414,41216,97],{"class":2601},[414,41218,40234],{"class":2705},[414,41220,97],{"class":2601},[414,41222,2560],{"class":2607},[414,41224,3308],{"class":2601},[414,41226,2840],{"class":2705},[414,41228,41229],{"class":2593,"line":6507},[414,41230,3548],{"class":2705},[414,41232,41233],{"class":2593,"line":6513},[414,41234,2846],{"class":2705},[414,41236,41237,41239,41242,41244,41246,41249],{"class":2593,"line":6519},[414,41238,2745],{"class":2698},[414,41240,41241],{"class":2607}," client",[414,41243,2817],{"class":2698},[414,41245,2820],{"class":2698},[414,41247,41248],{"class":2597}," Client",[414,41250,2826],{"class":2705},[414,41252,41253,41255,41258],{"class":2593,"line":6525},[414,41254,28908],{"class":2705},[414,41256,41257],{"class":2601},"'unified-mcp'",[414,41259,2757],{"class":2705},[414,41261,41262,41265,41268],{"class":2593,"line":6531},[414,41263,41264],{"class":2705},"    version: ",[414,41266,41267],{"class":2601},"'1.0.0'",[414,41269,2757],{"class":2705},[414,41271,41272],{"class":2593,"line":6537},[414,41273,2846],{"class":2705},[414,41275,41276],{"class":2593,"line":6543},[414,41277,2740],{"emptyLinePlaceholder":2459},[414,41279,41280,41283,41286,41289],{"class":2593,"line":6549},[414,41281,41282],{"class":2698},"await",[414,41284,41285],{"class":2705}," client.",[414,41287,41288],{"class":2597},"connect",[414,41290,41291],{"class":2705},"(transport);\n",[414,41293,41294],{"class":2593,"line":6555},[414,41295,2740],{"emptyLinePlaceholder":2459},[414,41297,41298,41300,41302,41304,41306,41309,41312],{"class":2593,"line":6561},[414,41299,2745],{"class":2698},[414,41301,38934],{"class":2607},[414,41303,2817],{"class":2698},[414,41305,3002],{"class":2698},[414,41307,41308],{"class":2705}," gemini.models.",[414,41310,41311],{"class":2597},"generateContent",[414,41313,2826],{"class":2705},[414,41315,41316],{"class":2593,"line":6567},[414,41317,38950],{"class":2705},[414,41319,41320],{"class":2593,"line":6573},[414,41321,41322],{"class":2705},"    contents: message,\n",[414,41324,41325],{"class":2593,"line":6579},[414,41326,41327],{"class":2705},"    config: {\n",[414,41329,41330,41333,41336],{"class":2593,"line":6585},[414,41331,41332],{"class":2705},"        tools: [",[414,41334,41335],{"class":2597},"mcpToTool",[414,41337,41338],{"class":2705},"(client)],\n",[414,41340,41341],{"class":2593,"line":6591},[414,41342,3548],{"class":2705},[414,41344,41345],{"class":2593,"line":6597},[414,41346,2846],{"class":2705},[414,41348,41349],{"class":2593,"line":6603},[414,41350,2740],{"emptyLinePlaceholder":2459},[414,41352,41353,41355,41357],{"class":2593,"line":6609},[414,41354,39099],{"class":2705},[414,41356,4064],{"class":2597},[414,41358,41359],{"class":2705},"(completion.text);\n",[414,41361,41362],{"class":2593,"line":6615},[414,41363,2740],{"emptyLinePlaceholder":2459},[414,41365,41366,41368,41370,41373],{"class":2593,"line":6621},[414,41367,41282],{"class":2698},[414,41369,41285],{"class":2705},[414,41371,41372],{"class":2597},"close",[414,41374,4088],{"class":2705},[55,41376,39131],{"id":39130},[22,41378,39134],{},[2354,41380,41381,41385,41389,41396,41400],{},[2357,41382,41383,39142],{},[31,41384,39141],{},[2357,41386,41387,39148],{},[31,41388,39147],{},[2357,41390,41391,7340,41393,39157],{},[31,41392,39153],{},[41,41394,123],{"href":121,"rel":41395},[45],[2357,41397,41398,39163],{},[31,41399,39162],{},[2357,41401,41402,39169],{},[31,41403,39168],{},[22,41405,41406,39175,41409,39179],{},[41,41407,123],{"href":121,"rel":41408},[45],[31,41410,39178],{},[2354,41412,41413,41418],{},[2357,41414,41415],{},[41,41416,39186],{"href":39184,"rel":41417},[45],[2357,41419,41420],{},[41,41421,41423],{"href":39189,"rel":41422},[45],"Book a demo",[4156,41425,41426],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sgQC_, html code.shiki .sgQC_{--shiki-default:#FDAEB7;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic;--shiki-light:#B31D28;--shiki-light-font-style:italic}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}",{"title":2433,"searchDepth":2434,"depth":2434,"links":41428},[41429,41430,41431,41434],{"id":37790,"depth":2434,"text":37791},{"id":40680,"depth":2434,"text":40681},{"id":38577,"depth":2434,"text":38578,"children":41432},[41433],{"id":38619,"depth":2613,"text":40871},{"id":39130,"depth":2434,"text":39131},"Google Gemini can power powerful workflows — but most products still need access to live customer data from CRMs, ATSs, HRIS, or accounting systems. That...",{"img":41437,"date":39205,"updated":41438,"tag":2457,"integrations":41439},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_connect_google_gemini_to_real_time_saas_data_with_unified_mcp_server-icon.png","2026-10-09T14:45:30.488Z","googlegemini","\u002Fguides\u002Fhow_to_connect_google_gemini_to_real_time_saas_data_with_unified_mcp_server",{"title":40604,"description":41435},"guides\u002Fhow_to_connect_google_gemini_to_real_time_saas_data_with_unified_mcp_server","A_M1yCgfkNLxFtK31_gCis8PbUIxUv3MaF7wcRtsAZw",{"id":41445,"title":41446,"body":41447,"description":42668,"extension":2452,"meta":42669,"navigation":2459,"path":42673,"seo":42674,"stem":42675,"__hash__":42676},"guides\u002Fguides\u002Fhow_to_connect_llms_to_real_time_saas_data_with_unified_mcp_server.md","How to Connect LLMs to Real-Time SaaS Data with Unified.to MCP Server",{"type":12,"value":41448,"toc":42654},[41449,41452,41454,41459,41467,41475,41479,41482,41500,41502,41520,41525,41531,41536,41546,41550,41678,41682,41688,41741,41745,41752,42027,42031,42034,42038,42044,42050,42218,42223,42225,42229,42409,42411,42415,42528,42532,42536,42591,42593,42597,42605,42609,42639,42643,42651],[15,41450,41446],{"id":41451},"how-to-connect-llms-to-real-time-saas-data-with-unifiedto-mcp-server",[19,41453],{},[22,41455,41456],{},[25,41457,41458],{},"August 25, 2025",[22,41460,41461,41466],{},[41,41462,41465],{"href":41463,"rel":41464},"https:\u002F\u002Fdocs.unified.to\u002Fmcp",[45],"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 having to write custom business-logic code for every integration, which can often make things messy.",[22,41468,41469,41470,41474],{},"For example, imagine you're building a ",[41,41471,41473],{"href":22326,"rel":41472},[45],"candidate assessment workflow",", 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 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.",[55,41476,41478],{"id":41477},"the-flow","The Flow",[22,41480,41481],{},"Here's how an LLM API connects to Unified's MCP server:",[2354,41483,41484,41487,41497],{},[2357,41485,41486],{},"Your app connects to the MCP server using the HTTP endpoint.",[2357,41488,41489,41490,41493,41494,41496],{},"You authenticate with a token in the ",[36,41491,41492],{},"Authorization: Bearer"," header: your workspace API key plus a customer's ",[36,41495,37818],{}," ID from your own server, or a connection-scoped signed token when an LLM provider or agent calls the server.",[2357,41498,41499],{},"The LLM can then discover and call tools (like 'fetch candidate', 'score candidate', 'update job status') in real time.",[55,41501,37791],{"id":37790},[22,41503,41504,41505,41507,41508,41511,41512,41515,41516,41519],{},"Send the token in the Authorization header (",[36,41506,37801],{},"). Don't put it in the URL. Use the Streamable HTTP host for your workspace's region (US ",[36,41509,41510],{},"https:\u002F\u002Fmcp-api.unified.to\u002Fmcp",", EU ",[36,41513,41514],{},"https:\u002F\u002Fmcp-api-eu.unified.to\u002Fmcp",", AU ",[36,41517,41518],{},"https:\u002F\u002Fapi-au.unified.to\u002Fmcp","); a credential works only on its own region's host.",[22,41521,41522],{},[31,41523,41524],{},"LLM providers, agents and third-party clients:",[22,41526,41527,41528,41530],{},"Use a connection-scoped signed token, generated with ",[36,41529,37830],{}," (mode=user). It works for one connection only, so your workspace API key stays on your server.",[22,41532,41533],{},[31,41534,41535],{},"Private (Direct LLM API):",[22,41537,41538,41539,41542,41543,41545],{},"From your own server, use your ",[41,41540,123],{"href":121,"rel":41541},[45]," workspace API key as the token, and include a ",[36,41544,37818],{}," parameter for the customer's connection ID.",[22,41547,41548],{},[25,41549,17183],{},[2584,41551,41553],{"className":2649,"code":41552,"language":2651,"meta":2652,"style":2433},"https:\u002F\u002Fmcp-api.unified.to\u002Fmcp?connection=\u003CCONNECTION_ID>\nAuthorization: Bearer \u003CYOUR_API_KEY>\n```\n\n\n_Note: Keep the workspace API key on your server. Never put it in a URL or a client config._\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:\u002F\u002Fgithub.com\u002Fmcp-use\u002Fmcp-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\u002Fbin\u002Factivate\npip install mcp-use python-dotenv requests openai\ntouch client.py\n",[36,41554,41555,41560,41565,41570,41574,41578,41583,41587,41591,41596,41600,41604,41609,41613,41617,41622,41626,41630,41635,41639,41643,41648,41653,41658,41663,41668,41673],{"__ignoreMap":2433},[414,41556,41557],{"class":2593,"line":2594},[414,41558,41559],{},"https:\u002F\u002Fmcp-api.unified.to\u002Fmcp?connection=\u003CCONNECTION_ID>\n",[414,41561,41562],{"class":2593,"line":2434},[414,41563,41564],{},"Authorization: Bearer \u003CYOUR_API_KEY>\n",[414,41566,41567],{"class":2593,"line":2613},[414,41568,41569],{},"```\n",[414,41571,41572],{"class":2593,"line":2625},[414,41573,2740],{"emptyLinePlaceholder":2459},[414,41575,41576],{"class":2593,"line":2677},[414,41577,2740],{"emptyLinePlaceholder":2459},[414,41579,41580],{"class":2593,"line":2751},[414,41581,41582],{},"_Note: Keep the workspace API key on your server. Never put it in a URL or a client config._\n",[414,41584,41585],{"class":2593,"line":2760},[414,41586,2740],{"emptyLinePlaceholder":2459},[414,41588,41589],{"class":2593,"line":2768},[414,41590,2740],{"emptyLinePlaceholder":2459},[414,41592,41593],{"class":2593,"line":2776},[414,41594,41595],{},"## Building the application with an LLM API and MCP\n",[414,41597,41598],{"class":2593,"line":2784},[414,41599,2740],{"emptyLinePlaceholder":2459},[414,41601,41602],{"class":2593,"line":2792},[414,41603,2740],{"emptyLinePlaceholder":2459},[414,41605,41606],{"class":2593,"line":2804},[414,41607,41608],{},"If your application is using an LLM API that supports MCP (like OpenAI), you can use the [`mcp-use`](https:\u002F\u002Fgithub.com\u002Fmcp-use\u002Fmcp-use) Python package to connect to Unified MCP and access your customer's data and actions.\n",[414,41610,41611],{"class":2593,"line":2809},[414,41612,2740],{"emptyLinePlaceholder":2459},[414,41614,41615],{"class":2593,"line":2829},[414,41616,2740],{"emptyLinePlaceholder":2459},[414,41618,41619],{"class":2593,"line":2843},[414,41620,41621],{},"### Dependencies\n",[414,41623,41624],{"class":2593,"line":2849},[414,41625,2740],{"emptyLinePlaceholder":2459},[414,41627,41628],{"class":2593,"line":2854},[414,41629,2740],{"emptyLinePlaceholder":2459},[414,41631,41632],{"class":2593,"line":2880},[414,41633,41634],{},"The full list of dependencies and setup you need to do to get things running.\n",[414,41636,41637],{"class":2593,"line":3253},[414,41638,2740],{"emptyLinePlaceholder":2459},[414,41640,41641],{"class":2593,"line":3261},[414,41642,2740],{"emptyLinePlaceholder":2459},[414,41644,41645],{"class":2593,"line":3279},[414,41646,41647],{},"```bash\n",[414,41649,41650],{"class":2593,"line":3313},[414,41651,41652],{},"mkdir unified-mcp-client\n",[414,41654,41655],{"class":2593,"line":3326},[414,41656,41657],{},"cd unified-mcp-client\n",[414,41659,41660],{"class":2593,"line":3339},[414,41661,41662],{},"python -m venv .venv\n",[414,41664,41665],{"class":2593,"line":3359},[414,41666,41667],{},"source .venv\u002Fbin\u002Factivate\n",[414,41669,41670],{"class":2593,"line":6453},[414,41671,41672],{},"pip install mcp-use python-dotenv requests openai\n",[414,41674,41675],{"class":2593,"line":6459},[414,41676,41677],{},"touch client.py\n",[3629,41679,41681],{"id":41680},"setting-up-your-secrets","Setting up your secrets",[22,41683,41684,41685,41687],{},"Add your Unified API key, your customer's connection ID, and your workspace secret to a ",[36,41686,2645],{}," file:",[2584,41689,41691],{"className":2586,"code":41690,"language":2588,"meta":2433,"style":2433},"echo \"UNIFIED_API_KEY=\u003Cyour Unified API key here>\" >> .env\necho \"CONNECTION_ID=\u003Cyour Unified connection ID here>\" >> .env\necho \"UNIFIED_MCP_TOKEN=\u003Cconnection-scoped signed token here>\" >> .env\necho \".env\" >> .gitignore\n",[36,41692,41693,41707,41718,41729],{"__ignoreMap":2433},[414,41694,41695,41698,41701,41704],{"class":2593,"line":2594},[414,41696,41697],{"class":2607},"echo",[414,41699,41700],{"class":2601}," \"UNIFIED_API_KEY=\u003Cyour Unified API key here>\"",[414,41702,41703],{"class":2698}," >>",[414,41705,41706],{"class":2601}," .env\n",[414,41708,41709,41711,41714,41716],{"class":2593,"line":2434},[414,41710,41697],{"class":2607},[414,41712,41713],{"class":2601}," \"CONNECTION_ID=\u003Cyour Unified connection ID here>\"",[414,41715,41703],{"class":2698},[414,41717,41706],{"class":2601},[414,41719,41720,41722,41725,41727],{"class":2593,"line":2613},[414,41721,41697],{"class":2607},[414,41723,41724],{"class":2601}," \"UNIFIED_MCP_TOKEN=\u003Cconnection-scoped signed token here>\"",[414,41726,41703],{"class":2698},[414,41728,41706],{"class":2601},[414,41730,41731,41733,41736,41738],{"class":2593,"line":2625},[414,41732,41697],{"class":2607},[414,41734,41735],{"class":2601}," \".env\"",[414,41737,41703],{"class":2698},[414,41739,41740],{"class":2601}," .gitignore\n",[15,41742,41744],{"id":41743},"the-mcp-client-class","The MCP Client Class",[22,41746,41747,41748,41751],{},"Here's an example using the ",[36,41749,41750],{},"mcp-use"," package:",[2584,41753,41755],{"className":37862,"code":41754,"language":37864,"meta":2433,"style":2433},"# client.py\nimport os\nimport asyncio\nfrom dotenv import load_dotenv\nfrom mcp_use import MCPClient\n\nload_dotenv()\n\nCONNECTION_ID = os.getenv(\"CONNECTION_ID\")\nUNIFIED_API_KEY = os.getenv(\"UNIFIED_API_KEY\")  # stays on your server\n\n# Use your region's host: US mcp-api.unified.to, EU mcp-api-eu.unified.to, AU api-au.unified.to\nMCP_URL = f\"https:\u002F\u002Fmcp-api.unified.to\u002Fmcp?connection={CONNECTION_ID}\"\n\nclient = MCPClient.from_dict({\n    \"mcpServers\": {\n        \"unified\": {\n            \"url\": MCP_URL,\n            \"headers\": {\"Authorization\": f\"Bearer {UNIFIED_API_KEY}\"},\n        }\n    }\n})\n\nasync def main():\n    await client.create_all_sessions()\n    session = client.get_session(\"unified\")\n    # List available tools\n    tools = await session.list_tools()\n    print(\"Available tools:\", [tool.name for tool in tools])\n\nasyncio.run(main())\n",[36,41756,41757,41762,41768,41775,41787,41799,41803,41808,41812,41825,41841,41845,41850,41868,41872,41881,41888,41895,41906,41927,41931,41935,41940,41944,41956,41963,41978,41983,41995,42018,42022],{"__ignoreMap":2433},[414,41758,41759],{"class":2593,"line":2594},[414,41760,41761],{"class":3527},"# client.py\n",[414,41763,41764,41766],{"class":2593,"line":2434},[414,41765,2699],{"class":2698},[414,41767,37873],{"class":2705},[414,41769,41770,41772],{"class":2593,"line":2613},[414,41771,2699],{"class":2698},[414,41773,41774],{"class":2705}," asyncio\n",[414,41776,41777,41779,41782,41784],{"class":2593,"line":2625},[414,41778,2716],{"class":2698},[414,41780,41781],{"class":2705}," dotenv ",[414,41783,2699],{"class":2698},[414,41785,41786],{"class":2705}," load_dotenv\n",[414,41788,41789,41791,41794,41796],{"class":2593,"line":2677},[414,41790,2716],{"class":2698},[414,41792,41793],{"class":2705}," mcp_use ",[414,41795,2699],{"class":2698},[414,41797,41798],{"class":2705}," MCPClient\n",[414,41800,41801],{"class":2593,"line":2751},[414,41802,2740],{"emptyLinePlaceholder":2459},[414,41804,41805],{"class":2593,"line":2760},[414,41806,41807],{"class":2705},"load_dotenv()\n",[414,41809,41810],{"class":2593,"line":2768},[414,41811,2740],{"emptyLinePlaceholder":2459},[414,41813,41814,41816,41818,41821,41823],{"class":2593,"line":2776},[414,41815,28751],{"class":2607},[414,41817,2817],{"class":2698},[414,41819,41820],{"class":2705}," os.getenv(",[414,41822,37920],{"class":2601},[414,41824,3141],{"class":2705},[414,41826,41827,41829,41831,41833,41835,41838],{"class":2593,"line":2784},[414,41828,2560],{"class":2607},[414,41830,2817],{"class":2698},[414,41832,41820],{"class":2705},[414,41834,37907],{"class":2601},[414,41836,41837],{"class":2705},")  ",[414,41839,41840],{"class":3527},"# stays on your server\n",[414,41842,41843],{"class":2593,"line":2792},[414,41844,2740],{"emptyLinePlaceholder":2459},[414,41846,41847],{"class":2593,"line":2804},[414,41848,41849],{"class":3527},"# Use your region's host: US mcp-api.unified.to, EU mcp-api-eu.unified.to, AU api-au.unified.to\n",[414,41851,41852,41855,41857,41860,41863,41866],{"class":2593,"line":2809},[414,41853,41854],{"class":2607},"MCP_URL",[414,41856,2817],{"class":2698},[414,41858,41859],{"class":2698}," f",[414,41861,41862],{"class":2601},"\"https:\u002F\u002Fmcp-api.unified.to\u002Fmcp?connection=",[414,41864,41865],{"class":2607},"{CONNECTION_ID}",[414,41867,18471],{"class":2601},[414,41869,41870],{"class":2593,"line":2829},[414,41871,2740],{"emptyLinePlaceholder":2459},[414,41873,41874,41876,41878],{"class":2593,"line":2843},[414,41875,38045],{"class":2705},[414,41877,2798],{"class":2698},[414,41879,41880],{"class":2705}," MCPClient.from_dict({\n",[414,41882,41883,41886],{"class":2593,"line":2849},[414,41884,41885],{"class":2601},"    \"mcpServers\"",[414,41887,10477],{"class":2705},[414,41889,41890,41893],{"class":2593,"line":2854},[414,41891,41892],{"class":2601},"        \"unified\"",[414,41894,10477],{"class":2705},[414,41896,41897,41900,41902,41904],{"class":2593,"line":2880},[414,41898,41899],{"class":2601},"            \"url\"",[414,41901,7340],{"class":2705},[414,41903,41854],{"class":2607},[414,41905,2757],{"class":2705},[414,41907,41908,41911,41913,41915,41917,41919,41921,41923,41925],{"class":2593,"line":3253},[414,41909,41910],{"class":2601},"            \"headers\"",[414,41912,39739],{"class":2705},[414,41914,37988],{"class":2601},[414,41916,7340],{"class":2705},[414,41918,37993],{"class":2698},[414,41920,37996],{"class":2601},[414,41922,37999],{"class":2607},[414,41924,7395],{"class":2601},[414,41926,38004],{"class":2705},[414,41928,41929],{"class":2593,"line":3261},[414,41930,10641],{"class":2705},[414,41932,41933],{"class":2593,"line":3279},[414,41934,10535],{"class":2705},[414,41936,41937],{"class":2593,"line":3313},[414,41938,41939],{"class":2705},"})\n",[414,41941,41942],{"class":2593,"line":3326},[414,41943,2740],{"emptyLinePlaceholder":2459},[414,41945,41946,41948,41951,41953],{"class":2593,"line":3339},[414,41947,3928],{"class":2698},[414,41949,41950],{"class":2698}," def",[414,41952,3933],{"class":2597},[414,41954,41955],{"class":2705},"():\n",[414,41957,41958,41960],{"class":2593,"line":3359},[414,41959,4022],{"class":2698},[414,41961,41962],{"class":2705}," client.create_all_sessions()\n",[414,41964,41965,41968,41970,41973,41976],{"class":2593,"line":6453},[414,41966,41967],{"class":2705},"    session ",[414,41969,2798],{"class":2698},[414,41971,41972],{"class":2705}," client.get_session(",[414,41974,41975],{"class":2601},"\"unified\"",[414,41977,3141],{"class":2705},[414,41979,41980],{"class":2593,"line":6459},[414,41981,41982],{"class":3527},"    # List available tools\n",[414,41984,41985,41988,41990,41992],{"class":2593,"line":6465},[414,41986,41987],{"class":2705},"    tools ",[414,41989,2798],{"class":2698},[414,41991,3002],{"class":2698},[414,41993,41994],{"class":2705}," session.list_tools()\n",[414,41996,41997,42000,42002,42005,42008,42010,42013,42015],{"class":2593,"line":6471},[414,41998,41999],{"class":2607},"    print",[414,42001,2968],{"class":2705},[414,42003,42004],{"class":2601},"\"Available tools:\"",[414,42006,42007],{"class":2705},", [tool.name ",[414,42009,38406],{"class":2698},[414,42011,42012],{"class":2705}," tool ",[414,42014,38217],{"class":2698},[414,42016,42017],{"class":2705}," tools])\n",[414,42019,42020],{"class":2593,"line":6477},[414,42021,2740],{"emptyLinePlaceholder":2459},[414,42023,42024],{"class":2593,"line":6483},[414,42025,42026],{"class":2705},"asyncio.run(main())\n",[55,42028,42030],{"id":42029},"integrating-with-openai-llm-api","Integrating with OpenAI (LLM API)",[22,42032,42033],{},"Once your MCP client is set up, you can connect it to OpenAI's API, which natively supports remote MCP servers.",[3629,42035,42037],{"id":42036},"configure-openai-to-use-unified-mcp","Configure OpenAI to Use Unified MCP",[22,42039,42040,42041,2431],{},"When you send a Responses API request, specify the MCP server as a tool source and pass a connection-scoped token in the ",[36,42042,42043],{},"authorization",[22,42045,42046,42047,2646],{},"Here's a ",[31,42048,42049],{},"candidate assessment example",[2584,42051,42053],{"className":37862,"code":42052,"language":37864,"meta":2433,"style":2433},"from openai import OpenAI\n\nopenai_client = OpenAI()  # reads OPENAI_API_KEY\n\nresponse = openai_client.responses.create(\n    model=\"gpt-4o\",\n    tools=[{\n        \"type\": \"mcp\",\n        \"server_label\": \"unified\",\n        \"server_url\": MCP_URL,  # no token in the URL\n        # Connection-scoped signed token: works for one connection only\n        \"authorization\": os.getenv(\"UNIFIED_MCP_TOKEN\"),\n        \"require_approval\": \"never\",\n    }],\n    input=\"Score this candidate for the Software Engineer job.\",\n)\n\nprint(response.output_text)\n",[36,42054,42055,42067,42071,42084,42088,42097,42109,42119,42131,42142,42157,42162,42175,42187,42192,42203,42207,42211],{"__ignoreMap":2433},[414,42056,42057,42059,42062,42064],{"class":2593,"line":2594},[414,42058,2716],{"class":2698},[414,42060,42061],{"class":2705}," openai ",[414,42063,2699],{"class":2698},[414,42065,42066],{"class":2705}," OpenAI\n",[414,42068,42069],{"class":2593,"line":2434},[414,42070,2740],{"emptyLinePlaceholder":2459},[414,42072,42073,42076,42078,42081],{"class":2593,"line":2613},[414,42074,42075],{"class":2705},"openai_client ",[414,42077,2798],{"class":2698},[414,42079,42080],{"class":2705}," OpenAI()  ",[414,42082,42083],{"class":3527},"# reads OPENAI_API_KEY\n",[414,42085,42086],{"class":2593,"line":2625},[414,42087,2740],{"emptyLinePlaceholder":2459},[414,42089,42090,42092,42094],{"class":2593,"line":2677},[414,42091,39519],{"class":2705},[414,42093,2798],{"class":2698},[414,42095,42096],{"class":2705}," openai_client.responses.create(\n",[414,42098,42099,42102,42104,42107],{"class":2593,"line":2751},[414,42100,42101],{"class":2971},"    model",[414,42103,2798],{"class":2698},[414,42105,42106],{"class":2601},"\"gpt-4o\"",[414,42108,2757],{"class":2705},[414,42110,42111,42114,42116],{"class":2593,"line":2760},[414,42112,42113],{"class":2971},"    tools",[414,42115,2798],{"class":2698},[414,42117,42118],{"class":2705},"[{\n",[414,42120,42121,42124,42126,42129],{"class":2593,"line":2768},[414,42122,42123],{"class":2601},"        \"type\"",[414,42125,7340],{"class":2705},[414,42127,42128],{"class":2601},"\"mcp\"",[414,42130,2757],{"class":2705},[414,42132,42133,42136,42138,42140],{"class":2593,"line":2776},[414,42134,42135],{"class":2601},"        \"server_label\"",[414,42137,7340],{"class":2705},[414,42139,41975],{"class":2601},[414,42141,2757],{"class":2705},[414,42143,42144,42147,42149,42151,42154],{"class":2593,"line":2784},[414,42145,42146],{"class":2601},"        \"server_url\"",[414,42148,7340],{"class":2705},[414,42150,41854],{"class":2607},[414,42152,42153],{"class":2705},",  ",[414,42155,42156],{"class":3527},"# no token in the URL\n",[414,42158,42159],{"class":2593,"line":2792},[414,42160,42161],{"class":3527},"        # Connection-scoped signed token: works for one connection only\n",[414,42163,42164,42167,42170,42173],{"class":2593,"line":2804},[414,42165,42166],{"class":2601},"        \"authorization\"",[414,42168,42169],{"class":2705},": os.getenv(",[414,42171,42172],{"class":2601},"\"UNIFIED_MCP_TOKEN\"",[414,42174,18305],{"class":2705},[414,42176,42177,42180,42182,42185],{"class":2593,"line":2809},[414,42178,42179],{"class":2601},"        \"require_approval\"",[414,42181,7340],{"class":2705},[414,42183,42184],{"class":2601},"\"never\"",[414,42186,2757],{"class":2705},[414,42188,42189],{"class":2593,"line":2829},[414,42190,42191],{"class":2705},"    }],\n",[414,42193,42194,42197,42199,42201],{"class":2593,"line":2843},[414,42195,42196],{"class":2971},"    input",[414,42198,2798],{"class":2698},[414,42200,39512],{"class":2601},[414,42202,2757],{"class":2705},[414,42204,42205],{"class":2593,"line":2849},[414,42206,3141],{"class":2705},[414,42208,42209],{"class":2593,"line":2854},[414,42210,2740],{"emptyLinePlaceholder":2459},[414,42212,42213,42215],{"class":2593,"line":2880},[414,42214,38395],{"class":2607},[414,42216,42217],{"class":2705},"(response.output_text)\n",[22,42219,42220],{},[31,42221,42222],{},"No backend glue code required: OpenAI orchestrates the tool calls via Unified MCP.",[55,42224,37842],{"id":37841},[22,42226,42227],{},[31,42228,37850],{},[2510,42230,42231,42283,42351,42355],{},[2357,42232,37855,42233,37859,42235],{},[36,42234,37858],{},[2584,42236,42238],{"className":37862,"code":42237,"language":37864,"meta":2433,"style":2433},"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",[36,42239,42240,42249,42260,42268,42279],{"__ignoreMap":2433},[414,42241,42242,42245,42247],{"class":2593,"line":2594},[414,42243,42244],{"class":2705},"resp ",[414,42246,2798],{"class":2698},[414,42248,38109],{"class":2705},[414,42250,42251,42253,42255,42258],{"class":2593,"line":2434},[414,42252,42101],{"class":2971},[414,42254,2798],{"class":2698},[414,42256,42257],{"class":2601},"\"claude-3-5-sonnet-20241022\"",[414,42259,2757],{"class":2705},[414,42261,42262,42264,42266],{"class":2593,"line":2613},[414,42263,42113],{"class":2971},[414,42265,2798],{"class":2698},[414,42267,38143],{"class":2705},[414,42269,42270,42272,42274,42277],{"class":2593,"line":2625},[414,42271,42196],{"class":2971},[414,42273,2798],{"class":2698},[414,42275,42276],{"class":2601},"\"list the candidates and then analyse the resumes from their applications\"",[414,42278,2757],{"class":2705},[414,42280,42281],{"class":2593,"line":2677},[414,42282,3141],{"class":2705},[2357,42284,38431,42285,38435,42287],{},[36,42286,38434],{},[2584,42288,42289],{"className":7323,"code":38438,"language":7325,"meta":2433,"style":2433},[36,42290,42291,42295,42299,42309,42319,42329,42343,42347],{"__ignoreMap":2433},[414,42292,42293],{"class":2593,"line":2594},[414,42294,9310],{"class":2705},[414,42296,42297],{"class":2593,"line":2434},[414,42298,18235],{"class":2705},[414,42300,42301,42303,42305,42307],{"class":2593,"line":2613},[414,42302,7337],{"class":2607},[414,42304,7340],{"class":2705},[414,42306,38457],{"class":2601},[414,42308,2757],{"class":2705},[414,42310,42311,42313,42315,42317],{"class":2593,"line":2625},[414,42312,38464],{"class":2607},[414,42314,7340],{"class":2705},[414,42316,38469],{"class":2601},[414,42318,2757],{"class":2705},[414,42320,42321,42323,42325,42327],{"class":2593,"line":2677},[414,42322,38476],{"class":2607},[414,42324,7340],{"class":2705},[414,42326,38481],{"class":2601},[414,42328,2757],{"class":2705},[414,42330,42331,42333,42335,42337,42339,42341],{"class":2593,"line":2751},[414,42332,38488],{"class":2607},[414,42334,38491],{"class":2705},[414,42336,38494],{"class":2607},[414,42338,7340],{"class":2705},[414,42340,38499],{"class":2601},[414,42342,8986],{"class":2705},[414,42344,42345],{"class":2593,"line":2760},[414,42346,4032],{"class":2705},[414,42348,42349],{"class":2593,"line":2768},[414,42350,9376],{"class":2705},[2357,42352,37855,42353,38515],{},[36,42354,38514],{},[2357,42356,42357,42358,42360,42361],{},"Return the result to Claude as a ",[36,42359,38521],{}," block in your next message:",[2584,42362,42363],{"className":7323,"code":38525,"language":7325,"meta":2433,"style":2433},[36,42364,42365,42369,42373,42383,42393,42401,42405],{"__ignoreMap":2433},[414,42366,42367],{"class":2593,"line":2594},[414,42368,9310],{"class":2705},[414,42370,42371],{"class":2593,"line":2434},[414,42372,18235],{"class":2705},[414,42374,42375,42377,42379,42381],{"class":2593,"line":2613},[414,42376,7337],{"class":2607},[414,42378,7340],{"class":2705},[414,42380,38356],{"class":2601},[414,42382,2757],{"class":2705},[414,42384,42385,42387,42389,42391],{"class":2593,"line":2625},[414,42386,38550],{"class":2607},[414,42388,7340],{"class":2705},[414,42390,38469],{"class":2601},[414,42392,2757],{"class":2705},[414,42394,42395,42397,42399],{"class":2593,"line":2677},[414,42396,38561],{"class":2607},[414,42398,7340],{"class":2705},[414,42400,38566],{"class":2601},[414,42402,42403],{"class":2593,"line":2751},[414,42404,4032],{"class":2705},[414,42406,42407],{"class":2593,"line":2760},[414,42408,9376],{"class":2705},[55,42410,40681],{"id":40680},[22,42412,42413],{},[31,42414,37850],{},[2510,42416,42417,42423,42449,42453],{},[2357,42418,37855,42419,40695,42421,40699],{},[36,42420,37858],{},[36,42422,40698],{},[2357,42424,40702,42425],{},[2584,42426,42428],{"className":2649,"code":42427,"language":2651,"meta":2652,"style":2433},"function_call {\n  name: \"list_candidates\"\n  args { fields { key: \"limit\" value { string_value: \"100\" } } }\n}\n",[36,42429,42430,42435,42440,42445],{"__ignoreMap":2433},[414,42431,42432],{"class":2593,"line":2594},[414,42433,42434],{},"function_call {\n",[414,42436,42437],{"class":2593,"line":2434},[414,42438,42439],{},"  name: \"list_candidates\"\n",[414,42441,42442],{"class":2593,"line":2613},[414,42443,42444],{},"  args { fields { key: \"limit\" value { string_value: \"100\" } } }\n",[414,42446,42447],{"class":2593,"line":2625},[414,42448,3035],{},[2357,42450,37855,42451,39801],{},[36,42452,38514],{},[2357,42454,40746,42455,40750,42457],{},[36,42456,40749],{},[2584,42458,42460],{"className":7323,"code":42459,"language":7325,"meta":2433,"style":2433},"{\n  \"role\": \"user\",\n  \"parts\": [\n    {\n      \"functionResponse\": {\n        \"name\": \"list_candidates\",\n        \"response\": { ... }\n      }\n    }\n  ]\n}\n",[36,42461,42462,42466,42476,42482,42486,42492,42502,42512,42516,42520,42524],{"__ignoreMap":2433},[414,42463,42464],{"class":2593,"line":2594},[414,42465,8916],{"class":2705},[414,42467,42468,42470,42472,42474],{"class":2593,"line":2434},[414,42469,40764],{"class":2607},[414,42471,7340],{"class":2705},[414,42473,38071],{"class":2601},[414,42475,2757],{"class":2705},[414,42477,42478,42480],{"class":2593,"line":2613},[414,42479,40775],{"class":2607},[414,42481,8960],{"class":2705},[414,42483,42484],{"class":2593,"line":2625},[414,42485,15559],{"class":2705},[414,42487,42488,42490],{"class":2593,"line":2677},[414,42489,40786],{"class":2607},[414,42491,10477],{"class":2705},[414,42493,42494,42496,42498,42500],{"class":2593,"line":2751},[414,42495,40805],{"class":2607},[414,42497,7340],{"class":2705},[414,42499,38481],{"class":2601},[414,42501,2757],{"class":2705},[414,42503,42504,42506,42508,42510],{"class":2593,"line":2760},[414,42505,40816],{"class":2607},[414,42507,38491],{"class":2705},[414,42509,25045],{"class":7401},[414,42511,8986],{"class":2705},[414,42513,42514],{"class":2593,"line":2768},[414,42515,28493],{"class":2705},[414,42517,42518],{"class":2593,"line":2776},[414,42519,10535],{"class":2705},[414,42521,42522],{"class":2593,"line":2784},[414,42523,8991],{"class":2705},[414,42525,42526],{"class":2593,"line":2792},[414,42527,3035],{"class":2705},[55,42529,42531],{"id":42530},"integrating-with-cohere","Integrating with Cohere",[22,42533,42534],{},[31,42535,37850],{},[2510,42537,42538,42584,42588],{},[2357,42539,37855,42540,39300,42542],{},[36,42541,39299],{},[2584,42543,42545],{"className":37862,"code":42544,"language":37864,"meta":2433,"style":2433},"response = co.chat(\n    model=\"command-a-03-2025\", messages=messages, tools=tools\n)\n",[36,42546,42547,42556,42580],{"__ignoreMap":2433},[414,42548,42549,42551,42553],{"class":2593,"line":2594},[414,42550,39519],{"class":2705},[414,42552,2798],{"class":2698},[414,42554,42555],{"class":2705}," co.chat(\n",[414,42557,42558,42560,42562,42565,42567,42569,42571,42573,42575,42577],{"class":2593,"line":2434},[414,42559,42101],{"class":2971},[414,42561,2798],{"class":2698},[414,42563,42564],{"class":2601},"\"command-a-03-2025\"",[414,42566,319],{"class":2705},[414,42568,20738],{"class":2971},[414,42570,2798],{"class":2698},[414,42572,39540],{"class":2705},[414,42574,38594],{"class":2971},[414,42576,2798],{"class":2698},[414,42578,42579],{"class":2705},"tools\n",[414,42581,42582],{"class":2593,"line":2613},[414,42583,3141],{"class":2705},[2357,42585,39798,42586,39801],{},[36,42587,38514],{},[2357,42589,42590],{},"Pass the tool result back to Cohere in your next message",[3629,42592,39820],{"id":39819},[22,42594,42595],{},[31,42596,39825],{},[2584,42598,42599],{"className":2649,"code":39828,"language":2651,"meta":2652,"style":2433},[36,42600,42601],{"__ignoreMap":2433},[414,42602,42603],{"class":2593,"line":2594},[414,42604,39828],{},[22,42606,42607],{},[31,42608,39839],{},[2354,42610,42611,42623,42631,42636],{},[2357,42612,42613,42614,319,42617,319,42620,20056],{},"Your chosen LLM discovers the available tools from Unified MCP (e.g., ",[36,42615,42616],{},"fetch-candidate",[36,42618,42619],{},"fetch-job",[36,42621,42622],{},"score-candidate",[2357,42624,42625,42626,741,42628,42630],{},"The LLM calls ",[36,42627,42616],{},[36,42629,42619],{}," tools to get the data.",[2357,42632,42625,42633,42635],{},[36,42634,42622],{}," with the data.",[2357,42637,42638],{},"The LLM returns a response like:",[22,42640,42641],{},[31,42642,9300],{},[2584,42644,42645],{"className":2649,"code":39862,"language":2651,"meta":2652,"style":2433},[36,42646,42647],{"__ignoreMap":2433},[414,42648,42649],{"class":2593,"line":2594},[414,42650,39862],{},[4156,42652,42653],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html pre.shiki code .sgQC_, html code.shiki .sgQC_{--shiki-default:#FDAEB7;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic;--shiki-light:#B31D28;--shiki-light-font-style:italic}",{"title":2433,"searchDepth":2434,"depth":2434,"links":42655},[42656,42657,42660,42663,42664,42665],{"id":41477,"depth":2434,"text":41478},{"id":37790,"depth":2434,"text":37791,"children":42658},[42659],{"id":41680,"depth":2613,"text":41681},{"id":42029,"depth":2434,"text":42030,"children":42661},[42662],{"id":42036,"depth":2613,"text":42037},{"id":37841,"depth":2434,"text":37842},{"id":40680,"depth":2434,"text":40681},{"id":42530,"depth":2434,"text":42531,"children":42666},[42667],{"id":39819,"depth":2613,"text":39820},"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...",{"img":42670,"date":42671,"updated":42672,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_connect_llms_to_real_time_saas_data_with_unified_mcp_server-icon.png","2025-08-25T00:00:00.000Z","2026-10-09T18:38:24.018Z","\u002Fguides\u002Fhow_to_connect_llms_to_real_time_saas_data_with_unified_mcp_server",{"title":41446,"description":42668},"guides\u002Fhow_to_connect_llms_to_real_time_saas_data_with_unified_mcp_server","XwanLn_WoxCfsan8Glvn2VO_sC6uHPiAHDMlEerTt7s",{"id":42678,"title":42679,"body":42680,"description":43476,"extension":2452,"meta":43477,"navigation":2459,"path":43481,"seo":43482,"stem":43483,"__hash__":43484},"guides\u002Fguides\u002Fhow_to_connect_openai_to_real_time_saas_data_with_unified_mcp_server.md","How to Connect OpenAI to Real-Time SaaS Data with Unified.to MCP Server",{"type":12,"value":42681,"toc":43466},[42682,42685,42687,42691,42696,42705,42708,42710,42717,42719,42741,42743,42745,42747,42749,42759,42763,42976,42979,42981,42984,43006,43009,43011,43409,43411,43416,43441,43444,43451,43463],[15,42683,42679],{"id":42684},"how-to-connect-openai-to-real-time-saas-data-with-unifiedto-mcp-server",[19,42686],{},[22,42688,42689],{},[25,42690,37771],{},[22,42692,42693,42694,40622],{},"OpenAI's LLMs can power rich workflows — but most products still need access to ",[31,42695,40621],{},[22,42697,2486,42698,37780,42701,42704],{},[41,42699,123],{"href":121,"rel":42700},[45],[41,42702,123],{"href":121,"rel":42703},[45]," exposes 1663 SaaS integrations as real-time, callable tools that OpenAI can use directly — no custom integration logic required.",[22,42706,42707],{},"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.",[55,42709,37791],{"id":37790},[22,42711,37794,42712,37798,42715,37802],{},[41,42713,123],{"href":121,"rel":42714},[45],[36,42716,37801],{},[22,42718,37805],{},[2354,42720,42721,42729],{},[2357,42722,42723,42725,37815,42727,37819],{},[31,42724,37812],{},[5888,42726],{},[36,42728,37818],{},[2357,42730,42731,42733,37827,42735,741,42737,37834,42739,37838],{},[31,42732,37824],{},[5888,42734],{},[36,42736,37830],{},[36,42738,37833],{},[36,42740,37837],{},[55,42742,42030],{"id":42029},[22,42744,42033],{},[3629,42746,42037],{"id":42036},[22,42748,37845],{},[22,42750,42751,42752,42755,42756,42758],{},"When you send a Responses API request, add Unified MCP as a remote MCP tool (",[36,42753,42754],{},"\"type\": \"mcp\"","). OpenAI calls the MCP server on your behalf, so pass a connection-scoped signed token (works for one connection only) in the ",[36,42757,42043],{}," field and keep your workspace API key on your server.",[22,42760,42046,42761,2646],{},[31,42762,42049],{},[2584,42764,42766],{"className":37862,"code":42765,"language":37864,"meta":2433,"style":2433},"import os\n\nfrom openai import OpenAI\n\n# Connection-scoped signed token from get_unified_connection_mcp_url (mode=user)\nUNIFIED_MCP_TOKEN = os.environ[\"UNIFIED_MCP_TOKEN\"]\nCONNECTION_ID = os.environ[\"CONNECTION_ID\"]\n# Regional host without a path: US https:\u002F\u002Fmcp-api.unified.to, EU https:\u002F\u002Fmcp-api-eu.unified.to, AU https:\u002F\u002Fapi-au.unified.to\nUNIFIED_MCP_URL = os.environ.get(\"UNIFIED_MCP_URL\", \"https:\u002F\u002Fmcp-api.unified.to\")\n\nclient = OpenAI()  # reads OPENAI_API_KEY\n\nresponse = client.responses.create(\n    model=\"gpt-6-astra\",\n    tools=[{\n        \"type\": \"mcp\",\n        \"server_label\": \"unified\",\n        \"server_url\": f\"{UNIFIED_MCP_URL}\u002Fmcp?connection={CONNECTION_ID}\",\n        \"authorization\": UNIFIED_MCP_TOKEN,\n        \"require_approval\": \"never\",\n    }],\n    input=\"Score this candidate for the Software Engineer job.\",\n)\n\nprint(response.output_text)\n",[36,42767,42768,42774,42778,42788,42792,42797,42809,42821,42825,42841,42845,42855,42859,42868,42879,42887,42897,42907,42928,42938,42948,42952,42962,42966,42970],{"__ignoreMap":2433},[414,42769,42770,42772],{"class":2593,"line":2594},[414,42771,2699],{"class":2698},[414,42773,37873],{"class":2705},[414,42775,42776],{"class":2593,"line":2434},[414,42777,2740],{"emptyLinePlaceholder":2459},[414,42779,42780,42782,42784,42786],{"class":2593,"line":2613},[414,42781,2716],{"class":2698},[414,42783,42061],{"class":2705},[414,42785,2699],{"class":2698},[414,42787,42066],{"class":2705},[414,42789,42790],{"class":2593,"line":2625},[414,42791,2740],{"emptyLinePlaceholder":2459},[414,42793,42794],{"class":2593,"line":2677},[414,42795,42796],{"class":3527},"# Connection-scoped signed token from get_unified_connection_mcp_url (mode=user)\n",[414,42798,42799,42801,42803,42805,42807],{"class":2593,"line":2751},[414,42800,39051],{"class":2607},[414,42802,2817],{"class":2698},[414,42804,37904],{"class":2705},[414,42806,42172],{"class":2601},[414,42808,9376],{"class":2705},[414,42810,42811,42813,42815,42817,42819],{"class":2593,"line":2760},[414,42812,28751],{"class":2607},[414,42814,2817],{"class":2698},[414,42816,37904],{"class":2705},[414,42818,37920],{"class":2601},[414,42820,9376],{"class":2705},[414,42822,42823],{"class":2593,"line":2768},[414,42824,37927],{"class":3527},[414,42826,42827,42829,42831,42833,42835,42837,42839],{"class":2593,"line":2776},[414,42828,37932],{"class":2607},[414,42830,2817],{"class":2698},[414,42832,37937],{"class":2705},[414,42834,37940],{"class":2601},[414,42836,319],{"class":2705},[414,42838,37945],{"class":2601},[414,42840,3141],{"class":2705},[414,42842,42843],{"class":2593,"line":2784},[414,42844,2740],{"emptyLinePlaceholder":2459},[414,42846,42847,42849,42851,42853],{"class":2593,"line":2792},[414,42848,38045],{"class":2705},[414,42850,2798],{"class":2698},[414,42852,42080],{"class":2705},[414,42854,42083],{"class":3527},[414,42856,42857],{"class":2593,"line":2804},[414,42858,2740],{"emptyLinePlaceholder":2459},[414,42860,42861,42863,42865],{"class":2593,"line":2809},[414,42862,39519],{"class":2705},[414,42864,2798],{"class":2698},[414,42866,42867],{"class":2705}," client.responses.create(\n",[414,42869,42870,42872,42874,42877],{"class":2593,"line":2829},[414,42871,42101],{"class":2971},[414,42873,2798],{"class":2698},[414,42875,42876],{"class":2601},"\"gpt-6-astra\"",[414,42878,2757],{"class":2705},[414,42880,42881,42883,42885],{"class":2593,"line":2843},[414,42882,42113],{"class":2971},[414,42884,2798],{"class":2698},[414,42886,42118],{"class":2705},[414,42888,42889,42891,42893,42895],{"class":2593,"line":2849},[414,42890,42123],{"class":2601},[414,42892,7340],{"class":2705},[414,42894,42128],{"class":2601},[414,42896,2757],{"class":2705},[414,42898,42899,42901,42903,42905],{"class":2593,"line":2854},[414,42900,42135],{"class":2601},[414,42902,7340],{"class":2705},[414,42904,41975],{"class":2601},[414,42906,2757],{"class":2705},[414,42908,42909,42911,42913,42915,42917,42919,42922,42924,42926],{"class":2593,"line":2880},[414,42910,42146],{"class":2601},[414,42912,7340],{"class":2705},[414,42914,37993],{"class":2698},[414,42916,7395],{"class":2601},[414,42918,37971],{"class":2607},[414,42920,42921],{"class":2601},"\u002Fmcp?connection=",[414,42923,41865],{"class":2607},[414,42925,7395],{"class":2601},[414,42927,2757],{"class":2705},[414,42929,42930,42932,42934,42936],{"class":2593,"line":3253},[414,42931,42166],{"class":2601},[414,42933,7340],{"class":2705},[414,42935,39051],{"class":2607},[414,42937,2757],{"class":2705},[414,42939,42940,42942,42944,42946],{"class":2593,"line":3261},[414,42941,42179],{"class":2601},[414,42943,7340],{"class":2705},[414,42945,42184],{"class":2601},[414,42947,2757],{"class":2705},[414,42949,42950],{"class":2593,"line":3279},[414,42951,42191],{"class":2705},[414,42953,42954,42956,42958,42960],{"class":2593,"line":3313},[414,42955,42196],{"class":2971},[414,42957,2798],{"class":2698},[414,42959,39512],{"class":2601},[414,42961,2757],{"class":2705},[414,42963,42964],{"class":2593,"line":3326},[414,42965,3141],{"class":2705},[414,42967,42968],{"class":2593,"line":3339},[414,42969,2740],{"emptyLinePlaceholder":2459},[414,42971,42972,42974],{"class":2593,"line":3359},[414,42973,38395],{"class":2607},[414,42975,42217],{"class":2705},[22,42977,42978],{},"OpenAI lists and calls the Unified MCP tools itself, so no backend glue code is required.",[55,42980,39872],{"id":39871},[22,42982,42983],{},"Unified.to MCP gives you granular control over how tools are exposed to OpenAI:",[2354,42985,42986,42990,42994,42998,43002],{},[2357,42987,42988,38589],{},[36,42989,38588],{},[2357,42991,42992,38595],{},[36,42993,38594],{},[2357,42995,42996,38601],{},[36,42997,38600],{},[2357,42999,43000,38607],{},[36,43001,38606],{},[2357,43003,43004,38613],{},[36,43005,38612],{},[22,43007,43008],{},"These options help you keep OpenAI outputs predictable and secure in production-grade workflows.",[3629,43010,38620],{"id":38619},[2584,43012,43014],{"className":16485,"code":43013,"language":16487,"meta":2433,"style":2433},"import OpenAI from 'openai';\n\n\u002F\u002F OpenAI model\nconst model = 'gpt-6-astra';\n\u002F\u002F Unified connection ID that the MCP server should use\nconst connection = process.env.CONNECTION_ID;\n\u002F\u002F Regional host without a path: US https:\u002F\u002Fmcp-api.unified.to, EU https:\u002F\u002Fmcp-api-eu.unified.to, AU https:\u002F\u002Fapi-au.unified.to\nconst UNIFIED_MCP_URL = process.env.UNIFIED_MCP_URL || 'https:\u002F\u002Fmcp-api.unified.to';\n\u002F\u002F Set to true to expose the vendor's own API endpoints as tools\nconst includeExternal = false;\nconst message = 'Score this candidate for the Software Engineer job.';\n\u002F\u002F 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    connection,\n    include_external_tools: includeExternal ? 'true' : 'false',\n});\n\nif (toolIds.length > 0) {\n    params.append('tools', toolIds.join(','));\n}\n\nconst serverUrl = `${UNIFIED_MCP_URL}\u002Fmcp?${params.toString()}`;\n\nconst completion = await openai.responses.create({\n    model,\n    tools: [\n        {\n            type: 'mcp',\n            server_label: 'unifiedMCP',\n            server_url: serverUrl, \u002F\u002F change url as needed\n            \u002F\u002F Connection-scoped signed token (one connection only)\n            authorization: process.env.UNIFIED_MCP_TOKEN,\n            require_approval: 'never',\n        },\n    ],\n    instructions: `You are a helpful assistant`,\n    input: message,\n});\n\nconsole.log(completion.output_text);\n",[36,43015,43016,43030,43034,43039,43052,43056,43070,43074,43092,43096,43108,43120,43124,43142,43146,43161,43173,43177,43191,43195,43209,43213,43217,43231,43251,43255,43259,43285,43289,43306,43310,43315,43319,43328,43337,43345,43350,43359,43369,43373,43377,43387,43392,43396,43400],{"__ignoreMap":2433},[414,43017,43018,43020,43023,43025,43028],{"class":2593,"line":2594},[414,43019,2699],{"class":2698},[414,43021,43022],{"class":2705}," OpenAI ",[414,43024,2716],{"class":2698},[414,43026,43027],{"class":2601}," 'openai'",[414,43029,2706],{"class":2705},[414,43031,43032],{"class":2593,"line":2434},[414,43033,2740],{"emptyLinePlaceholder":2459},[414,43035,43036],{"class":2593,"line":2613},[414,43037,43038],{"class":3527},"\u002F\u002F OpenAI model\n",[414,43040,43041,43043,43045,43047,43050],{"class":2593,"line":2625},[414,43042,2745],{"class":2698},[414,43044,38651],{"class":2607},[414,43046,2817],{"class":2698},[414,43048,43049],{"class":2601}," 'gpt-6-astra'",[414,43051,2706],{"class":2705},[414,43053,43054],{"class":2593,"line":2677},[414,43055,38663],{"class":3527},[414,43057,43058,43060,43062,43064,43066,43068],{"class":2593,"line":2751},[414,43059,2745],{"class":2698},[414,43061,38670],{"class":2607},[414,43063,2817],{"class":2698},[414,43065,25869],{"class":2705},[414,43067,28751],{"class":2607},[414,43069,2706],{"class":2705},[414,43071,43072],{"class":2593,"line":2760},[414,43073,38683],{"class":3527},[414,43075,43076,43078,43080,43082,43084,43086,43088,43090],{"class":2593,"line":2768},[414,43077,2745],{"class":2698},[414,43079,38690],{"class":2607},[414,43081,2817],{"class":2698},[414,43083,25869],{"class":2705},[414,43085,37932],{"class":2607},[414,43087,26046],{"class":2698},[414,43089,38701],{"class":2601},[414,43091,2706],{"class":2705},[414,43093,43094],{"class":2593,"line":2776},[414,43095,38708],{"class":3527},[414,43097,43098,43100,43102,43104,43106],{"class":2593,"line":2784},[414,43099,2745],{"class":2698},[414,43101,38715],{"class":2607},[414,43103,2817],{"class":2698},[414,43105,38720],{"class":2607},[414,43107,2706],{"class":2705},[414,43109,43110,43112,43114,43116,43118],{"class":2593,"line":2792},[414,43111,2745],{"class":2698},[414,43113,29663],{"class":2607},[414,43115,2817],{"class":2698},[414,43117,39993],{"class":2601},[414,43119,2706],{"class":2705},[414,43121,43122],{"class":2593,"line":2804},[414,43123,38740],{"class":3527},[414,43125,43126,43128,43130,43132,43134,43136,43138,43140],{"class":2593,"line":2809},[414,43127,2745],{"class":2698},[414,43129,38747],{"class":2607},[414,43131,2817],{"class":2698},[414,43133,38752],{"class":2705},[414,43135,38755],{"class":2601},[414,43137,11464],{"class":2705},[414,43139,38760],{"class":2601},[414,43141,9376],{"class":2705},[414,43143,43144],{"class":2593,"line":2829},[414,43145,2740],{"emptyLinePlaceholder":2459},[414,43147,43148,43150,43152,43154,43156,43159],{"class":2593,"line":2843},[414,43149,2745],{"class":2698},[414,43151,35103],{"class":2607},[414,43153,2817],{"class":2698},[414,43155,2820],{"class":2698},[414,43157,43158],{"class":2597}," OpenAI",[414,43160,2826],{"class":2705},[414,43162,43163,43165,43167,43169,43171],{"class":2593,"line":2849},[414,43164,30547],{"class":2705},[414,43166,35124],{"class":2607},[414,43168,26046],{"class":2698},[414,43170,3734],{"class":2601},[414,43172,2757],{"class":2705},[414,43174,43175],{"class":2593,"line":2854},[414,43176,2846],{"class":2705},[414,43178,43179,43181,43183,43185,43187,43189],{"class":2593,"line":2880},[414,43180,2745],{"class":2698},[414,43182,38773],{"class":2607},[414,43184,2817],{"class":2698},[414,43186,2820],{"class":2698},[414,43188,28144],{"class":2597},[414,43190,2826],{"class":2705},[414,43192,43193],{"class":2593,"line":3253},[414,43194,38786],{"class":2705},[414,43196,43197,43199,43201,43203,43205,43207],{"class":2593,"line":3261},[414,43198,38791],{"class":2705},[414,43200,3610],{"class":2698},[414,43202,38796],{"class":2601},[414,43204,36969],{"class":2698},[414,43206,38801],{"class":2601},[414,43208,2757],{"class":2705},[414,43210,43211],{"class":2593,"line":3279},[414,43212,2846],{"class":2705},[414,43214,43215],{"class":2593,"line":3313},[414,43216,2740],{"emptyLinePlaceholder":2459},[414,43218,43219,43221,43223,43225,43227,43229],{"class":2593,"line":3326},[414,43220,38417],{"class":2698},[414,43222,38818],{"class":2705},[414,43224,25098],{"class":2607},[414,43226,38823],{"class":2698},[414,43228,24954],{"class":2607},[414,43230,3826],{"class":2705},[414,43232,43233,43235,43237,43239,43241,43243,43245,43247,43249],{"class":2593,"line":3339},[414,43234,38832],{"class":2705},[414,43236,38835],{"class":2597},[414,43238,2968],{"class":2705},[414,43240,38840],{"class":2601},[414,43242,38843],{"class":2705},[414,43244,3148],{"class":2597},[414,43246,2968],{"class":2705},[414,43248,38850],{"class":2601},[414,43250,35656],{"class":2705},[414,43252,43253],{"class":2593,"line":3359},[414,43254,3035],{"class":2705},[414,43256,43257],{"class":2593,"line":6453},[414,43258,2740],{"emptyLinePlaceholder":2459},[414,43260,43261,43263,43265,43267,43269,43271,43273,43275,43277,43279,43281,43283],{"class":2593,"line":6459},[414,43262,2745],{"class":2698},[414,43264,38900],{"class":2607},[414,43266,2817],{"class":2698},[414,43268,3113],{"class":2601},[414,43270,37932],{"class":2607},[414,43272,38909],{"class":2601},[414,43274,38912],{"class":2705},[414,43276,97],{"class":2601},[414,43278,24233],{"class":2597},[414,43280,38919],{"class":2601},[414,43282,3308],{"class":2601},[414,43284,2706],{"class":2705},[414,43286,43287],{"class":2593,"line":6465},[414,43288,2740],{"emptyLinePlaceholder":2459},[414,43290,43291,43293,43295,43297,43299,43302,43304],{"class":2593,"line":6471},[414,43292,2745],{"class":2698},[414,43294,38934],{"class":2607},[414,43296,2817],{"class":2698},[414,43298,3002],{"class":2698},[414,43300,43301],{"class":2705}," openai.responses.",[414,43303,28901],{"class":2597},[414,43305,2826],{"class":2705},[414,43307,43308],{"class":2593,"line":6477},[414,43309,38950],{"class":2705},[414,43311,43312],{"class":2593,"line":6483},[414,43313,43314],{"class":2705},"    tools: [\n",[414,43316,43317],{"class":2593,"line":6489},[414,43318,10590],{"class":2705},[414,43320,43321,43323,43326],{"class":2593,"line":6495},[414,43322,39013],{"class":2705},[414,43324,43325],{"class":2601},"'mcp'",[414,43327,2757],{"class":2705},[414,43329,43330,43333,43335],{"class":2593,"line":6501},[414,43331,43332],{"class":2705},"            server_label: ",[414,43334,39031],{"class":2601},[414,43336,2757],{"class":2705},[414,43338,43339,43342],{"class":2593,"line":6507},[414,43340,43341],{"class":2705},"            server_url: serverUrl, ",[414,43343,43344],{"class":3527},"\u002F\u002F change url as needed\n",[414,43346,43347],{"class":2593,"line":6513},[414,43348,43349],{"class":3527},"            \u002F\u002F Connection-scoped signed token (one connection only)\n",[414,43351,43352,43355,43357],{"class":2593,"line":6519},[414,43353,43354],{"class":2705},"            authorization: process.env.",[414,43356,39051],{"class":2607},[414,43358,2757],{"class":2705},[414,43360,43361,43364,43367],{"class":2593,"line":6525},[414,43362,43363],{"class":2705},"            require_approval: ",[414,43365,43366],{"class":2601},"'never'",[414,43368,2757],{"class":2705},[414,43370,43371],{"class":2593,"line":6531},[414,43372,3768],{"class":2705},[414,43374,43375],{"class":2593,"line":6537},[414,43376,3778],{"class":2705},[414,43378,43379,43382,43385],{"class":2593,"line":6543},[414,43380,43381],{"class":2705},"    instructions: ",[414,43383,43384],{"class":2601},"`You are a helpful assistant`",[414,43386,2757],{"class":2705},[414,43388,43389],{"class":2593,"line":6549},[414,43390,43391],{"class":2705},"    input: message,\n",[414,43393,43394],{"class":2593,"line":6555},[414,43395,2846],{"class":2705},[414,43397,43398],{"class":2593,"line":6561},[414,43399,2740],{"emptyLinePlaceholder":2459},[414,43401,43402,43404,43406],{"class":2593,"line":6567},[414,43403,39099],{"class":2705},[414,43405,4064],{"class":2597},[414,43407,43408],{"class":2705},"(completion.output_text);\n",[55,43410,39131],{"id":39130},[22,43412,43413,40532],{},[41,43414,123],{"href":121,"rel":43415},[45],[2354,43417,43418,43422,43426,43433,43437],{},[2357,43419,43420,39142],{},[31,43421,39141],{},[2357,43423,43424,39148],{},[31,43425,39147],{},[2357,43427,43428,7340,43430,39157],{},[31,43429,39153],{},[41,43431,123],{"href":121,"rel":43432},[45],[2357,43434,43435,39163],{},[31,43436,39162],{},[2357,43438,43439,39169],{},[31,43440,39168],{},[22,43442,43443],{},"This ensures your OpenAI workflows aren't just demos — they're secure, scalable, and designed for production-grade use cases.",[22,43445,43446,39175,43449,39179],{},[41,43447,123],{"href":121,"rel":43448},[45],[31,43450,39178],{},[2354,43452,43453,43458],{},[2357,43454,43455],{},[41,43456,39186],{"href":39184,"rel":43457},[45],[2357,43459,43460],{},[41,43461,41423],{"href":39189,"rel":43462},[45],[4156,43464,43465],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}",{"title":2433,"searchDepth":2434,"depth":2434,"links":43467},[43468,43469,43472,43475],{"id":37790,"depth":2434,"text":37791},{"id":42029,"depth":2434,"text":42030,"children":43470},[43471],{"id":42036,"depth":2613,"text":42037},{"id":39871,"depth":2434,"text":39872,"children":43473},[43474],{"id":38619,"depth":2613,"text":38620},{"id":39130,"depth":2434,"text":39131},"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...",{"img":43478,"date":39205,"updated":43479,"tag":2457,"integrations":43480},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_connect_openai_to_real_time_saas_data_with_unified_mcp_server-icon.png","2026-10-09T18:39:10.424Z","openai","\u002Fguides\u002Fhow_to_connect_openai_to_real_time_saas_data_with_unified_mcp_server",{"title":42679,"description":43476},"guides\u002Fhow_to_connect_openai_to_real_time_saas_data_with_unified_mcp_server","TZ8zLd__u34WCTku-OPh47Y10QYf5X_hhzIQ7zyIrcU",{"id":43486,"title":43487,"body":43488,"description":44322,"extension":2452,"meta":44323,"navigation":2459,"path":44328,"seo":44329,"stem":44330,"__hash__":44331},"guides\u002Fguides\u002Fhow_to_connect_zoom_and_zoom_phone.md","How to Connect Zoom and Zoom Phone",{"type":12,"value":43489,"toc":44295},[43490,43493,43495,43500,43503,43505,43511,43532,43539,43541,43547,43579,43586,43637,43643,43646,43686,43701,43703,43709,43715,43718,43724,43727,43744,43750,43753,43817,43823,43826,43912,43918,43921,43967,43974,43976,43982,44009,44012,44014,44020,44031,44039,44041,44047,44054,44060,44109,44112,44118,44136,44143,44145,44151,44154,44206,44208,44212,44218,44221,44227,44230,44236,44239,44245,44258,44264,44270,44272,44278,44285],[15,43491,43487],{"id":43492},"how-to-connect-zoom-and-zoom-phone",[19,43494],{},[22,43496,43497],{},[25,43498,43499],{},"July 2, 2026",[22,43501,43502],{},"This guide walks you through creating a Zoom OAuth app, configuring the right permissions, and connecting your Zoom account. You will need a Zoom account with admin access for some features (user directory, call logs, and recordings).",[19,43504],{},[55,43506,43508],{"id":43507},"what-you-need",[31,43509,43510],{},"What you need",[2354,43512,43513,43523,43526,43529],{},[2357,43514,7309,43515,43522],{},[41,43516,43519],{"href":43517,"rel":43518},"https:\u002F\u002Fmarketplace.zoom.us\u002F",[45],[31,43520,43521],{},"Zoom Marketplace"," developer account",[2357,43524,43525],{},"Zoom account admin access (required for directory, group, and Zoom Phone admin scopes)",[2357,43527,43528],{},"A Zoom Phone license if you plan to use the Zoom Phone integration",[2357,43530,43531],{},"Your Unified workspace (to store credentials and start the connection)",[4937,43533,43534],{},[22,43535,43536,43538],{},[31,43537,22779],{}," Zoom and Zoom Phone are separate integrations in Unified. You can use one OAuth app for both, as long as that app includes the scopes for every feature you need.",[19,43540],{},[55,43542,43544],{"id":43543},"step-1-create-a-zoom-oauth-app",[31,43545,43546],{},"Step 1: Create a Zoom OAuth app",[2510,43548,43549,43558,43567,43576],{},[2357,43550,43551,43552,97],{},"Sign in to the ",[41,43553,43555],{"href":43517,"rel":43554},[45],[31,43556,43557],{},"Zoom App Marketplace",[2357,43559,7257,43560,43563,43564,97],{},[31,43561,43562],{},"Develop"," → ",[31,43565,43566],{},"Build App",[2357,43568,43569,43570,43573,43574,97],{},"Choose ",[31,43571,43572],{},"General App"," and click ",[31,43575,21975],{},[2357,43577,43578],{},"Enter an app name and basic details.",[22,43580,43581,43582,43585],{},"On the ",[31,43583,43584],{},"Basic Information"," page:",[2510,43587,43588,43610,43630],{},[2357,43589,43590,43591,43593,43594,43597,43598],{},"Open ",[31,43592,6238],{}," and note your ",[31,43595,43596],{},"Development"," Client ID and Client Secret.\n",[2354,43599,43600,43603],{},[2357,43601,43602],{},"Use development credentials while the app is still in testing.",[2357,43604,43605,43606,43609],{},"After the app is published, switch to ",[31,43607,43608],{},"Production"," credentials.",[2357,43611,6235,43612,43615,43616],{},[31,43613,43614],{},"OAuth Information",", configure:\n",[2354,43617,43618,43624],{},[2357,43619,43620,43623],{},[31,43621,43622],{},"OAuth Redirect URL"," — use the exact URL for your Unified region (see below).",[2357,43625,43626,43629],{},[31,43627,43628],{},"OAuth Allow List"," — add the same URL (or the base domain if Zoom accepts it).",[2357,43631,43632,43633,43636],{},"If ",[31,43634,43635],{},"Strict Mode URL"," is enabled, the redirect URL must match character-for-character.",[3629,43638,43640],{"id":43639},"oauth-redirect-url-by-region",[31,43641,43642],{},"OAuth redirect URL by region",[22,43644,43645],{},"Add the redirect URL that matches where your Unified workspace is hosted:",[155,43647,43648,43660],{},[158,43649,43650],{},[161,43651,43652,43656],{},[164,43653,43654],{},[31,43655,5987],{},[164,43657,43658],{},[31,43659,36424],{},[174,43661,43662,43670,43678],{},[161,43663,43664,43666],{},[179,43665,5108],{},[179,43667,43668],{},[36,43669,21741],{},[161,43671,43672,43674],{},[179,43673,5118],{},[179,43675,43676],{},[36,43677,21747],{},[161,43679,43680,43682],{},[179,43681,6897],{},[179,43683,43684],{},[36,43685,21753],{},[4937,43687,43688],{},[22,43689,43690,43692,43693,43696,43697,43700],{},[31,43691,6271],{}," Copy the URL exactly. A trailing slash, wrong subdomain, or ",[36,43694,43695],{},"http"," instead of ",[36,43698,43699],{},"https"," will cause the connection to fail.",[19,43702],{},[55,43704,43706],{"id":43705},"step-2-add-the-required-scopes-permissions",[31,43707,43708],{},"Step 2: Add the required scopes (permissions)",[22,43710,43711,43712,43714],{},"In your Zoom app, open the ",[31,43713,36554],{}," page and add the permissions below. Only add scopes for the features you actually use.",[22,43716,43717],{},"For each scope, Zoom may ask you to describe why your app needs it. Keep the explanation tied to your use case (e.g. 'Read call history for CRM logging' or 'List meetings for calendar sync').",[3629,43719,43721],{"id":43720},"required-for-sign-in-zoom-and-zoom-phone",[31,43722,43723],{},"Required for sign-in (Zoom and Zoom Phone)",[22,43725,43726],{},"Add these for any connection:",[2354,43728,43729,43734,43739],{},[2357,43730,43731],{},[36,43732,43733],{},"user_profile",[2357,43735,43736],{},[36,43737,43738],{},"user_info:read",[2357,43740,43741],{},[36,43742,43743],{},"user:read",[3629,43745,43747],{"id":43746},"zoom-users-and-groups",[31,43748,43749],{},"Zoom — users and groups",[22,43751,43752],{},"If you sync users or groups:",[155,43754,43755,43769],{},[158,43756,43757],{},[161,43758,43759,43764],{},[164,43760,43761],{},[31,43762,43763],{},"Feature",[164,43765,43766],{},[31,43767,43768],{},"Scopes to add",[174,43770,43771,43784,43794,43807],{},[161,43772,43773,43776],{},[179,43774,43775],{},"Read users",[179,43777,43778,4696,43781],{},[36,43779,43780],{},"user:read:user:admin",[36,43782,43783],{},"user:read:list_users:admin",[161,43785,43786,43789],{},[179,43787,43788],{},"Write users",[179,43790,43791],{},[36,43792,43793],{},"user:write:admin",[161,43795,43796,43799],{},[179,43797,43798],{},"Read groups",[179,43800,43801,4696,43804],{},[36,43802,43803],{},"group:read:admin",[36,43805,43806],{},"group:read:list_groups:admin",[161,43808,43809,43812],{},[179,43810,43811],{},"Write groups",[179,43813,43814],{},[36,43815,43816],{},"group:write:admin",[3629,43818,43820],{"id":43819},"zoom-meetings-and-webinars",[31,43821,43822],{},"Zoom — meetings and webinars",[22,43824,43825],{},"If you work with meetings or webinars:",[155,43827,43828,43840],{},[158,43829,43830],{},[161,43831,43832,43836],{},[164,43833,43834],{},[31,43835,43763],{},[164,43837,43838],{},[31,43839,43768],{},[174,43841,43842,43852,43868,43878],{},[161,43843,43844,43847],{},[179,43845,43846],{},"Read meetings",[179,43848,43849],{},[36,43850,43851],{},"meeting:read:list_meetings",[161,43853,43854,43857],{},[179,43855,43856],{},"Create \u002F update \u002F delete meetings",[179,43858,43859,4696,43862,4696,43865],{},[36,43860,43861],{},"meeting:write:meeting",[36,43863,43864],{},"meeting:update:meeting",[36,43866,43867],{},"meeting:delete:meeting",[161,43869,43870,43873],{},[179,43871,43872],{},"Read webinars",[179,43874,43875],{},[36,43876,43877],{},"webinar:read:list_webinars",[161,43879,43880,43883],{},[179,43881,43882],{},"Manage webinars",[179,43884,43885,4696,43888,4696,43891,4696,43894,4696,43897,4696,43900,4696,43903,4696,43906,4696,43909],{},[36,43886,43887],{},"webinar:write:webinar",[36,43889,43890],{},"webinar:update:webinar",[36,43892,43893],{},"webinar:delete:webinar",[36,43895,43896],{},"webinar:write:registrant",[36,43898,43899],{},"webinar:update:registrant",[36,43901,43902],{},"webinar:delete:registrant",[36,43904,43905],{},"webinar:write:panelist",[36,43907,43908],{},"webinar:update:panelist",[36,43910,43911],{},"webinar:delete:panelist",[3629,43913,43915],{"id":43914},"zoom-phone-calls-recordings-and-users",[31,43916,43917],{},"Zoom Phone — calls, recordings, and users",[22,43919,43920],{},"If you use the Zoom Phone integration:",[155,43922,43923,43935],{},[158,43924,43925],{},[161,43926,43927,43931],{},[164,43928,43929],{},[31,43930,43763],{},[164,43932,43933],{},[31,43934,43768],{},[174,43936,43937,43947,43957],{},[161,43938,43939,43942],{},[179,43940,43941],{},"Read Zoom Phone users",[179,43943,43944],{},[36,43945,43946],{},"phone:read:user:admin",[161,43948,43949,43952],{},[179,43950,43951],{},"Read call history",[179,43953,43954],{},[36,43955,43956],{},"phone:read:call_log:admin",[161,43958,43959,43962],{},[179,43960,43961],{},"Read call recordings",[179,43963,43964],{},[36,43965,43966],{},"phone:read:recording:admin",[4937,43968,43969],{},[22,43970,43971,43973],{},[31,43972,22779],{}," Zoom Phone scopes require a Zoom Phone license on the account you connect.",[19,43975],{},[55,43977,43979],{"id":43978},"step-3-add-credentials-in-unified",[31,43980,43981],{},"Step 3: Add credentials in Unified",[2510,43983,43984,43989,43999,44006],{},[2357,43985,43986,43987,97],{},"In the Unified dashboard, open ",[31,43988,4433],{},[2357,43990,43991,43992,43995,43996,97],{},"Enable ",[31,43993,43994],{},"Zoom"," and\u002For ",[31,43997,43998],{},"Zoom Phone",[2357,44000,6829,44001,4950,44003,44005],{},[31,44002,4491],{},[31,44004,4494],{}," from your Zoom app (development credentials while testing; production credentials after publish).",[2357,44007,44008],{},"Save the integration.",[22,44010,44011],{},"The Client ID and Client Secret in Unified must match the values shown in the Zoom Marketplace for the same app and environment (Development vs Production).",[19,44013],{},[55,44015,44017],{"id":44016},"step-4-connect-a-zoom-account",[31,44018,44019],{},"Step 4: Connect a Zoom account",[2510,44021,44022,44025,44028],{},[2357,44023,44024],{},"Start a new connection for Zoom or Zoom Phone (from the dashboard or your app's auth flow).",[2357,44026,44027],{},"You will be redirected to Zoom to sign in and approve the requested permissions.",[2357,44029,44030],{},"After approval, you are redirected back and the connection is created.",[4937,44032,44033],{},[22,44034,44035,44038],{},[31,44036,44037],{},"Tip:"," The Zoom user who authorizes the connection should be an account admin if you use admin-level scopes (users, groups, call logs, recordings).",[19,44040],{},[55,44042,44044],{"id":44043},"testing-vs-published-apps",[31,44045,44046],{},"Testing vs published apps",[22,44048,44049,44050,44053],{},"Zoom apps start in ",[31,44051,44052],{},"development \u002F testing"," mode. This affects who can connect.",[3629,44055,44057],{"id":44056},"while-the-app-is-in-testing",[31,44058,44059],{},"While the app is in testing",[2354,44061,44062,44069,44074],{},[2357,44063,44064,44065,44068],{},"Only Zoom accounts added as ",[31,44066,44067],{},"authorized testers"," (or users on the same Zoom account as the app owner) can complete OAuth.",[2357,44070,6837,44071,44073],{},[31,44072,43596],{}," Client ID and Client Secret in Unified.",[2357,44075,44076,44077,44080,44081],{},"For each customer Zoom account that needs to connect ",[31,44078,44079],{},"before"," the app is published, that account must be added as a tester in the Zoom Marketplace:\n",[2510,44082,44083,44093,44106],{},[2357,44084,44085,44086,97],{},"Open your app in the ",[41,44087,44090],{"href":44088,"rel":44089},"https:\u002F\u002Fmarketplace.zoom.us\u002Fdevelop\u002Fapplications",[45],[31,44091,44092],{},"Zoom Marketplace Developer portal",[2357,44094,44095,44096,7868,44099,7868,44102,44105],{},"Find ",[31,44097,44098],{},"Add app for testing",[31,44100,44101],{},"Local Test",[31,44103,44104],{},"Authorized testers"," (wording may vary).",[2357,44107,44108],{},"Add the customer's Zoom email or account.",[22,44110,44111],{},"If a customer sees an error that the app is not authorized, they are usually not on the tester list yet.",[3629,44113,44115],{"id":44114},"when-the-app-is-published",[31,44116,44117],{},"When the app is published",[2354,44119,44120,44123,44129],{},[2357,44121,44122],{},"Any Zoom customer can connect without being added as a tester.",[2357,44124,44125,44126,44128],{},"Switch Unified to the ",[31,44127,43608],{}," Client ID and Client Secret from the Zoom app.",[2357,44130,44131,44132,44135],{},"Existing connections may need to be ",[31,44133,44134],{},"re-authorized"," after you switch credentials or publish.",[4937,44137,44138],{},[22,44139,44140,44142],{},[31,44141,22779],{}," Publishing goes through Zoom's review process. Zoom may require security review for certain scopes and can take several business days. Plan ahead if you need many customers to connect on a fixed timeline.",[19,44144],{},[55,44146,44148],{"id":44147},"checklist-before-connecting",[31,44149,44150],{},"Checklist before connecting",[22,44152,44153],{},"Use this quick checklist if a connection fails:",[2354,44155,44158,44167,44176,44182,44188,44194,44200],{"className":44156},[44157],"contains-task-list",[2357,44159,44162,44166],{"className":44160},[44161],"task-list-item",[44163,44164],"input",{"disabled":2459,"type":44165},"checkbox"," Client ID and Client Secret in Unified match the Zoom app (same environment: Development or Production).",[2357,44168,44170,44172,44173,44175],{"className":44169},[44161],[44163,44171],{"disabled":2459,"type":44165}," OAuth Redirect URL in Zoom is exactly ",[36,44174,21741],{}," (or the EU\u002FAU URL for your region).",[2357,44177,44179,44181],{"className":44178},[44161],[44163,44180],{"disabled":2459,"type":44165}," The same URL is on the OAuth Allow List.",[2357,44183,44185,44187],{"className":44184},[44161],[44163,44186],{"disabled":2459,"type":44165}," All scopes your product needs are added in the Zoom app.",[2357,44189,44191,44193],{"className":44190},[44161],[44163,44192],{"disabled":2459,"type":44165}," If the app is still in testing, the connecting user's Zoom account is an authorized tester.",[2357,44195,44197,44199],{"className":44196},[44161],[44163,44198],{"disabled":2459,"type":44165}," The authorizing user has admin rights when using admin scopes.",[2357,44201,44203,44205],{"className":44202},[44161],[44163,44204],{"disabled":2459,"type":44165}," For Zoom Phone: the account has Zoom Phone enabled.",[19,44207],{},[55,44209,44210],{"id":5621},[31,44211,5622],{},[3629,44213,44215],{"id":44214},"invalid-redirect-uri-or-redirect-errors",[31,44216,44217],{},"'Invalid redirect URI' or redirect errors",[22,44219,44220],{},"The redirect URL in Zoom does not match what Unified sends. Confirm the exact URL for your region and that Strict Mode is not blocking a valid redirect.",[3629,44222,44224],{"id":44223},"app-not-authorized-or-customer-cannot-sign-in",[31,44225,44226],{},"'App not authorized' or customer cannot sign in",[22,44228,44229],{},"The app is likely still in testing and the customer's Zoom account is not an authorized tester. Add them in the Zoom Marketplace, or publish the app.",[3629,44231,44233],{"id":44232},"connection-works-but-data-is-missing",[31,44234,44235],{},"Connection works but data is missing",[22,44237,44238],{},"Usually a missing scope. Compare the scopes in your Zoom app with the tables in Step 2 and add any that apply to the features you use.",[3629,44240,44242],{"id":44241},"zoom-phone-returns-no-calls-or-recordings",[31,44243,44244],{},"Zoom Phone returns no calls or recordings",[2354,44246,44247,44255],{},[2357,44248,44249,44250,43995,44252,44254],{},"Confirm ",[36,44251,43956],{},[36,44253,43966],{}," are added.",[2357,44256,44257],{},"Confirm the connected account has Zoom Phone and admin access to phone data.",[3629,44259,44261],{"id":44260},"after-publishing-connections-stopped-working",[31,44262,44263],{},"After publishing, connections stopped working",[22,44265,44266,44267,44269],{},"Update Unified with the ",[31,44268,43608],{}," Client ID and Client Secret, then ask affected users to connect again.",[19,44271],{},[55,44273,44275],{"id":44274},"related-zoom-products",[31,44276,44277],{},"Related Zoom products",[22,44279,44280,44281,44284],{},"Unified also supports ",[31,44282,44283],{},"Zoom Calendar"," as a separate integration with its own calendar-specific scopes. If you only need Zoom meetings, webinars, users, and Zoom Phone, follow this guide. If you need Zoom's native calendar product, enable the Zoom Calendar integration and add its scopes in the same (or a separate) Zoom OAuth app.",[22,44286,44287,44288,97],{},"For Zoom developer documentation, see ",[41,44289,44292],{"href":44290,"rel":44291},"https:\u002F\u002Fdevelopers.zoom.us\u002F",[45],[31,44293,44294],{},"developers.zoom.us",{"title":2433,"searchDepth":2434,"depth":2434,"links":44296},[44297,44298,44301,44307,44308,44309,44313,44314,44321],{"id":43507,"depth":2434,"text":43510},{"id":43543,"depth":2434,"text":43546,"children":44299},[44300],{"id":43639,"depth":2613,"text":43642},{"id":43705,"depth":2434,"text":43708,"children":44302},[44303,44304,44305,44306],{"id":43720,"depth":2613,"text":43723},{"id":43746,"depth":2613,"text":43749},{"id":43819,"depth":2613,"text":43822},{"id":43914,"depth":2613,"text":43917},{"id":43978,"depth":2434,"text":43981},{"id":44016,"depth":2434,"text":44019},{"id":44043,"depth":2434,"text":44046,"children":44310},[44311,44312],{"id":44056,"depth":2613,"text":44059},{"id":44114,"depth":2613,"text":44117},{"id":44147,"depth":2434,"text":44150},{"id":5621,"depth":2434,"text":5622,"children":44315},[44316,44317,44318,44319,44320],{"id":44214,"depth":2613,"text":44217},{"id":44223,"depth":2613,"text":44226},{"id":44232,"depth":2613,"text":44235},{"id":44241,"depth":2613,"text":44244},{"id":44260,"depth":2613,"text":44263},{"id":44274,"depth":2434,"text":44277},"This guide walks you through creating a Zoom OAuth app, configuring the right permissions, and connecting your Zoom account. You will need a Zoom account with...",{"img":44324,"date":44325,"updated":44326,"tag":2457,"integrations":44327},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_connect_zoom_and_zoom_phone-icon.png","2026-07-02T12:33:00.000Z","2026-08-23T14:54:23.073Z","zoom, zoomphone","\u002Fguides\u002Fhow_to_connect_zoom_and_zoom_phone",{"title":43487,"description":44322},"guides\u002Fhow_to_connect_zoom_and_zoom_phone","U-Rtp_SsPNVK-yy-44OS5veWmA2QFcSZrtohn0pCGhE",{"id":44333,"title":44334,"body":44335,"description":44349,"extension":2452,"meta":44599,"navigation":2459,"path":44604,"seo":44605,"stem":44606,"__hash__":44607},"guides\u002Fguides\u002Fhow_to_create_a_connection_in_microsoft_teams.md","How to create a Connection In Microsoft Teams",{"type":12,"value":44336,"toc":44588},[44337,44340,44342,44347,44350,44357,44360,44364,44371,44377,44380,44384,44387,44397,44401,44404,44414,44418,44421,44426,44428,44432,44486,44488,44492,44498,44501,44531,44536,44541,44545,44548,44551,44556,44559,44565,44570,44574,44576,44580,44583,44586],[15,44338,44334],{"id":44339},"how-to-create-a-connection-in-microsoft-teams",[19,44341],{},[22,44343,44344],{},[25,44345,44346],{},"June 5, 2026",[22,44348,44349],{},"Most Microsoft products follow the same standard process for creating a connection, but Microsoft Teams is slightly different.",[22,44351,44352,44353,44356],{},"To access Unified Communications (UC) objects such as call records, Microsoft requires ",[31,44354,44355],{},"application-level permissions"," in addition to delegated permissions. This is necessary because Microsoft does not allow access to certain Teams resources using delegated permissions alone.",[22,44358,44359],{},"Before your end-users can authorize a MS Teams connection, you must first register an application in Microsoft Azure and configure the required permissions.",[55,44361,44363],{"id":44362},"step-1-register-your-microsoft-application","Step 1: Register Your Microsoft Application",[22,44365,44366,44367,741,44369,2646],{},"Follow the guide below to register your application and obtain your ",[31,44368,4491],{},[31,44370,4494],{},[22,44372,44373],{},[41,44374,44375],{"href":44375,"rel":44376},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365#how-to-get-your-oauth-2-credentials-for-microsoft-dynamics-365",[45],[22,44378,44379],{},"Once you have completed the application registration, continue with the permission setup steps below.",[55,44381,44383],{"id":44382},"microsoft-teams-permission-types","Microsoft Teams Permission Types",[22,44385,44386],{},"Microsoft Teams uses two types of permissions:",[2510,44388,44389,44393],{},[2357,44390,44391],{},[31,44392,22414],{},[2357,44394,44395],{},[31,44396,22444],{},[3629,44398,44400],{"id":44399},"resources-that-require-delegated-permissions","Resources That Require Delegated Permissions",[22,44402,44403],{},"The following categories only require delegated permissions:",[2354,44405,44406,44408,44411],{},[2357,44407,23751],{},[2357,44409,44410],{},"HRIS",[2357,44412,44413],{},"Calendar",[3629,44415,44417],{"id":44416},"resources-that-require-application-permissions","Resources That Require Application Permissions",[22,44419,44420],{},"The following category requires application permissions:",[2354,44422,44423],{},[2357,44424,44425],{},"Call Records",[19,44427],{},[55,44429,44431],{"id":44430},"step-2-configure-delegated-permissions","Step 2: Configure Delegated Permissions",[2510,44433,44434,44437,44441,44450,44459,44468,44476],{},[2357,44435,44436],{},"Open your registered application in Azure Portal.",[2357,44438,16270,44439,97],{},[31,44440,22577],{},[2357,44442,16292,44443,97,44445,44447],{},[31,44444,22581],{},[5888,44446],{},[4201,44448],{"alt":5892,"src":44449},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_connection_in_microsoft_teams-0.png",[2357,44451,21834,44452,97,44454,44456],{},[31,44453,22585],{},[5888,44455],{},[4201,44457],{"alt":5892,"src":44458},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_connection_in_microsoft_teams-1.png",[2357,44460,21834,44461,97,44463,44465],{},[31,44462,22589],{},[5888,44464],{},[4201,44466],{"alt":5892,"src":44467},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_connection_in_microsoft_teams-2.png",[2357,44469,44470,44471,44473],{},"Search for and select the required delegated permissions.",[5888,44472],{},[4201,44474],{"alt":5892,"src":44475},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_connection_in_microsoft_teams-3.png",[2357,44477,16292,44478,97,44481,44483],{},[31,44479,44480],{},"Add permissions",[5888,44482],{},[4201,44484],{"alt":5892,"src":44485},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_connection_in_microsoft_teams-4.png",[19,44487],{},[55,44489,44491],{"id":44490},"step-3-configure-application-permissions-required-for-call-records","Step 3: Configure Application Permissions (Required for Call Records)",[22,44493,44494,44495,44497],{},"If you need access to Call Records, repeat the steps above but select ",[31,44496,22599],{}," instead of Delegated permissions.",[22,44499,44500],{},"Search for and add the following permissions:",[2584,44502,44504],{"className":2649,"code":44503,"language":2651,"meta":2652,"style":2433},"CallRecords.Read.All\nOnlineMeetingRecording.Read.All\nOnlineMeetingTranscript.Read.All\nCallRecordings.Read.All\nCallTranscripts.Read.All\n",[36,44505,44506,44511,44516,44521,44526],{"__ignoreMap":2433},[414,44507,44508],{"class":2593,"line":2594},[414,44509,44510],{},"CallRecords.Read.All\n",[414,44512,44513],{"class":2593,"line":2434},[414,44514,44515],{},"OnlineMeetingRecording.Read.All\n",[414,44517,44518],{"class":2593,"line":2613},[414,44519,44520],{},"OnlineMeetingTranscript.Read.All\n",[414,44522,44523],{"class":2593,"line":2625},[414,44524,44525],{},"CallRecordings.Read.All\n",[414,44527,44528],{"class":2593,"line":2677},[414,44529,44530],{},"CallTranscripts.Read.All\n",[22,44532,44533],{},[4201,44534],{"alt":5892,"src":44535},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_connection_in_microsoft_teams-5.png",[22,44537,44538,44539,97],{},"After selecting all required permissions, click ",[31,44540,44480],{},[55,44542,44544],{"id":44543},"step-4-create-the-connection","Step 4: Create the Connection",[22,44546,44547],{},"After configuring permissions, create your Microsoft Teams connection.",[22,44549,44550],{},"If you have not yet obtained your Client ID and Client Secret, follow this guide:",[22,44552,44553],{},[41,44554,44375],{"href":44375,"rel":44555},[45],[22,44557,44558],{},"Enter the following credentials:",[2354,44560,44561,44563],{},[2357,44562,4491],{},[2357,44564,4494],{},[22,44566,44567],{},[4201,44568],{"alt":5892,"src":44569},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_connection_in_microsoft_teams-6.png",[22,44571,16292,44572,97],{},[31,44573,16295],{},[19,44575],{},[55,44577,44579],{"id":44578},"youre-ready-to-go","You're Ready to Go",[22,44581,44582],{},"Your Microsoft Teams integration is now configured and ready to use.",[22,44584,44585],{},"If you have any questions or encounter any issues during setup, please contact our support team.",[4156,44587,5736],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":44589},[44590,44591,44595,44596,44597,44598],{"id":44362,"depth":2434,"text":44363},{"id":44382,"depth":2434,"text":44383,"children":44592},[44593,44594],{"id":44399,"depth":2613,"text":44400},{"id":44416,"depth":2613,"text":44417},{"id":44430,"depth":2434,"text":44431},{"id":44490,"depth":2434,"text":44491},{"id":44543,"depth":2434,"text":44544},{"id":44578,"depth":2434,"text":44579},{"img":44600,"date":44601,"updated":44602,"tag":2457,"integrations":44603},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_connection_in_microsoft_teams-icon.png","2026-06-05T21:00:00.000Z","2026-08-23T14:54:19.103Z","microsoftteams","\u002Fguides\u002Fhow_to_create_a_connection_in_microsoft_teams",{"title":44334,"description":44349},"guides\u002Fhow_to_create_a_connection_in_microsoft_teams","hsC3XHh-q0SICuHBc39SjKEL24Vp4PQSqnySF28g1O8",{"id":44609,"title":44610,"body":44611,"description":45120,"extension":2452,"meta":45121,"navigation":2459,"path":45125,"seo":45126,"stem":45127,"__hash__":45128},"guides\u002Fguides\u002Fhow_to_create_a_token_based_connection_in_highlevel.md","How to create a token-based connection in Highlevel",{"type":12,"value":44612,"toc":45114},[44613,44616,44618,44623,44634,44636,44640,44643,44659,44671,44678,44680,44683,44695,44698,45072,45074,45078,45081,45083,45086,45105,45112],[15,44614,44610],{"id":44615},"how-to-create-a-token-based-connection-in-highlevel",[19,44617],{},[22,44619,44620],{},[25,44621,44622],{},"April 23, 2026",[22,44624,44625,44626,44629,44630,44633],{},"This guide walks you through creating a ",[31,44627,44628],{},"HighLevel token-based connection"," using a ",[31,44631,44632],{},"sub-account (location) API key"," in Unified.",[19,44635],{},[55,44637,44639],{"id":44638},"️-important-context","⚠️ Important Context",[22,44641,44642],{},"HighLevel operates on two levels:",[2354,44644,44645,44650],{},[2357,44646,44647],{},[31,44648,44649],{},"Agency level (company)",[2357,44651,44652,44655,44656],{},[31,44653,44654],{},"Sub-account level (location)"," ✅ ",[25,44657,44658],{},"(token-based authentication works only here)",[22,44660,44661,44662,741,44664,44666,44667,44670],{},"To access ",[31,44663,23529],{},[31,44665,44410],{}," data, you must use a ",[31,44668,44669],{},"sub-account (location)"," API key.",[4937,44672,44673],{},[22,44674,44675,44677],{},[31,44676,22779],{}," HighLevel offers multiple ways to create connections. To avoid issues, follow every step in this guide carefully.",[19,44679],{},[55,44681,44682],{"id":2541},"✅ Prerequisites",[2354,44684,44685],{},[2357,44686,44687,44688,4149,44691,44694],{},"You must have ",[31,44689,44690],{},"Admin",[31,44692,44693],{},"Owner"," access to the sub-account.",[55,44696,44697],{"id":20910},"🔧 Step-by-Step Setup",[2510,44699,44700,44714,44730,44743,44757,44949,44966,44988,45029,45055],{},[2357,44701,44702,44703,44705,44706,97,44709,44711],{},"Navigate to Your Sub-Account",[5888,44704],{},"Go to your ",[31,44707,44708],{},"HighLevel sub-account (location)",[5888,44710],{},[4201,44712],{"alt":5892,"src":44713},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_token_based_connection_in_highlevel-0.png",[2357,44715,44716,44717,21005,44719,34,44722,44725,44727],{},"Open Private Integrations",[5888,44718],{},[31,44720,44721],{},"Settings → Private Integrations",[25,44723,44724],{},"(inside the sub-account)",[5888,44726],{},[4201,44728],{"alt":5892,"src":44729},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_token_based_connection_in_highlevel-1.png",[2357,44731,44732,44733,16292,44735,44738,44740],{},"Create a New Integration",[5888,44734],{},[31,44736,44737],{},"Create Integration",[5888,44739],{},[4201,44741],{"alt":5892,"src":44742},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_token_based_connection_in_highlevel-2.png",[2357,44744,44745,44746,44748,44749,2980,44752,44754],{},"Name Your Integration",[5888,44747],{},"Provide a clear name for your token (e.g., ",[36,44750,44751],{},"Unified Integration",[5888,44753],{},[4201,44755],{"alt":5892,"src":44756},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_token_based_connection_in_highlevel-3.png",[2357,44758,44759,44760,44762,44763],{},"Select Required Scopes",[5888,44761],{},"Choose scopes based on your use case:",[155,44764,44765,44778],{},[158,44766,44767],{},[161,44768,44769,44772,44775],{},[164,44770,44771],{},"Permission",[164,44773,44774],{},"Resource",[164,44776,44777],{},"HighLevel Scopes",[174,44779,44780,44792,44803,44818,44832,44844,44855,44867,44878,44889,44899,44910,44924,44934],{},[161,44781,44782,44784,44787],{},[179,44783,4650],{},[179,44785,44786],{},"CRM Contact",[179,44788,44789],{},[36,44790,44791],{},"contacts.readonly",[161,44793,44794,44796,44798],{},[179,44795,4653],{},[179,44797,44786],{},[179,44799,44800],{},[36,44801,44802],{},"contacts.write",[161,44804,44805,44807,44810],{},[179,44806,4650],{},[179,44808,44809],{},"CRM Company",[179,44811,44812,319,44815],{},[36,44813,44814],{},"businesses.readonly",[36,44816,44817],{},"locations\u002Ftags.readonly",[161,44819,44820,44822,44824],{},[179,44821,4653],{},[179,44823,44809],{},[179,44825,44826,319,44829],{},[36,44827,44828],{},"businesses.write",[36,44830,44831],{},"locations\u002Ftags.write",[161,44833,44834,44836,44839],{},[179,44835,4650],{},[179,44837,44838],{},"CRM Deal",[179,44840,44841],{},[36,44842,44843],{},"opportunities.readonly",[161,44845,44846,44848,44850],{},[179,44847,4653],{},[179,44849,44838],{},[179,44851,44852],{},[36,44853,44854],{},"opportunities.write",[161,44856,44857,44859,44862],{},[179,44858,4650],{},[179,44860,44861],{},"HRIS Employee",[179,44863,44864],{},[36,44865,44866],{},"users.readonly",[161,44868,44869,44871,44873],{},[179,44870,4653],{},[179,44872,44861],{},[179,44874,44875],{},[36,44876,44877],{},"users.write",[161,44879,44880,44882,44885],{},[179,44881,4650],{},[179,44883,44884],{},"CRM Lead",[179,44886,44887],{},[36,44888,44791],{},[161,44890,44891,44893,44895],{},[179,44892,4653],{},[179,44894,44884],{},[179,44896,44897],{},[36,44898,44802],{},[161,44900,44901,44903,44906],{},[179,44902,4650],{},[179,44904,44905],{},"CRM Pipeline",[179,44907,44908],{},[36,44909,44843],{},[161,44911,44912,44914,44917],{},[179,44913,4650],{},[179,44915,44916],{},"CRM Event",[179,44918,44919,319,44922],{},[36,44920,44921],{},"forms.readonly",[36,44923,44791],{},[161,44925,44926,44928,44930],{},[179,44927,4653],{},[179,44929,44916],{},[179,44931,44932],{},[36,44933,44802],{},[161,44935,44936,44945,44947],{},[179,44937,44938,34,44941],{},[31,44939,44940],{},"Reference:",[41,44942,44943],{"href":44943,"rel":44944},"https:\u002F\u002Fmarketplace.gohighlevel.com\u002Fdocs\u002FAuthorization\u002FScopes",[45],[179,44946],{},[179,44948],{},[2357,44950,44951,44952,16292,44954,44957,44958,44961,44963],{},"Create and Confirm",[5888,44953],{},[31,44955,44956],{},"Create, t","hen click ",[31,44959,44960],{},"Confirm",[5888,44962],{},[4201,44964],{"alt":5892,"src":44965},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_token_based_connection_in_highlevel-4.png",[2357,44967,44968,44969,44971,44972,44975,44977,44980,44982,44983,44985],{},"Copy API Token",[5888,44970],{},"You will receive an ",[31,44973,44974],{},"API Token",[5888,44976],{},[4201,44978],{"alt":5892,"src":44979},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_token_based_connection_in_highlevel-5.png",[5888,44981],{},"Store it securely (you won't be able to retrieve it later)",[5888,44984],{},[4201,44986],{"alt":5892,"src":44987},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_token_based_connection_in_highlevel-6.png",[2357,44989,44990,44991,44993,44994,2646,44997,44999,45002,45004,45005,17183,45007,45016,45018,45019,45022,45023,45025,45026],{},"Get Location ID",[5888,44992],{},"To find your ",[31,44995,44996],{},"Location ID",[5888,44998],{},[4201,45000],{"alt":5892,"src":45001},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_token_based_connection_in_highlevel-7.png",[5888,45003],{},"Look at the URL of your sub-account",[5888,45006],{},[2584,45008,45010],{"className":2649,"code":45009,"language":2651,"meta":2652,"style":2433},"https:\u002F\u002Fapp.gohighlevel.com\u002Fv2\u002Flocation\u002FtG38xt5twyoGISw4o92p\u002Fsettings\u002Fprivate-integrations\u002F...\n",[36,45011,45012],{"__ignoreMap":2433},[414,45013,45014],{"class":2593,"line":2594},[414,45015,45009],{},[5888,45017],{},"The value after ",[36,45020,45021],{},"\u002Flocation\u002F"," is your ",[31,45024,44996],{},"\n→ ",[36,45027,45028],{},"tG38xt5twyoGISw4o92p",[2357,45030,45031,45032,45050,45052],{},"Connect in Unified",[2354,45033,45034,45041,45046],{},[2357,45035,45036,45037],{},"Go to: ",[41,45038,45039],{"href":45039,"rel":45040},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fhighlevel",[45],[2357,45042,21834,45043],{},[31,45044,45045],{},"API TOKEN",[2357,45047,16292,45048],{},[31,45049,16295],{},[5888,45051],{},[4201,45053],{"alt":5892,"src":45054},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_token_based_connection_in_highlevel-8.png",[2357,45056,45057,45058,45060,45061,45064,45065,45067,45069],{},"Create Connection",[5888,45059],{},"Paste ",[31,45062,45063],{},"API Token and Location ID, then c","lick ",[31,45066,45057],{},[5888,45068],{},[4201,45070],{"alt":5892,"src":45071},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_token_based_connection_in_highlevel-9.png",[19,45073],{},[55,45075,45077],{"id":45076},"done","✅ Done",[22,45079,45080],{},"Your HighLevel token-based connection should now be successfully set up in Unified.",[19,45082],{},[22,45084,45085],{},"If it doesn't work, double-check:",[2354,45087,45088,45094,45100],{},[2357,45089,45090,45091],{},"You created the token at the ",[31,45092,45093],{},"sub-account level",[2357,45095,45096,45097,45099],{},"The correct ",[31,45098,16739],{}," are selected",[2357,45101,8879,45102,45104],{},[31,45103,44996],{}," matches the sub-account",[22,45106,45107,45108,45111],{},"If you have any more doubts or issues, please contact the ",[41,45109,123],{"href":121,"rel":45110},[45]," team for support.",[4156,45113,5736],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":45115},[45116,45117,45118,45119],{"id":44638,"depth":2434,"text":44639},{"id":2541,"depth":2434,"text":44682},{"id":20910,"depth":2434,"text":44697},{"id":45076,"depth":2434,"text":45077},"This guide walks you through creating a HighLevel token-based connection using a sub-account (location) API key in Unified.",{"img":7949,"date":45122,"updated":45123,"tag":2457,"integrations":45124},"2026-04-23T16:55:00.000Z","2026-08-23T14:53:15.769Z","highlevel","\u002Fguides\u002Fhow_to_create_a_token_based_connection_in_highlevel",{"title":44610,"description":45120},"guides\u002Fhow_to_create_a_token_based_connection_in_highlevel","32XYNrO1VnKLIE0oKHoGkfykgVNfo6_qNikxoItJDQw",{"id":45130,"title":45131,"body":45132,"description":45479,"extension":2452,"meta":45480,"navigation":2459,"path":45484,"seo":45485,"stem":45486,"__hash__":45487},"guides\u002Fguides\u002Fhow_to_create_a_unified_connection_to_highlevel.md","How to Create a Unified.to Connection to HighLevel",{"type":12,"value":45133,"toc":45466},[45134,45137,45139,45144,45151,45162,45164,45166,45169,45183,45185,45189,45204,45209,45282,45284,45288,45295,45300,45310,45317,45322,45325,45327,45331,45376,45378,45382,45396,45399,45401,45405,45409,45414,45418,45426,45430,45438,45440,45443,45451,45453,45456],[15,45135,45131],{"id":45136},"how-to-create-a-unifiedto-connection-to-highlevel",[19,45138],{},[22,45140,45141],{},[25,45142,45143],{},"March 19, 2026",[22,45145,45146,45147,45150],{},"This guide explains how to connect an existing HighLevel account to ",[41,45148,123],{"href":121,"rel":45149},[45],". It assumes:",[2354,45152,45153,45156,45159],{},[2357,45154,45155],{},"You already have a Unified.to account",[2357,45157,45158],{},"You already have a HighLevel account",[2357,45160,45161],{},"You have access to a HighLevel Developer (Agency) account",[19,45163],{},[55,45165,4426],{"id":4425},[22,45167,45168],{},"To create a connection between Unified.to and HighLevel, you will:",[2510,45170,45171,45174,45177,45180],{},[2357,45172,45173],{},"Create or configure a HighLevel OAuth app",[2357,45175,45176],{},"Collect required credentials (Client ID, Client Secret, etc.)",[2357,45178,45179],{},"Use Unified.to to create a connection",[2357,45181,45182],{},"Authorize the connection via OAuth",[19,45184],{},[55,45186,45188],{"id":45187},"step-1-create-a-highlevel-oauth-app","Step 1: Create a HighLevel OAuth App",[2510,45190,45191,45199],{},[2357,45192,45193,45194],{},"Log in to your HighLevel Developer (Agency) account ",[41,45195,45198],{"href":45196,"rel":45197},"https:\u002F\u002Fmarketplace.gohighlevel.com\u002Fapps",[45],"link",[2357,45200,16460,45201,97],{},[31,45202,45203],{},"App Dashboard",[22,45205,45206],{},[4201,45207],{"alt":5892,"src":45208},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_unified_connection_to_highlevel-0.png",[2510,45210,45211,45216,45279],{},[2357,45212,16292,45213],{},[31,45214,45215],{},"Create App",[2357,45217,45218,45219,45268,20403,45270,45273,45274,45276],{},"Fill in the required details:",[2354,45220,45221,45232,45258],{},[2357,45222,45223,45226,45227,45229],{},[31,45224,45225],{},"App Name",": Any name (e.g., Unified Integration)",[5888,45228],{},[4201,45230],{"alt":5892,"src":45231},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_unified_connection_to_highlevel-1.png",[2357,45233,45234,45236,45237,45240,45241,45244,45245,97,45248,45250,45253,45255],{},[31,45235,36424],{},": In ",[31,45238,45239],{},"Advanced settings → Auth",", set the redirect URL to the value shown on the integration's ",[31,45242,45243],{},"OAuth2 Credentials"," page in ",[41,45246,123],{"href":121,"rel":45247},[45],[5888,45249],{},[4201,45251],{"alt":5892,"src":45252},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_unified_connection_to_highlevel-2.png",[5888,45254],{},[4201,45256],{"alt":5892,"src":45257},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_unified_connection_to_highlevel-3.png",[2357,45259,45260,45262,45263,45265],{},[31,45261,36554],{},": Use the scopes listed on the HighLevel app setup page.",[5888,45264],{},[4201,45266],{"alt":5892,"src":45267},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_unified_connection_to_highlevel-4.png",[5888,45269],{},[41,45271,123],{"href":121,"rel":45272},[45],", you can also find the required scopes listed below the integration page.",[5888,45275],{},[4201,45277],{"alt":5892,"src":45278},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_unified_connection_to_highlevel-5.png",[2357,45280,45281],{},"Save the app in HighLevel.",[19,45283],{},[55,45285,45287],{"id":45286},"step-2-get-credentials","Step 2: Get Credentials",[22,45289,45290,45291,45294],{},"After creating the app, go to ",[31,45292,45293],{},"Manage → Secrets"," and add:",[22,45296,45297],{},[4201,45298],{"alt":5892,"src":45299},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_unified_connection_to_highlevel-6.png",[2354,45301,45302,45306],{},[2357,45303,45304],{},[31,45305,4491],{},[2357,45307,45308],{},[31,45309,4494],{},[22,45311,45312,45313,45316],{},"To find the ",[31,45314,45315],{},"Version ID",", open the install link and copy the Version ID from the resulting page.",[22,45318,45319],{},[4201,45320],{"alt":5892,"src":45321},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_unified_connection_to_highlevel-7.png",[22,45323,45324],{},"Keep these secure. You will need them in Unified.to.",[19,45326],{},[55,45328,45330],{"id":45329},"step-3-create-connection-in-unifiedto","Step 3: Create Connection in Unified.to",[2510,45332,45333,45336,45340,45346,45364,45367,45372],{},[2357,45334,45335],{},"Log in to your Unified.to dashboard",[2357,45337,16270,45338,97],{},[31,45339,4433],{},[2357,45341,21834,45342,45345],{},[31,45343,45344],{},"HighLevel"," as the integration",[2357,45347,45348,45349],{},"Enter the following details:\n",[2354,45350,45351,45356,45360],{},[2357,45352,45353,45355],{},[31,45354,4491],{}," (from HighLevel)",[2357,45357,45358,45355],{},[31,45359,4494],{},[2357,45361,45362,45355],{},[31,45363,45315],{},[2357,45365,45366],{},"Click Activate",[2357,45368,21005,45369,97],{},[31,45370,45371],{},"Embedded Components",[2357,45373,16292,45374,97],{},[31,45375,45344],{},[19,45377],{},[55,45379,45381],{"id":45380},"step-4-authorize-the-connection","Step 4: Authorize the Connection",[2510,45383,45384,45387,45390,45393],{},[2357,45385,45386],{},"You will be redirected to HighLevel",[2357,45388,45389],{},"Log in (if not already logged in)",[2357,45391,45392],{},"Select the account\u002Flocation you want to connect",[2357,45394,45395],{},"Approve the requested permissions",[22,45397,45398],{},"Once approved, you will be redirected back to Unified.to",[19,45400],{},[55,45402,45404],{"id":45403},"common-issues-troubleshooting","Common Issues & Troubleshooting",[3629,45406,45408],{"id":45407},"_1-invalid-redirect-uri","1. Invalid Redirect URI",[2354,45410,45411],{},[2357,45412,45413],{},"Ensure the redirect URL in HighLevel exactly matches the one used by Unified.to",[3629,45415,45417],{"id":45416},"_2-unauthorized-401-errors","2. Unauthorized \u002F 401 Errors",[2354,45419,45420,45423],{},[2357,45421,45422],{},"Double-check Client ID and Client Secret",[2357,45424,45425],{},"Ensure the OAuth app is active",[3629,45427,45429],{"id":45428},"_3-missing-data","3. Missing Data",[2354,45431,45432,45435],{},[2357,45433,45434],{},"Ensure correct scopes are selected in HighLevel",[2357,45436,45437],{},"Some data may depend on the selected location\u002Faccount",[19,45439],{},[55,45441,8570],{"id":45442},"notes",[2354,45444,45445,45448],{},[2357,45446,45447],{},"HighLevel uses location-based access. Make sure you select the correct location during authorization",[2357,45449,45450],{},"You can create multiple connections for different locations if needed",[19,45452],{},[22,45454,45455],{},"If you run into issues, reach out to the Unified.to support team with:",[2354,45457,45458,45460,45463],{},[2357,45459,21098],{},[2357,45461,45462],{},"Error logs",[2357,45464,45465],{},"Steps to reproduce",{"title":2433,"searchDepth":2434,"depth":2434,"links":45467},[45468,45469,45470,45471,45472,45473,45478],{"id":4425,"depth":2434,"text":4426},{"id":45187,"depth":2434,"text":45188},{"id":45286,"depth":2434,"text":45287},{"id":45329,"depth":2434,"text":45330},{"id":45380,"depth":2434,"text":45381},{"id":45403,"depth":2434,"text":45404,"children":45474},[45475,45476,45477],{"id":45407,"depth":2613,"text":45408},{"id":45416,"depth":2613,"text":45417},{"id":45428,"depth":2613,"text":45429},{"id":45442,"depth":2434,"text":8570},"This guide explains how to connect an existing HighLevel account to Unified.to. It assumes,",{"img":45481,"date":45482,"updated":45483,"tag":2457,"integrations":45124},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_unified_connection_to_highlevel-icon.png","2026-03-19T20:01:00.000Z","2026-08-23T14:53:25.394Z","\u002Fguides\u002Fhow_to_create_a_unified_connection_to_highlevel",{"title":45131,"description":45479},"guides\u002Fhow_to_create_a_unified_connection_to_highlevel","jpR2cKl_oHKxooPfNEOdnxH4VSTVFeyWqda89O89tZE",{"id":45489,"title":45490,"body":45491,"description":45505,"extension":2452,"meta":45775,"navigation":2459,"path":45780,"seo":45781,"stem":45782,"__hash__":45783},"guides\u002Fguides\u002Fhow_to_create_a_xero_connection_in_unified.md","How to Create a Xero Connection in Unified.to",{"type":12,"value":45492,"toc":45761},[45493,45496,45498,45503,45506,45510,45513,45519,45522,45526,45532,45535,45549,45554,45559,45563,45566,45569,45575,45580,45583,45594,45597,45602,45604,45606,45611,45615,45622,45625,45631,45636,45641,45645,45648,45654,45657,45663,45667,45672,45676,45679,45699,45702,45704,45708,45714,45721,45725,45742,45744,45747],[15,45494,45490],{"id":45495},"how-to-create-a-xero-connection-in-unifiedto",[19,45497],{},[22,45499,45500],{},[25,45501,45502],{},"April 2, 2026",[22,45504,45505],{},"Follow the steps below to create a Xero application and connect it to Unified.to.",[55,45507,45509],{"id":45508},"_1-sign-in-to-the-xero-developer-portal","1. Sign in to the Xero Developer Portal",[22,45511,45512],{},"Go to the Xero Developer portal:",[22,45514,45515],{},[41,45516,45517],{"href":45517,"rel":45518},"https:\u002F\u002Fdeveloper.xero.com\u002Fapp\u002Fmanage\u002F",[45],[22,45520,45521],{},"Sign in with your Xero account.",[55,45523,45525],{"id":45524},"_2-create-a-new-app","2. Create a New App",[22,45527,45528,45529,97],{},"From the dashboard, click ",[31,45530,45531],{},"Create New App",[22,45533,45534],{},"Choose the appropriate app type and fill in the required details:",[2354,45536,45537,45540,45543,45546],{},[2357,45538,45539],{},"App name",[2357,45541,45542],{},"Company or organization name",[2357,45544,45545],{},"Privacy policy URL",[2357,45547,45548],{},"Terms and conditions URL (if required)",[22,45550,45551],{},[4201,45552],{"alt":5892,"src":45553},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_xero_connection_in_unified-0.png",[22,45555,45556],{},[4201,45557],{"alt":5892,"src":45558},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_xero_connection_in_unified-1.png",[55,45560,45562],{"id":45561},"_3-add-the-redirect-uri","3. Add the Redirect URI",[22,45564,45565],{},"While creating the app, add the OAuth 2.0 Redirect URI provided by Unified.to.",[22,45567,45568],{},"You can find the correct redirect URI here:",[22,45570,45571],{},[41,45572,45573],{"href":45573,"rel":45574},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fxero?tab=oauth2",[45],[4937,45576,45577],{},[22,45578,45579],{},"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.",[22,45581,45582],{},"Examples:",[2354,45584,45585,45588,45591],{},[2357,45586,45587],{},"US region",[2357,45589,45590],{},"EU region",[2357,45592,45593],{},"AU region",[22,45595,45596],{},"If the redirect URI does not match exactly, Xero authentication will fail.",[22,45598,45599,45600,97],{},"After adding the redirect URI, click ",[31,45601,45215],{},[19,45603],{},[55,45605],{"id":2433},[22,45607,45608],{},[4201,45609],{"alt":5892,"src":45610},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_xero_connection_in_unified-2.png",[55,45612,45614],{"id":45613},"_4-copy-the-client-id-and-client-secret","4. Copy the Client ID and Client Secret",[22,45616,45617,45618,45621],{},"After the app is created, open the app and go to the ",[31,45619,45620],{},"Configuration"," tab.",[22,45623,45624],{},"There you will find:",[2354,45626,45627,45629],{},[2357,45628,4491],{},[2357,45630,4494],{},[4937,45632,45633],{},[22,45634,45635],{},"Keep the Client Secret secure. Do not share it publicly or commit it to source control.",[22,45637,45638],{},[4201,45639],{"alt":5892,"src":45640},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_xero_connection_in_unified-3.png",[55,45642,45644],{"id":45643},"_5-add-credentials-to-unifiedto","5. Add Credentials to Unified.to",[22,45646,45647],{},"Open the Xero integration settings page in Unified.to:",[22,45649,45650],{},[41,45651,45652],{"href":45652,"rel":45653},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fxero?tab=auth",[45],[22,45655,45656],{},"Paste the following values:",[2354,45658,45659,45661],{},[2357,45660,4491],{},[2357,45662,4494],{},[22,45664,16292,45665,97],{},[31,45666,16295],{},[22,45668,45669],{},[4201,45670],{"alt":5892,"src":45671},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_xero_connection_in_unified-4.png",[55,45673,45675],{"id":45674},"_6-create-a-connection-using-embedded-components","6. Create a Connection Using Embedded Components",[22,45677,45678],{},"To create a customer-facing connection flow:",[2510,45680,45681,45686,45693,45696],{},[2357,45682,21005,45683,45685],{},[31,45684,45371],{}," in Unified.to.",[2357,45687,45688,45689,45692],{},"Select the ",[31,45690,45691],{},"Xero"," integration.",[2357,45694,45695],{},"Launch the embedded authorization flow.",[2357,45697,45698],{},"Complete the authorization process.",[22,45700,45701],{},"This allows your end users to connect their Xero account directly from your application.",[55,45703,8570],{"id":45442},[3629,45705,45707],{"id":45706},"journals-endpoint-availability","Journals Endpoint Availability",[22,45709,8879,45710,45713],{},[36,45711,45712],{},"Journals"," endpoint is a premium Xero feature.",[22,45715,45716,45717,45720],{},"According to Xero's documentation, the Journals API is only available starting with the ",[31,45718,45719],{},"Advanced"," pricing tier. Customers using lower Xero plans may receive authorization or access errors when calling this endpoint.",[3629,45722,45724],{"id":45723},"common-issues","Common Issues",[2354,45726,45727,45730,45733,45736,45739],{},[2357,45728,45729],{},"Ensure the redirect URI in Xero exactly matches the one shown in Unified.to.",[2357,45731,45732],{},"Make sure you are using the correct region-specific Unified.to redirect URI.",[2357,45734,45735],{},"If you regenerate the Client Secret in Xero, you must update it in Unified.to.",[2357,45737,45738],{},"Only users with sufficient permissions in Xero can authorize an organization.",[2357,45740,45741],{},"If you have previously selected an organization for the same Xero app, Xero may automatically reuse that organization during future authorizations.",[3629,45743,5622],{"id":5621},[22,45745,45746],{},"If authentication fails:",[2354,45748,45749,45752,45755,45758],{},[2357,45750,45751],{},"Verify the Client ID and Client Secret are correct.",[2357,45753,45754],{},"Double-check the redirect URI.",[2357,45756,45757],{},"Re-authorize the connection after saving any changes.",[2357,45759,45760],{},"Remove the existing connection and create a new one if necessary.",{"title":2433,"searchDepth":2434,"depth":2434,"links":45762},[45763,45764,45765,45766,45767,45768,45769,45770],{"id":45508,"depth":2434,"text":45509},{"id":45524,"depth":2434,"text":45525},{"id":45561,"depth":2434,"text":45562},{"id":2433,"depth":2434,"text":2433},{"id":45613,"depth":2434,"text":45614},{"id":45643,"depth":2434,"text":45644},{"id":45674,"depth":2434,"text":45675},{"id":45442,"depth":2434,"text":8570,"children":45771},[45772,45773,45774],{"id":45706,"depth":2613,"text":45707},{"id":45723,"depth":2613,"text":45724},{"id":5621,"depth":2613,"text":5622},{"img":45776,"date":45777,"updated":45778,"tag":2457,"integrations":45779},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_a_xero_connection_in_unified-icon.png","2026-04-02T18:29:00.000Z","2026-09-17T14:42:19.951Z","xero","\u002Fguides\u002Fhow_to_create_a_xero_connection_in_unified",{"title":45490,"description":45505},"guides\u002Fhow_to_create_a_xero_connection_in_unified","adfLYhoNsCwij7kfxPwdSRLf7C5FZj0MTgF-2NOZXaw",{"id":45785,"title":5733,"body":45786,"description":46552,"extension":2452,"meta":46553,"navigation":2459,"path":46557,"seo":46558,"stem":46559,"__hash__":46560},"guides\u002Fguides\u002Fhow_to_create_and_configure_webhooks.md",{"type":12,"value":45787,"toc":46535},[45788,45791,45793,45798,45811,45819,45821,45828,45831,45834,45837,45841,45848,45933,45940,45951,45968,45983,45987,45993,46023,46026,46030,46033,46095,46099,46114,46123,46127,46130,46145,46152,46159,46163,46169,46175,46178,46185,46189,46199,46206,46209,46219,46226,46243,46247,46250,46270,46273,46282,46287,46291,46296,46306,46311,46314,46319,46328,46333,46340,46345,46348,46356,46359,46367,46448,46452,46455,46513,46515,46532],[15,45789,5733],{"id":45790},"how-to-create-and-configure-webhooks",[19,45792],{},[22,45794,45795],{},[25,45796,45797],{},"September 4, 2024",[22,45799,45800,45801,45804,45805,45810],{},"This guide goes over how to create and configure webhooks with ",[41,45802,123],{"href":121,"rel":45803},[45],". Webhooks deliver events to your server when records change in your customers' accounts (see ",[41,45806,45809],{"href":45807,"rel":45808},"https:\u002F\u002Funified.to\u002Fblog\u002Fwebhook_vs_api_when_to_use_each_and_how_they_actually_work_together",[45],"webhook vs API"," for the basics).",[22,45812,45813,45814,97],{},"Looking for help with troubleshooting webhook issues? See: ",[41,45815,45818],{"href":45816,"rel":45817},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_troubleshoot_unhealthy_webhooks",[45],"How to troubleshoot unhealthy webhooks",[55,45820,4890],{"id":4889},[22,45822,45823,45824,97],{},"This guide assumes you have a basic understanding of ",[41,45825,45827],{"href":5717,"rel":45826},[45],"webhooks",[55,45829,29568],{"id":45830},"create-a-webhook",[22,45832,45833],{},"Webhooks and connections are closely related; webhooks can only be created from existing connections and you can create multiple webhooks off a single connection. Webhook support is per integration and per object. If an object doesn't support webhooks on an integration, create returns an error saying so. Check the integration's Feature Support tab in the dashboard before building on a webhook. If you delete a connection, any webhooks that are associated with it will also be deleted.",[22,45835,45836],{},"There are two ways to create a webhook:",[3629,45838,45840],{"id":45839},"method-1-use-the-unified-api","Method 1: Use the Unified API",[22,45842,45843,45844,45847],{},"Send a POST request to ",[36,45845,45846],{},"\u002Funified\u002Fwebhook","(see below for configuration options). For example:",[2584,45849,45851],{"className":16485,"code":45850,"language":16487,"meta":2433,"style":2433},"POST \u002Funified\u002Fwebhook?include_all=true\n\n{\n    \"hook_url\": \"YOUR_WEBHOOK_URL\",\n    \"connection_id\": \"YOUR_CONNECTION_ID\",\n    \"object_type\": \"ats_candidate\",\n    \"event\": \"updated\"\n}\n",[36,45852,45853,45875,45879,45883,45895,45907,45919,45929],{"__ignoreMap":2433},[414,45854,45855,45858,45860,45862,45864,45866,45868,45871,45873],{"class":2593,"line":2594},[414,45856,45857],{"class":2607},"POST",[414,45859,11295],{"class":2698},[414,45861,6198],{"class":2705},[414,45863,23303],{"class":2698},[414,45865,29627],{"class":2705},[414,45867,3610],{"class":2698},[414,45869,45870],{"class":2705},"include_all",[414,45872,2798],{"class":2698},[414,45874,10733],{"class":2607},[414,45876,45877],{"class":2593,"line":2434},[414,45878,2740],{"emptyLinePlaceholder":2459},[414,45880,45881],{"class":2593,"line":2613},[414,45882,8916],{"class":2705},[414,45884,45885,45888,45890,45893],{"class":2593,"line":2625},[414,45886,45887],{"class":2601},"    \"hook_url\"",[414,45889,7340],{"class":2705},[414,45891,45892],{"class":2601},"\"YOUR_WEBHOOK_URL\"",[414,45894,2757],{"class":2705},[414,45896,45897,45900,45902,45905],{"class":2593,"line":2677},[414,45898,45899],{"class":2601},"    \"connection_id\"",[414,45901,7340],{"class":2705},[414,45903,45904],{"class":2601},"\"YOUR_CONNECTION_ID\"",[414,45906,2757],{"class":2705},[414,45908,45909,45912,45914,45917],{"class":2593,"line":2751},[414,45910,45911],{"class":2601},"    \"object_type\"",[414,45913,7340],{"class":2705},[414,45915,45916],{"class":2601},"\"ats_candidate\"",[414,45918,2757],{"class":2705},[414,45920,45921,45924,45926],{"class":2593,"line":2760},[414,45922,45923],{"class":2601},"    \"event\"",[414,45925,7340],{"class":2705},[414,45927,45928],{"class":2601},"\"updated\"\n",[414,45930,45931],{"class":2593,"line":2768},[414,45932,3035],{"class":2705},[22,45934,45935,34,45937],{},[31,45936,28958],{},[41,45938,29568],{"href":5078,"rel":45939},[45],[22,45941,45942,45943,45945,45946,20056],{},"By including the optional parameter ",[36,45944,45870],{}," in the query, the webhook will receive all historical data for the connection (see:",[41,45947,45950],{"href":45948,"rel":45949},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_create_and_configure_webhooks#get-all-initial-data-for-a-connection",[45]," Get all initial data for a connection",[22,45952,45953,45954,45957,45958,741,45960,45962,45963,97],{},"For the payload your server receives, including the ",[36,45955,45956],{},"sig256"," signature, ",[36,45959,24431],{},[36,45961,3397],{}," values, see ",[41,45964,45967],{"href":45965,"rel":45966},"https:\u002F\u002Fdocs.unified.to\u002Freference\u002Fwebhooks#webhook-payload",[45],"Webhook payload",[22,45969,45970,45971,45973,45974,45976,45977,319,45979,45982],{},"The objects in ",[36,45972,5590],{}," use the same format as the corresponding API endpoint. The ",[36,45975,27449],{}," option, including ",[36,45978,96],{},[36,45980,45981],{},"raw.*"," and custom fields, works the same way on webhooks as on API calls, for native and virtual webhooks.",[3629,45984,45986],{"id":45985},"method-2-use-the-unifiedto-app","Method 2: Use the Unified.to app",[22,45988,45989,45990,97],{},"If you prefer to create webhooks through the UI, you can do so at ",[41,45991,21814],{"href":4146,"rel":45992},[45],[2510,45994,45995,46007,46012,46015,46018],{},[2357,45996,16270,45997,45999,46000,97],{},[31,45998,4433],{}," > ",[41,46001,46004],{"href":46002,"rel":46003},"https:\u002F\u002Fapp.unified.to\u002Fwebhooks",[45],[31,46005,46006],{},"Webhooks",[2357,46008,16292,46009,97],{},[31,46010,46011],{},"New Webhook",[2357,46013,46014],{},"Click on the input and a list of your connections will appear. Select the connection from which you want to create a webhook.",[2357,46016,46017],{},"Choose how to configure your webhook (see below).",[2357,46019,16292,46020,97],{},[31,46021,46022],{},"Save",[22,46024,46025],{},"Information about the other fields can be found under their respective tooltips in the UI.",[3629,46027,46029],{"id":46028},"webhook-configuration-options","Webhook configuration options",[22,46031,46032],{},"Whether you use the API or our web UI, these are the configuration options you can specify when creating a webhook:",[2510,46034,46035,46041,46053,46063,46074,46085],{},[2357,46036,46037,46040],{},[31,46038,46039],{},"Object:"," The data you are interested in e.g. Deal, Company, Application, etc.",[2357,46042,46043,46046,46047,46049,46050,46052],{},[31,46044,46045],{},"Event:"," The events you want to subscribe to. Note: The ",[25,46048,4953],{}," event will also be sent when the data object is first ",[25,46051,4949],{},". Native webhooks forward deleted events where the vendor sends them. On virtual webhooks, deleted events are reliable only on BambooHR, Dropbox, Google Drive, Gmail, JobAdder, OneDrive, SharePoint, RingCentral, Egnyte and Box.",[2357,46054,46055,46058,46059,97],{},[31,46056,46057],{},"Type:"," Virtual webhooks cover integrations whose APIs don't offer webhooks, or whose webhooks are limited. Where an integration supports both, choose native for immediate updates and virtual to set how often changes are checked and control cost. The type can't be changed after creation (including with PUT); delete and recreate the webhook to switch. For more details, see: ",[41,46060,46062],{"href":22112,"rel":46061},[45],"Understanding virtual webhooks",[2357,46064,46065,46068,46069],{},[31,46066,46067],{},"Filter (optional):"," Specify any properties you want to filter incoming events by. See: ",[41,46070,46073],{"href":46071,"rel":46072},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_create_and_configure_webhooks#use-filters-to-refine-webhook-events",[45],"Use filters to refine webhook events",[2357,46075,46076,46079,46080,97],{},[31,46077,46078],{},"Fields (optional):","  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: ",[41,46081,46084],{"href":46082,"rel":46083},"https:\u002F\u002Fdocs.unified.to\u002Freference\u002Ffields",[45],"Raw and custom fields",[2357,46086,46087,46090,46091,46094],{},[31,46088,46089],{},"Interval (virtual webhooks only):"," Specify how often ",[41,46092,123],{"href":121,"rel":46093},[45]," checks the integration for changes. The minimum is 1 minute on paid plans and 60 minutes on the trial. The interval is ignored on native webhooks and doesn't affect the initial sync.",[55,46096,46098],{"id":46097},"list-your-webhooks","List your webhooks",[22,46100,46101,46102,46104,46105,46108,46109,97],{},"To view your webhooks, make a GET request to ",[36,46103,45846],{}," or visit ",[41,46106,21814],{"href":4146,"rel":46107},[45]," and navigate to Integrations > ",[41,46110,46112],{"href":46002,"rel":46111},[45],[31,46113,46006],{},[22,46115,46116,34,46118],{},[31,46117,28958],{},[41,46119,46122],{"href":46120,"rel":46121},"https:\u002F\u002Fdocs.unified.to\u002Funified\u002Fwebhook\u002FReturns_all_registered_webhooks",[45],"Get all webhooks",[55,46124,46126],{"id":46125},"get-all-initial-data-for-a-connection","Get all initial data for a connection",[22,46128,46129],{},"When you create a webhook, you can choose to fetch all existing data immediately.",[2510,46131,46132,46138],{},[2357,46133,46134,46135,46137],{},"If you are using the API, add the ",[36,46136,45870],{}," query parameter when creating the webhook.",[2357,46139,46140,46141,46144],{},"If you are using the UI, check off ",[31,46142,46143],{},"Initially sync all data"," in the configuration options.",[22,46146,46147,46148,46151],{},"Once the initial sync is complete, you will receive a final payload with ",[36,46149,46150],{},"type: INITIAL-COMPLETE"," and the requested webhook will continue to work as normal. Initial sync works the same way for native and virtual webhooks, wherever the integration supports it. Once it completes, a native webhook receives events as the integration sends them; a virtual webhook checks for changes on its interval.",[22,46153,46154,34,46156],{},[31,46155,28958],{},[41,46157,37038],{"href":5078,"rel":46158},[45],[55,46160,46162],{"id":46161},"a-note-on-retrieving-webhook-data","A note on retrieving webhook data",[22,46164,46165,46166,46168],{},"Our system will POST initial data to your webhook in chunk sizes up to the limit supported by the integration. The limit is shown on the integration's ",[31,46167,21863],{}," tab in the dashboard.",[22,46170,46171,46172,46174],{},"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 ",[36,46173,45870],{}," parameter in the request.",[22,46176,46177],{},"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.",[22,46179,46180,46181,97],{},"For details about the webhook payload that is sent to your server, ",[41,46182,46184],{"href":45965,"rel":46183},[45],"click here",[55,46186,46188],{"id":46187},"specify-which-fields-to-receive-from-a-webhook","Specify which fields to receive from a webhook",[22,46190,46191,46192,46194,46195,97],{},"If you only want a subset of fields when receiving updated data, you can define them with the ",[36,46193,27449],{}," 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: ",[41,46196,46198],{"href":46082,"rel":46197},[45],"Fields",[22,46200,46201,34,46203],{},[31,46202,28958],{},[41,46204,37038],{"href":5078,"rel":46205},[45],[55,46207,46073],{"id":46208},"use-filters-to-refine-webhook-events",[22,46210,46211,34,46214],{},[25,46212,46213],{},"Note: Filters are supported on virtual webhooks and on native webhooks for some integrations. Check the integration's Feature Support tab for which filters apply. For more information, see:",[41,46215,46217],{"href":22112,"rel":46216},[45],[25,46218,46062],{},[22,46220,46221,46222,46225],{},"Some 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 ",[36,46223,46224],{},"company_id"," to only receive events from that specific company.",[22,46227,46228,46229,46231,46232,4149,46235,46237,46238,97],{},"Filter availability varies by integration type and data model. To check which filters are supported for a particular webhook, open the integration's ",[31,46230,21863],{}," tab in the dashboard and check the List Options and Virtual Webhook Options sections. Parameters that end in ",[36,46233,46234],{},"_id",[36,46236,3397],{}," can be used as filter options when creating a webhook, helping you tailor your subscriptions to your specific needs. For worked examples in the dashboard and the API, see ",[41,46239,46242],{"href":46240,"rel":46241},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_filter_webhook_events",[45],"How to filter webhook events",[55,46244,46246],{"id":46245},"trigger-webhooks-manually","Trigger webhooks manually",[22,46248,46249],{},"If you don't want to wait for the next scheduled check while testing a virtual webhook, you can trigger it right away. Manual triggering applies to virtual webhooks only; the API returns 400 for native webhooks.",[2510,46251,46252,46258],{},[2357,46253,46254,46255,97],{},"In the web app, navigate to ",[41,46256,46006],{"href":46002,"rel":46257},[45],[2357,46259,46260,46261,46264,46265,46267],{},"Click the ",[31,46262,46263],{},"Trigger"," icon next to your webhook:",[5888,46266],{},[4201,46268],{"alt":20627,"src":46269},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_and_configure_webhooks-0.png",[22,46271,46272],{},"This can also be accomplished with the API.",[22,46274,46275,34,46277],{},[31,46276,28958],{},[41,46278,46281],{"href":46279,"rel":46280},"https:\u002F\u002Fdocs.unified.to\u002Funified\u002Fwebhook\u002FTrigger_webhook",[45],"Trigger a webhook",[22,46283,46284,46286],{},[31,46285,22779],{}," 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.",[55,46288,46290],{"id":46289},"frequently-asked-questions","Frequently asked questions",[22,46292,46293],{},[31,46294,46295],{},"Is there a page_max_limit for webhooks?",[22,46297,46298,46299,46302,46303,46305],{},"An integration's ",[36,46300,46301],{},"page_max_limit"," typically comes directly from the API provider. You can see that limit on the integration's ",[31,46304,21863],{}," tab in the dashboard. You don't have to set limits for webhooks; they will use the integration's max limit.",[22,46307,46308],{},[31,46309,46310],{},"Does changing the interval for virtual webhooks affect the initial retrieval?",[22,46312,46313],{},"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.",[22,46315,46316],{},[31,46317,46318],{},"How do I distinguish between an updated event and a created event?",[22,46320,46321,46322,741,46325,46327],{},"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 ",[36,46323,46324],{},"created_at",[36,46326,27112],{}," for incoming data. If they are the same, that means the data object was newly created.",[22,46329,46330],{},[31,46331,46332],{},"What happens if the webhook dispatch fails? Is there a retry mechanism in place?",[22,46334,46335,46336,97],{},"If your endpoint doesn't respond, a native webhook is retried 3 times immediately, then marked unhealthy; the event isn't redelivered unless the integration sends it again. A virtual webhook makes up to 3 immediate attempts 1 second apart, then backs off progressively for up to about two weeks, re-reading the same page from the integration rather than resending a stored payload. Its cursor advances only after a successful delivery. When retries are exhausted, the webhook is marked unhealthy and scheduling stops. There's no way to re-enable an unhealthy webhook: fix your endpoint, then recreate the webhook. Failed delivery attempts aren't billed. Read more about it ",[41,46337,28103],{"href":46338,"rel":46339},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_troubleshoot_unhealthy_webhooks#a-note-on-our-webhook-retry-mechanism",[45],[22,46341,46342],{},[31,46343,46344],{},"Why do I receive duplicate webhook events and how should I handle them?",[22,46346,46347],{},"Duplicate webhook events can occur for several reasons:",[2354,46349,46350,46353],{},[2357,46351,46352],{},"Some integrations (like HubSpot) trigger separate events for each property change on an object",[2357,46354,46355],{},"Rapid changes to objects can trigger multiple events that may arrive out of order due to network conditions",[22,46357,46358],{},"To handle duplicates effectively:",[2510,46360,46361,46364],{},[2357,46362,46363],{},"Always use the object's latest state when updating your database",[2357,46365,46366],{},"Implement atomic writes to avoid race conditions. Only update records if the incoming data is newer:",[2584,46368,46370],{"className":16485,"code":46369,"language":16487,"meta":2433,"style":2433},"-- 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",[36,46371,46372,46385,46402,46410,46415,46440],{"__ignoreMap":2433},[414,46373,46374,46377,46380,46382],{"class":2593,"line":2594},[414,46375,46376],{"class":2698},"--",[414,46378,46379],{"class":2705}," Pseudo",[414,46381,34146],{"class":2698},[414,46383,46384],{"class":2705},"code example\n",[414,46386,46387,46390,46393,46396,46399],{"class":2593,"line":2434},[414,46388,46389],{"class":2607},"IF",[414,46391,46392],{"class":2705}," incoming_object.updated_at ",[414,46394,46395],{"class":2698},">=",[414,46397,46398],{"class":2705}," stored_object.updated_at ",[414,46400,46401],{"class":2607},"THEN\n",[414,46403,46404,46407],{"class":2593,"line":2613},[414,46405,46406],{"class":2607},"    UPDATE",[414,46408,46409],{"class":2705}," record\n",[414,46411,46412],{"class":2593,"line":2625},[414,46413,46414],{"class":2607},"ELSE\n",[414,46416,46417,46420,46423,46425,46428,46431,46434,46437],{"class":2593,"line":2677},[414,46418,46419],{"class":2698},"    --",[414,46421,46422],{"class":2705}," Skip update ",[414,46424,7501],{"class":2698},[414,46426,46427],{"class":2597}," we",[414,46429,46430],{"class":2597}," already",[414,46432,46433],{"class":2597}," have",[414,46435,46436],{"class":2597}," newer",[414,46438,46439],{"class":2597}," data\n",[414,46441,46442,46445],{"class":2593,"line":2751},[414,46443,46444],{"class":2607},"END",[414,46446,46447],{"class":2607}," IF\n",[55,46449,46451],{"id":46450},"vendor-specific-native-webhook-setup","Vendor-specific native webhook setup",[22,46453,46454],{},"Some integrations need native webhooks registered in the vendor's own app first. These guides cover the vendor-side steps:",[2354,46456,46457,46464,46471,46478,46485,46492,46499,46506],{},[2357,46458,46459],{},[41,46460,46463],{"href":46461,"rel":46462},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Ffacebook_messenger_webhook_setup",[45],"Facebook Messenger: webhook setup",[2357,46465,46466],{},[41,46467,46470],{"href":46468,"rel":46469},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fconfigure_greenhouse_native_candidate_webhooks",[45],"Greenhouse: native candidate webhooks",[2357,46472,46473],{},[41,46474,46477],{"href":46475,"rel":46476},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_configure_webhooks_in_hubspot",[45],"HubSpot: configure webhooks",[2357,46479,46480],{},[41,46481,46484],{"href":46482,"rel":46483},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_set_up_linkedin_webhooks_with_unified",[45],"LinkedIn: set up webhooks",[2357,46486,46487],{},[41,46488,46491],{"href":46489,"rel":46490},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_set_up_native_webhooks_for_quickbooks_online_with_unified",[45],"QuickBooks Online: native webhooks",[2357,46493,46494],{},[41,46495,46498],{"href":46496,"rel":46497},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_set_up_slack_webhooks_using_event_subscriptions",[45],"Slack: event subscriptions",[2357,46500,46501],{},[41,46502,46505],{"href":46503,"rel":46504},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_configure_webhooks_in_thrive_learning",[45],"Thrive Learning: configure webhooks",[2357,46507,46508],{},[41,46509,46512],{"href":46510,"rel":46511},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_configure_webhooks_in_toast_for_unified",[45],"Toast: configure webhooks",[55,46514,37023],{"id":37022},[2354,46516,46517,46522,46527],{},[2357,46518,46519],{},[41,46520,45818],{"href":45816,"rel":46521},[45],[2357,46523,46524],{},[41,46525,46062],{"href":22112,"rel":46526},[45],[2357,46528,46529],{},[41,46530,46242],{"href":46240,"rel":46531},[45],[4156,46533,46534],{},"html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}",{"title":2433,"searchDepth":2434,"depth":2434,"links":46536},[46537,46538,46543,46544,46545,46546,46547,46548,46549,46550,46551],{"id":4889,"depth":2434,"text":4890},{"id":45830,"depth":2434,"text":29568,"children":46539},[46540,46541,46542],{"id":45839,"depth":2613,"text":45840},{"id":45985,"depth":2613,"text":45986},{"id":46028,"depth":2613,"text":46029},{"id":46097,"depth":2434,"text":46098},{"id":46125,"depth":2434,"text":46126},{"id":46161,"depth":2434,"text":46162},{"id":46187,"depth":2434,"text":46188},{"id":46208,"depth":2434,"text":46073},{"id":46245,"depth":2434,"text":46246},{"id":46289,"depth":2434,"text":46290},{"id":46450,"depth":2434,"text":46451},{"id":37022,"depth":2434,"text":37023},"This guide goes over how to create and configure webhooks with Unified.to. Webhooks deliver events to your server when records change in your customers'...",{"img":46554,"date":46555,"updated":46556,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_and_configure_webhooks-icon.png","2024-09-04T00:00:00.000Z","2026-10-20T14:29:19.395Z","\u002Fguides\u002Fhow_to_create_and_configure_webhooks",{"title":5733,"description":46552},"guides\u002Fhow_to_create_and_configure_webhooks","-uISsgs3ZLvD5G3GeWD-ocGHen_AgJ0FFnUQ7kT0pho",{"id":46562,"title":46563,"body":46564,"description":47174,"extension":2452,"meta":47175,"navigation":2459,"path":47179,"seo":47180,"stem":47181,"__hash__":47182},"guides\u002Fguides\u002Fhow_to_create_connection_with_hubspot.md","How to create Connection with Hubspot",{"type":12,"value":46565,"toc":47172},[46566,46569,46571,46576,46584,46589,46594,46599,46604,46607,46612,46617,46622,46627,46632,46657,46662,46667,46672,46677,46682,46697,46702,46707,46712,46717,46722,46727,46732,46737,46742,46747,47091,47096,47104,47109,47114,47119,47124,47129,47134,47139,47144,47149,47154,47166,47169],[15,46567,46563],{"id":46568},"how-to-create-connection-with-hubspot",[19,46570],{},[22,46572,46573],{},[25,46574,46575],{},"December 17, 2025",[22,46577,46578,46579,46583],{},"Hubspot provides Free Developer Sandbox Account. You can create that from following ",[41,46580,45198],{"href":46581,"rel":46582},"https:\u002F\u002Foffers.hubspot.com\u002Ffree-cms-developer-sandbox",[45]," .",[2510,46585,46586],{},[2357,46587,46588],{},"Create an account.",[22,46590,46591],{},[4201,46592],{"alt":5892,"src":46593},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_connection_with_hubspot-0.png",[2510,46595,46596],{},[2357,46597,46598],{},"Provide name of the account",[22,46600,46601],{},[4201,46602],{"alt":5892,"src":46603},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_connection_with_hubspot-1.png",[22,46605,46606],{},"After account is created it will redirect you to following page:-",[22,46608,46609],{},[4201,46610],{"alt":5892,"src":46611},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_connection_with_hubspot-2.png",[2510,46613,46614],{},[2357,46615,46616],{},"Goto Development page from the size menu",[22,46618,46619],{},[4201,46620],{"alt":5892,"src":46621},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_connection_with_hubspot-3.png",[2510,46623,46624],{},[2357,46625,46626],{},"Create a project in IDE and install and install using following command",[22,46628,46629],{},[4201,46630],{"alt":5892,"src":46631},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_connection_with_hubspot-4.png",[2584,46633,46635],{"className":16485,"code":46634,"language":16487,"meta":2433,"style":2433},"npm install -g @hubspot\u002Fcli && hs init\n",[36,46636,46637],{"__ignoreMap":2433},[414,46638,46639,46642,46644,46647,46649,46652,46654],{"class":2593,"line":2594},[414,46640,46641],{"class":2705},"npm install ",[414,46643,34146],{"class":2698},[414,46645,46646],{"class":2705},"g @hubspot",[414,46648,23303],{"class":2698},[414,46650,46651],{"class":2705},"cli ",[414,46653,25072],{"class":2698},[414,46655,46656],{"class":2705}," hs init\n",[2510,46658,46659],{},[2357,46660,46661],{},"Create your Personal Access Key.\nIt will be inside the keys menu",[22,46663,46664],{},[4201,46665],{"alt":5892,"src":46666},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_connection_with_hubspot-5.png",[2510,46668,46669],{},[2357,46670,46671],{},"Paste that key in your terminal when your hubspot application ask for it.",[22,46673,46674],{},[4201,46675],{"alt":5892,"src":46676},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_connection_with_hubspot-6.png",[2510,46678,46679],{},[2357,46680,46681],{},"Now we will create a project.\nrun following command in that same project.",[2584,46683,46685],{"className":16485,"code":46684,"language":16487,"meta":2433,"style":2433},"hs get-started\n",[36,46686,46687],{"__ignoreMap":2433},[414,46688,46689,46692,46694],{"class":2593,"line":2594},[414,46690,46691],{"class":2705},"hs get",[414,46693,34146],{"class":2698},[414,46695,46696],{"class":2705},"started\n",[22,46698,46699],{},[4201,46700],{"alt":5892,"src":46701},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_connection_with_hubspot-7.png",[2510,46703,46704],{},[2357,46705,46706],{},"Write Y to upload that project in the hubspot application.",[22,46708,46709],{},[4201,46710],{"alt":5892,"src":46711},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_connection_with_hubspot-8.png",[2510,46713,46714],{},[2357,46715,46716],{},"Again select Y for following",[22,46718,46719],{},[4201,46720],{"alt":5892,"src":46721},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_connection_with_hubspot-9.png",[2510,46723,46724],{},[2357,46725,46726],{},"It will redirect to hubspot page.\ngoto to following page:-\nConnected Apps→ Manage Location → click the check box → Save.",[22,46728,46729],{},[4201,46730],{"alt":5892,"src":46731},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_connection_with_hubspot-10.png",[2510,46733,46734],{},[2357,46735,46736],{},"In your project(code) you will see following folder structure.\nGOTO→ yourproject (account-testing) → app-hsmeta.json",[22,46738,46739],{},[4201,46740],{"alt":5892,"src":46741},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_connection_with_hubspot-11.png",[2510,46743,46744],{},[2357,46745,46746],{},"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.",[2584,46748,46750],{"className":16485,"code":46749,"language":16487,"meta":2433,"style":2433},"{\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:\u002F\u002Fapi.unified.to\u002Foauth\u002Fcode\",\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:\u002F\u002Fapi.hubapi.com\"],\n      \"iframe\": [],\n      \"img\": []\n    },\n    \"support\": {\n      \"supportEmail\": \"support@example.com\",\n      \"documentationUrl\": \"https:\u002F\u002Fexample.com\u002Fdocs\",\n      \"supportUrl\": \"https:\u002F\u002Fexample.com\u002Fsupport\",\n      \"supportPhone\": \"+18005555555\"\n    }\n  }\n}\n",[36,46751,46752,46756,46767,46778,46784,46796,46807,46819,46826,46838,46845,46852,46856,46863,46870,46877,46884,46891,46898,46905,46912,46918,46925,46932,46939,46946,46953,46960,46965,46969,46977,46985,46989,46996,47008,47015,47022,47026,47033,47045,47057,47069,47079,47083,47087],{"__ignoreMap":2433},[414,46753,46754],{"class":2593,"line":2594},[414,46755,8916],{"class":2705},[414,46757,46758,46760,46762,46765],{"class":2593,"line":2434},[414,46759,36807],{"class":2601},[414,46761,7340],{"class":2705},[414,46763,46764],{"class":2601},"\"get_started_app\"",[414,46766,2757],{"class":2705},[414,46768,46769,46771,46773,46776],{"class":2593,"line":2613},[414,46770,15528],{"class":2601},[414,46772,7340],{"class":2705},[414,46774,46775],{"class":2601},"\"app\"",[414,46777,2757],{"class":2705},[414,46779,46780,46782],{"class":2593,"line":2625},[414,46781,36829],{"class":2601},[414,46783,10477],{"class":2705},[414,46785,46786,46789,46791,46794],{"class":2593,"line":2677},[414,46787,46788],{"class":2601},"    \"description\"",[414,46790,7340],{"class":2705},[414,46792,46793],{"class":2601},"\"A Unified.to token app for testing\"",[414,46795,2757],{"class":2705},[414,46797,46798,46800,46802,46805],{"class":2593,"line":2751},[414,46799,38476],{"class":2601},[414,46801,7340],{"class":2705},[414,46803,46804],{"class":2601},"\"My Get Started app\"",[414,46806,2757],{"class":2705},[414,46808,46809,46812,46814,46817],{"class":2593,"line":2760},[414,46810,46811],{"class":2601},"    \"distribution\"",[414,46813,7340],{"class":2705},[414,46815,46816],{"class":2601},"\"private\"",[414,46818,2757],{"class":2705},[414,46820,46821,46824],{"class":2593,"line":2768},[414,46822,46823],{"class":2601},"    \"auth\"",[414,46825,10477],{"class":2705},[414,46827,46828,46831,46833,46836],{"class":2593,"line":2776},[414,46829,46830],{"class":2601},"      \"type\"",[414,46832,7340],{"class":2705},[414,46834,46835],{"class":2601},"\"oauth\"",[414,46837,2757],{"class":2705},[414,46839,46840,46843],{"class":2593,"line":2784},[414,46841,46842],{"class":2601},"      \"redirectUrls\"",[414,46844,8960],{"class":2705},[414,46846,46847,46850],{"class":2593,"line":2792},[414,46848,46849],{"class":2601},"        \"https:\u002F\u002Fapi.unified.to\u002Foauth\u002Fcode\"",[414,46851,2757],{"class":2705},[414,46853,46854],{"class":2593,"line":2804},[414,46855,11039],{"class":2705},[414,46857,46858,46861],{"class":2593,"line":2809},[414,46859,46860],{"class":2601},"      \"requiredScopes\"",[414,46862,8960],{"class":2705},[414,46864,46865,46868],{"class":2593,"line":2829},[414,46866,46867],{"class":2601},"        \"oauth\"",[414,46869,2757],{"class":2705},[414,46871,46872,46875],{"class":2593,"line":2843},[414,46873,46874],{"class":2601},"        \"crm.objects.companies.read\"",[414,46876,2757],{"class":2705},[414,46878,46879,46882],{"class":2593,"line":2849},[414,46880,46881],{"class":2601},"        \"crm.objects.contacts.read\"",[414,46883,2757],{"class":2705},[414,46885,46886,46889],{"class":2593,"line":2854},[414,46887,46888],{"class":2601},"        \"crm.objects.deals.read\"",[414,46890,2757],{"class":2705},[414,46892,46893,46896],{"class":2593,"line":2880},[414,46894,46895],{"class":2601},"        \"crm.objects.owners.read\"",[414,46897,2757],{"class":2705},[414,46899,46900,46903],{"class":2593,"line":3253},[414,46901,46902],{"class":2601},"        \"crm.pipelines.orders.read\"",[414,46904,2757],{"class":2705},[414,46906,46907,46910],{"class":2593,"line":3261},[414,46908,46909],{"class":2601},"        \"crm.objects.contacts.write\"",[414,46911,2757],{"class":2705},[414,46913,46914,46916],{"class":2593,"line":3279},[414,46915,46902],{"class":2601},[414,46917,2757],{"class":2705},[414,46919,46920,46923],{"class":2593,"line":3313},[414,46921,46922],{"class":2601},"        \"crm.pipelines.orders.write\"",[414,46924,2757],{"class":2705},[414,46926,46927,46930],{"class":2593,"line":3326},[414,46928,46929],{"class":2601},"        \"crm.objects.deals.write\"",[414,46931,2757],{"class":2705},[414,46933,46934,46937],{"class":2593,"line":3339},[414,46935,46936],{"class":2601},"        \"sales-email-read\"",[414,46938,2757],{"class":2705},[414,46940,46941,46944],{"class":2593,"line":3359},[414,46942,46943],{"class":2601},"        \"content\"",[414,46945,2757],{"class":2705},[414,46947,46948,46951],{"class":2593,"line":6453},[414,46949,46950],{"class":2601},"        \"tickets\"",[414,46952,2757],{"class":2705},[414,46954,46955,46958],{"class":2593,"line":6459},[414,46956,46957],{"class":2601},"        \"crm.lists.read\"",[414,46959,2757],{"class":2705},[414,46961,46962],{"class":2593,"line":6465},[414,46963,46964],{"class":2601},"        \"settings.users.teams.read\"\n",[414,46966,46967],{"class":2593,"line":6471},[414,46968,11039],{"class":2705},[414,46970,46971,46974],{"class":2593,"line":6477},[414,46972,46973],{"class":2601},"      \"optionalScopes\"",[414,46975,46976],{"class":2705},": [],\n",[414,46978,46979,46982],{"class":2593,"line":6483},[414,46980,46981],{"class":2601},"      \"conditionallyRequiredScopes\"",[414,46983,46984],{"class":2705},": []\n",[414,46986,46987],{"class":2593,"line":6489},[414,46988,3548],{"class":2705},[414,46990,46991,46994],{"class":2593,"line":6495},[414,46992,46993],{"class":2601},"    \"permittedUrls\"",[414,46995,10477],{"class":2705},[414,46997,46998,47001,47003,47006],{"class":2593,"line":6501},[414,46999,47000],{"class":2601},"      \"fetch\"",[414,47002,10492],{"class":2705},[414,47004,47005],{"class":2601},"\"https:\u002F\u002Fapi.hubapi.com\"",[414,47007,10497],{"class":2705},[414,47009,47010,47013],{"class":2593,"line":6507},[414,47011,47012],{"class":2601},"      \"iframe\"",[414,47014,46976],{"class":2705},[414,47016,47017,47020],{"class":2593,"line":6513},[414,47018,47019],{"class":2601},"      \"img\"",[414,47021,46984],{"class":2705},[414,47023,47024],{"class":2593,"line":6519},[414,47025,3548],{"class":2705},[414,47027,47028,47031],{"class":2593,"line":6525},[414,47029,47030],{"class":2601},"    \"support\"",[414,47032,10477],{"class":2705},[414,47034,47035,47038,47040,47043],{"class":2593,"line":6531},[414,47036,47037],{"class":2601},"      \"supportEmail\"",[414,47039,7340],{"class":2705},[414,47041,47042],{"class":2601},"\"support@example.com\"",[414,47044,2757],{"class":2705},[414,47046,47047,47050,47052,47055],{"class":2593,"line":6537},[414,47048,47049],{"class":2601},"      \"documentationUrl\"",[414,47051,7340],{"class":2705},[414,47053,47054],{"class":2601},"\"https:\u002F\u002Fexample.com\u002Fdocs\"",[414,47056,2757],{"class":2705},[414,47058,47059,47062,47064,47067],{"class":2593,"line":6543},[414,47060,47061],{"class":2601},"      \"supportUrl\"",[414,47063,7340],{"class":2705},[414,47065,47066],{"class":2601},"\"https:\u002F\u002Fexample.com\u002Fsupport\"",[414,47068,2757],{"class":2705},[414,47070,47071,47074,47076],{"class":2593,"line":6549},[414,47072,47073],{"class":2601},"      \"supportPhone\"",[414,47075,7340],{"class":2705},[414,47077,47078],{"class":2601},"\"+18005555555\"\n",[414,47080,47081],{"class":2593,"line":6555},[414,47082,10535],{"class":2705},[414,47084,47085],{"class":2593,"line":6561},[414,47086,4032],{"class":2705},[414,47088,47089],{"class":2593,"line":6567},[414,47090,3035],{"class":2705},[2510,47092,47093],{},[2357,47094,47095],{},"You can update those changes using following command in terminal.",[2584,47097,47098],{"className":16485,"code":36999,"language":16487,"meta":2433,"style":2433},[36,47099,47100],{"__ignoreMap":2433},[414,47101,47102],{"class":2593,"line":2594},[414,47103,36999],{"class":2705},[2510,47105,47106],{},[2357,47107,47108],{},"When the code is uploaded successfully you can check that by going to following Development→ Project → Select your project.",[22,47110,47111],{},[4201,47112],{"alt":5892,"src":47113},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_connection_with_hubspot-12.png",[2510,47115,47116],{},[2357,47117,47118],{},"To check your scopes click on the project Component. It will show your app-hsmeta.json",[22,47120,47121],{},[4201,47122],{"alt":5892,"src":47123},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_connection_with_hubspot-13.png",[2510,47125,47126],{},[2357,47127,47128],{},"To get the client ID and Client Secret click on the Auth button in your project component.",[22,47130,47131],{},[4201,47132],{"alt":5892,"src":47133},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_connection_with_hubspot-14.png",[2510,47135,47136],{},[2357,47137,47138],{},"Paste the Client ID and Client Secret in the app.unified.to",[22,47140,47141],{},[4201,47142],{"alt":5892,"src":47143},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_connection_with_hubspot-15.png",[2510,47145,47146],{},[2357,47147,47148],{},"To get developer key goto Development→ keys → developer API key. If no keys are present than generate developer api key.",[22,47150,47151],{},[4201,47152],{"alt":5892,"src":47153},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_connection_with_hubspot-16.png",[2510,47155,47156,47163],{},[2357,47157,47158,47159,47162],{},"Paste that key in the ",[41,47160,21814],{"href":4146,"rel":47161},[45]," and click activate.",[2357,47164,47165],{},"Goto Embedded components→ click on hubspot→ select your project→ click on approve.",[22,47167,47168],{},"Your Hubspot application is created.",[4156,47170,47171],{},"html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}",{"title":2433,"searchDepth":2434,"depth":2434,"links":47173},[],"Hubspot provides Free Developer Sandbox Account. You can create that from following link .",{"img":47176,"date":47177,"updated":47178,"tag":2457,"integrations":37069},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_create_connection_with_hubspot-icon.svg","2025-12-17T08:03:00.000Z","2026-08-23T14:53:31.344Z","\u002Fguides\u002Fhow_to_create_connection_with_hubspot",{"title":46563,"description":47174},"guides\u002Fhow_to_create_connection_with_hubspot","Xw_qqoDuO_Y38lnd3VazaC_5a3j6fKSDzFOmXWocMpw",{"id":47184,"title":47185,"body":47186,"description":47384,"extension":2452,"meta":47385,"navigation":2459,"path":47390,"seo":47391,"stem":47392,"__hash__":47393},"guides\u002Fguides\u002Fhow_to_customize_portal_urls_for_stripe_and_gocardless.md","How to customize portal URLs for Stripe and GoCardless",{"type":12,"value":47187,"toc":47376},[47188,47191,47193,47198,47201,47203,47205,47213,47217,47228,47231,47266,47270,47273,47300,47304,47307,47348,47362,47364,47373],[15,47189,47185],{"id":47190},"how-to-customize-portal-urls-for-stripe-and-gocardless",[19,47192],{},[22,47194,47195],{},[25,47196,47197],{},"November 13, 2024",[22,47199,47200],{},"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.",[55,47202,4890],{"id":4889},[22,47204,24095],{},[2354,47206,47207,47210],{},[2357,47208,47209],{},"A basic understanding of the Unified API",[2357,47211,47212],{},"An active integration with either Stripe or GoCardless",[55,47214,47216],{"id":47215},"understanding-portal-urls","Understanding portal URLs",[22,47218,47219,47220,47223,47224,47227],{},"When working with the ",[36,47221,47222],{},"accounting_contact"," object for Stripe and GoCardless integrations, each contact includes a ",[36,47225,47226],{},"portal_url"," field. This URL provides access to the contact's portal UI where they can perform various operations, such as managing payment methods.",[22,47229,47230],{},"For example, a typical response might look like:",[2584,47232,47234],{"className":16485,"code":47233,"language":16487,"meta":2433,"style":2433},"{\n   \"id\": 77558,\n   \"portal_url\": \"\u003Chttps:\u002F\u002Fapi.unified.to\u002Faccounting\u002F{connection_id}\u002Fcontact\u002F{contact_id}\u002Fportal>\"\n}\n",[36,47235,47236,47240,47252,47262],{"__ignoreMap":2433},[414,47237,47238],{"class":2593,"line":2594},[414,47239,8916],{"class":2705},[414,47241,47242,47245,47247,47250],{"class":2593,"line":2434},[414,47243,47244],{"class":2601},"   \"id\"",[414,47246,7340],{"class":2705},[414,47248,47249],{"class":2607},"77558",[414,47251,2757],{"class":2705},[414,47253,47254,47257,47259],{"class":2593,"line":2613},[414,47255,47256],{"class":2601},"   \"portal_url\"",[414,47258,7340],{"class":2705},[414,47260,47261],{"class":2601},"\"\u003Chttps:\u002F\u002Fapi.unified.to\u002Faccounting\u002F{connection_id}\u002Fcontact\u002F{contact_id}\u002Fportal>\"\n",[414,47263,47264],{"class":2593,"line":2625},[414,47265,3035],{"class":2705},[55,47267,47269],{"id":47268},"customize-the-portal-url","Customize the portal URL",[22,47271,47272],{},"You can customize the portal URL's behaviour by appending specific query parameters to your API calls. The following parameters are available:",[2510,47274,47275,47281],{},[2357,47276,47277,47280],{},[36,47278,47279],{},"success_url"," (optional): Specifies where users should be redirected after completing their action",[2357,47282,47283,47285,47286],{},[36,47284,3397],{}," (optional): Specifies the type of action the link is intended for. Available values:\n",[2354,47287,47288,47294],{},[2357,47289,47290,47293],{},[36,47291,47292],{},"portal",": Generates a standard portal UI link (default)",[2357,47295,47296,47299],{},[36,47297,47298],{},"add_payment_method",": Generates a portal UI URL specifically for adding a new payment method",[3629,47301,47303],{"id":47302},"add-a-payment-method-with-custom-redirect","Add a payment method with custom redirect",[22,47305,47306],{},"To create a URL that allows customers to add a payment method and redirects them upon completion:",[2510,47308,47309,47326],{},[2357,47310,47311,47312],{},"Start with the original portal URL from the contact object:",[2584,47313,47315],{"className":16485,"code":47314,"language":16487,"meta":2433,"style":2433},"https:\u002F\u002Fapi.unified.to\u002Faccounting\u002F{connection_id}\u002Fcontact\u002F{contact_id}\u002Fportal\n",[36,47316,47317],{"__ignoreMap":2433},[414,47318,47319,47321,47323],{"class":2593,"line":2594},[414,47320,43699],{"class":2597},[414,47322,2646],{"class":2705},[414,47324,47325],{"class":3527},"\u002F\u002Fapi.unified.to\u002Faccounting\u002F{connection_id}\u002Fcontact\u002F{contact_id}\u002Fportal\n",[2357,47327,47328,47329,741,47331,47333,47334],{},"Append the ",[36,47330,47279],{},[36,47332,3397],{}," parameters:",[2584,47335,47337],{"className":16485,"code":47336,"language":16487,"meta":2433,"style":2433},"https:\u002F\u002Fapi.unified.to\u002Faccounting\u002F{connection_id}\u002Fcontact\u002F{contact_id}\u002Fportal?success_url=YOUR_REDIRECT_URL&type=add_payment_method\n",[36,47338,47339],{"__ignoreMap":2433},[414,47340,47341,47343,47345],{"class":2593,"line":2594},[414,47342,43699],{"class":2597},[414,47344,2646],{"class":2705},[414,47346,47347],{"class":3527},"\u002F\u002Fapi.unified.to\u002Faccounting\u002F{connection_id}\u002Fcontact\u002F{contact_id}\u002Fportal?success_url=YOUR_REDIRECT_URL&type=add_payment_method\n",[22,47349,47350,47351,741,47353,47355,47356,47358,47359,97],{},"Note: Both ",[36,47352,47279],{},[36,47354,3397],{}," parameters are optional. If ",[36,47357,3397],{}," is not specified, the system defaults to ",[36,47360,47361],{},"type=portal",[55,47363,37023],{"id":37022},[2354,47365,47366],{},[2357,47367,47368],{},[41,47369,47372],{"href":47370,"rel":47371},"https:\u002F\u002Fdocs.unified.to\u002Faccounting\u002Fcontact\u002Fmodel",[45],"Accounting contact object reference",[4156,47374,47375],{},"html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}",{"title":2433,"searchDepth":2434,"depth":2434,"links":47377},[47378,47379,47380,47383],{"id":4889,"depth":2434,"text":4890},{"id":47215,"depth":2434,"text":47216},{"id":47268,"depth":2434,"text":47269,"children":47381},[47382],{"id":47302,"depth":2613,"text":47303},{"id":37022,"depth":2434,"text":37023},"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...",{"img":47386,"date":47387,"updated":47388,"tag":2457,"integrations":47389},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_customize_portal_urls_for_stripe_and_gocardless-icon.png","2024-11-13T00:00:00.000Z","2026-08-23T14:53:53.311Z","stripe, gocardless","\u002Fguides\u002Fhow_to_customize_portal_urls_for_stripe_and_gocardless",{"title":47185,"description":47384},"guides\u002Fhow_to_customize_portal_urls_for_stripe_and_gocardless","5-8KH1lI45nGZmW88nMRflzQCsHRsHY0OWR9-e1X-ss",{"id":47395,"title":46242,"body":47396,"description":47596,"extension":2452,"meta":47597,"navigation":2459,"path":47601,"seo":47602,"stem":47603,"__hash__":47604},"guides\u002Fguides\u002Fhow_to_filter_webhook_events.md",{"type":12,"value":47397,"toc":47594},[47398,47401,47403,47408,47414,47420,47428,47431,47434,47440,47446,47453,47459,47466,47574,47581,47591],[15,47399,46242],{"id":47400},"how-to-filter-webhook-events",[19,47402],{},[22,47404,47405],{},[25,47406,47407],{},"July 24, 2024",[22,47409,47410,47411,47413],{},"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 ",[36,47412,46224],{}," to receive data only about deals for a specific company.",[22,47415,47416,47417],{},"Filters are supported on virtual webhooks and on native webhooks for some integrations. Check the integration's Feature Support tab for which filters apply. Read more about the differences between native and virtual webhooks here: ",[41,47418,46062],{"href":22112,"rel":47419},[45],[22,47421,47422,47423,4149,47425,47427],{},"Filter availability varies by integration type and data model. To see which filters are supported for a webhook, open the integration's Feature Support tab in the dashboard. Filter parameters are listed under List Options; the Virtual Webhook Options section shows the options a virtual webhook uses. Parameters that end in ",[36,47424,46234],{},[36,47426,3397],{}," can be used as filter options when creating a webhook, helping you tailor your subscriptions to your specific needs.",[22,47429,47430],{},"Filters an integration doesn't support are accepted and stored, but have no effect on which events you receive. A few integrations require a filter; if one is missing, create returns an error naming the integration and the filter.",[22,47432,47433],{},"For example, this is the Feature Support list for CRM Deals by ActiveCampaign:",[22,47435,47436],{},[4201,47437],{"alt":47438,"src":47439},"CRM_Deal.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_filter_webhook_events-0.png",[22,47441,47442,47443,47445],{},"Notice that this data model supports virtual webhooks as specified under ‘Webhook.' Under ‘List Options', the parameter ",[36,47444,46224],{}," is shown, indicating that it is possible to use this as a filter.",[22,47447,47448,47449,47452],{},"When creating webhooks via the ",[41,47450,123],{"href":121,"rel":47451},[45]," web app, you can specify your filter parameters in the webhook creation form:",[22,47454,47455],{},[4201,47456],{"alt":47457,"src":47458},"Webhook_creation.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_filter_webhook_events-1.png",[22,47460,47461,47462,47465],{},"When creating a webhook programmatically via our API, you can include ",[36,47463,47464],{},"filters"," in the payload with a string dictionary of values to filter by. For example, in JavaScript:",[2584,47467,47469],{"className":16485,"code":47468,"language":16487,"meta":2433,"style":2433},"const options = {\n  method: 'POST',\n  url: 'https:\u002F\u002Fapi.unified.to\u002Funified\u002Fwebhook',\n  headers: {\n    authorization: 'bearer YOUR_ACCESS_TOKEN'\n  },\n  data: {\n    filters: {\n      company_id: '12345',\n    },\n    \u002F\u002F other payload data if needed\n  },\n};\n\nconst results = await axios.request(options);\n",[36,47470,47471,47481,47489,47498,47502,47510,47514,47519,47524,47534,47538,47543,47547,47551,47555],{"__ignoreMap":2433},[414,47472,47473,47475,47477,47479],{"class":2593,"line":2594},[414,47474,2745],{"class":2698},[414,47476,24488],{"class":2607},[414,47478,2817],{"class":2698},[414,47480,2748],{"class":2705},[414,47482,47483,47485,47487],{"class":2593,"line":2434},[414,47484,24497],{"class":2705},[414,47486,29388],{"class":2601},[414,47488,2757],{"class":2705},[414,47490,47491,47493,47496],{"class":2593,"line":2613},[414,47492,24507],{"class":2705},[414,47494,47495],{"class":2601},"'https:\u002F\u002Fapi.unified.to\u002Funified\u002Fwebhook'",[414,47497,2757],{"class":2705},[414,47499,47500],{"class":2593,"line":2625},[414,47501,24517],{"class":2705},[414,47503,47504,47507],{"class":2593,"line":2677},[414,47505,47506],{"class":2705},"    authorization: ",[414,47508,47509],{"class":2601},"'bearer YOUR_ACCESS_TOKEN'\n",[414,47511,47512],{"class":2593,"line":2751},[414,47513,16052],{"class":2705},[414,47515,47516],{"class":2593,"line":2760},[414,47517,47518],{"class":2705},"  data: {\n",[414,47520,47521],{"class":2593,"line":2768},[414,47522,47523],{"class":2705},"    filters: {\n",[414,47525,47526,47529,47532],{"class":2593,"line":2776},[414,47527,47528],{"class":2705},"      company_id: ",[414,47530,47531],{"class":2601},"'12345'",[414,47533,2757],{"class":2705},[414,47535,47536],{"class":2593,"line":2784},[414,47537,3548],{"class":2705},[414,47539,47540],{"class":2593,"line":2792},[414,47541,47542],{"class":3527},"    \u002F\u002F other payload data if needed\n",[414,47544,47545],{"class":2593,"line":2804},[414,47546,16052],{"class":2705},[414,47548,47549],{"class":2593,"line":2809},[414,47550,24195],{"class":2705},[414,47552,47553],{"class":2593,"line":2829},[414,47554,2740],{"emptyLinePlaceholder":2459},[414,47556,47557,47559,47561,47563,47565,47568,47571],{"class":2593,"line":2843},[414,47558,2745],{"class":2698},[414,47560,3858],{"class":2607},[414,47562,2817],{"class":2698},[414,47564,3002],{"class":2698},[414,47566,47567],{"class":2705}," axios.",[414,47569,47570],{"class":2597},"request",[414,47572,47573],{"class":2705},"(options);\n",[22,47575,47576,47577,97],{},"Review our complete guide on the webhook API here: ",[41,47578,47580],{"href":5078,"rel":47579},[45],"Create webhook subscriptions",[22,47582,47583,47584,47587,47588,97],{},"For setting up webhooks end to end, see ",[41,47585,5733],{"href":5731,"rel":47586},[45],". If a webhook stops delivering, see ",[41,47589,45818],{"href":45816,"rel":47590},[45],[4156,47592,47593],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":2433,"searchDepth":2434,"depth":2434,"links":47595},[],"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...",{"img":47598,"date":47599,"updated":47600,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_filter_webhook_events-icon.png","2024-07-24T00:00:00.000Z","2026-10-13T00:16:43.723Z","\u002Fguides\u002Fhow_to_filter_webhook_events",{"title":46242,"description":47596},"guides\u002Fhow_to_filter_webhook_events","j6aBs3CO4osNOOzZZzk76UBaA5lAkmeQbooMFRmNhCU",{"id":47606,"title":47607,"body":47608,"description":48182,"extension":2452,"meta":48183,"navigation":2459,"path":48186,"seo":48187,"stem":48188,"__hash__":48189},"guides\u002Fguides\u002Fhow_to_get_a_private_support_channel_for_your_unified_integration.md","How-to Get a Private Support Channel for Your Unified Integration",{"type":12,"value":47609,"toc":48166},[47610,47613,47615,47620,47626,47636,47639,47642,47645,47647,47659,47662,47665,47668,47675,47679,47690,47697,47701,47704,47718,47720,47746,47750,47753,47792,47795,47798,47870,47877,47881,47884,47953,47957,47960,48029,48033,48036,48062,48066,48069,48101,48104,48108,48111,48115,48118,48122,48125,48133,48136,48140,48143],[15,47611,47607],{"id":47612},"how-to-get-a-private-support-channel-for-your-unified-integration",[19,47614],{},[22,47616,47617],{},[25,47618,47619],{},"May 1, 2026",[22,47621,47622,47625],{},[41,47623,123],{"href":121,"rel":47624},[45]," offers customers 3 platforms for support:",[2354,47627,47628,47631,47633],{},[2357,47629,47630],{},"Slack",[2357,47632,21800],{},[2357,47634,47635],{},"Microsoft Teams",[15,47637,47630],{"id":47638},"slack",[22,47640,47641],{},"We use Slack Connect to invite our customers into private support channels that we create in our Slack account.  Just reach out to your account manager, and they will create a channel for you and invite your product team.",[22,47643,47644],{},"This is our preferred method of working with your team to get them to success faster.",[15,47646,21800],{"id":31311},[22,47648,47649,47650,47654,47655,47658],{},"Our ",[41,47651,47653],{"href":4362,"rel":47652},[45],"Discord server"," offers both public and private channels for support.  The public channels are used for anyone who is just trying out ",[41,47656,123],{"href":121,"rel":47657},[45],".  Once you dedicate your product team's time to integrate Unified.to into your application, please let us know and we will create a private channel for you.",[15,47660,47635],{"id":47661},"microsoft-teams",[22,47663,47664],{},"For enterprise customers, Unified also offers shared private channels in Microsoft Teams.  Please let us know if you cannot use Slack nor Discord (as per your IT policy), and we will be happy yo setup Teams access and a private channel.",[22,47666,47667],{},"But, you will need your IT to also setup Teams access to the Unified MS Teams account for your team, by following this guide:",[22,47669,47670,47671,47674],{},"This guide is for your ",[31,47672,47673],{},"Microsoft Entra (Azure AD) administrator",". It walks through the configuration needed on your tenant so we can collaborate with you in a Microsoft Teams shared channel.",[55,47676,47678],{"id":47677},"background","Background",[22,47680,47681,47682,47685,47686,47689],{},"Unified.to wants to invite a user from your organization into a Microsoft Teams ",[31,47683,47684],{},"shared channel"," (sometimes referred to as a \"private cross-org channel\"). Unlike standard Teams channels, which require external users to be added as guests in your tenant, shared channels use ",[31,47687,47688],{},"Microsoft Entra B2B direct connect",". This lets your user access the channel from inside their own Microsoft Teams client, without switching tenants and without being added to our directory.",[22,47691,47692,47693,47696],{},"For B2B direct connect to work, ",[31,47694,47695],{},"both tenants must trust each other",". We have already configured our side. This document covers the symmetric configuration required on yours.",[55,47698,47700],{"id":47699},"what-youll-be-enabling","What you'll be enabling",[22,47702,47703],{},"You're enabling B2B direct connect with a single specific external tenant — Unified.to. Nothing else changes:",[2354,47705,47706,47709,47712,47715],{},[2357,47707,47708],{},"We are not added as guests in your directory.",[2357,47710,47711],{},"Your users are not added as guests in ours.",[2357,47713,47714],{},"Your existing default cross-tenant access policy is unaffected for every other organization.",[2357,47716,47717],{},"The settings can be reverted at any time by removing the entry.",[55,47719,2542],{"id":2541},[2354,47721,47722,47740,47743],{},[2357,47723,47724,47725],{},"A user account in your Entra tenant with one of the following roles:\n",[2354,47726,47727,47732,47737],{},[2357,47728,47729,47730],{},"Global Administrator, ",[31,47731,39677],{},[2357,47733,47734,47735],{},"Security Administrator, ",[31,47736,39677],{},[2357,47738,47739],{},"Conditional Access Administrator (with Cross-tenant access settings permission)",[2357,47741,47742],{},"Your tenant must have Microsoft Entra ID (any edition — Free is sufficient for the basic configuration described here)",[2357,47744,47745],{},"A modern browser signed in to your Microsoft 365 admin account",[55,47747,47749],{"id":47748},"our-tenant-details","Our tenant details",[22,47751,47752],{},"You'll need these values during the setup:",[155,47754,47755,47763],{},[158,47756,47757],{},[161,47758,47759,47761],{},[164,47760,5244],{},[164,47762,5247],{},[174,47764,47765,47772,47782],{},[161,47766,47767,47770],{},[179,47768,47769],{},"Organization name",[179,47771,123],{},[161,47773,47774,47777],{},[179,47775,47776],{},"Primary domain",[179,47778,47779],{},[36,47780,47781],{},"unified.to",[161,47783,47784,47787],{},[179,47785,47786],{},"Microsoft Entra tenant ID",[179,47788,47789],{},[36,47790,47791],{},"4b8acf48-e5c8-4484-896b-95b1b824ddda",[55,47793,47794],{"id":20910},"Step-by-step setup",[22,47796,47797],{},"The full process takes about five minutes.",[2510,47799,47800,47810,47828,47831,47838,47843,47858,47864],{},[2357,47801,47802,47803,21005,47805,47809],{},"Open the Microsoft Entra admin center",[5888,47804],{},[41,47806,47807],{"href":47807,"rel":47808},"https:\u002F\u002Fentra.microsoft.com",[45]," and sign in with your admin account.",[2357,47811,47812,47813,47815,47816,20790,47819,20790,47822,97,47825,47827],{},"Navigate to Cross-tenant access settings",[5888,47814],{},"In the left navigation, expand ",[31,47817,47818],{},"Entra ID",[31,47820,47821],{},"External Identities",[31,47823,47824],{},"Cross-tenant access settings",[5888,47826],{},"(If you don't see External Identities directly, click \"Show more\" or use the search bar at the top: search for \"Cross-tenant access settings\".)",[2357,47829,47830],{},"Add Unified.to as an organization",[2357,47832,47833,47834,47837],{},"Make sure you're on the ",[31,47835,47836],{},"Organizational settings"," tab (not \"Default settings\").",[2357,47839,16292,47840,97],{},[31,47841,47842],{},"+ Add organization",[2357,47844,47845,47846],{},"In the side panel, paste either of the following into the \"Tenant ID or domain name\" field:",[2354,47847,47848,47853],{},[2357,47849,47850,47851],{},"Tenant ID: ",[36,47852,47791],{},[2357,47854,47855,47856],{},"Domain: ",[36,47857,47781],{},[2357,47859,47860,47861,47863],{},"Microsoft will resolve the entry and display ",[31,47862,123],{}," with our tenant ID.",[2357,47865,16292,47866,47869],{},[31,47867,47868],{},"Add",". You should see a confirmation toast: \"Successfully added Unified.to tenant to organizational settings.\"",[22,47871,47872,47873,47876],{},"Unified.to now appears in the list with both Inbound access and Outbound access showing ",[31,47874,47875],{},"\"Inherited from default\"",". We'll override that next.",[3629,47878,47880],{"id":47879},"_4-configure-inbound-access","4. Configure Inbound access",[22,47882,47883],{},"This controls whether Unified.to users can access resources in your tenant via B2B direct connect (such as joining a shared channel that we host).",[2510,47885,47886,47893,47899,47905,47926,47942,47947],{},[2357,47887,47888,47889,47892],{},"In the 'Unified.to row', click the ",[31,47890,47891],{},"Inbound access"," link (\"Inherited from default\").",[2357,47894,47895,47896,45621],{},"In the panel that opens, click the ",[31,47897,47898],{},"B2B direct connect",[2357,47900,45688,47901,47904],{},[31,47902,47903],{},"Customize settings"," radio.",[2357,47906,47907,47908,47911,47912],{},"On the ",[31,47909,47910],{},"External users and groups"," sub-tab:\n",[2354,47913,47914,47920],{},[2357,47915,47916,47917],{},"Access status: ",[31,47918,47919],{},"Allow access",[2357,47921,47922,47923],{},"Applies to: ",[31,47924,47925],{},"All Unified.to users and groups",[2357,47927,16428,47928,47911,47931],{},[31,47929,47930],{},"Applications",[2354,47932,47933,47937],{},[2357,47934,47916,47935],{},[31,47936,47919],{},[2357,47938,47922,47939],{},[31,47940,47941],{},"All applications",[2357,47943,16292,47944,47946],{},[31,47945,46022],{},". The Save button greys out when the save completes.",[2357,47948,47949,47950,97],{},"Close the panel (X in the top-right) to return to the Organizational settings list. The Inbound access column for Unified.to should now read ",[31,47951,47952],{},"\"Configured\"",[3629,47954,47956],{"id":47955},"_5-configure-outbound-access","5. Configure Outbound access",[22,47958,47959],{},"This controls whether your users can access resources hosted by Unified.to (such as the shared channel we'll invite them into).",[2510,47961,47962,47967,47971,47975,47994,48010,48014,48024],{},[2357,47963,47888,47964,47892],{},[31,47965,47966],{},"Outbound access",[2357,47968,47895,47969,45621],{},[31,47970,47898],{},[2357,47972,45688,47973,47904],{},[31,47974,47903],{},[2357,47976,47907,47977,47911,47980],{},[31,47978,47979],{},"Users and groups",[2354,47981,47982,47986],{},[2357,47983,47916,47984],{},[31,47985,47919],{},[2357,47987,47922,47988],{},[31,47989,47990,47991,20270],{},"All ",[414,47992,47993],{},"your organization name",[2357,47995,16428,47996,47911,47999],{},[31,47997,47998],{},"External applications",[2354,48000,48001,48005],{},[2357,48002,47916,48003],{},[31,48004,47919],{},[2357,48006,47922,48007],{},[31,48008,48009],{},"All external applications",[2357,48011,16292,48012,97],{},[31,48013,46022],{},[2357,48015,48016,48017,48020,48021,48023],{},"Microsoft will display a consent dialog titled ",[31,48018,48019],{},"\"Are you sure?\"",", explaining that enabling outbound B2B direct connect lets external organizations access limited contact data about your users for the purpose of sending connection requests. Click ",[31,48022,8015],{}," to confirm.",[2357,48025,48026,48027,97],{},"Close the panel. The Outbound access column for Unified.to should now read ",[31,48028,47952],{},[3629,48030,48032],{"id":48031},"_6-verify","6. Verify",[22,48034,48035],{},"The Unified.to row in your Organizational settings should now show:",[155,48037,48038,48046],{},[158,48039,48040],{},[161,48041,48042,48044],{},[164,48043,47891],{},[164,48045,47966],{},[174,48047,48048,48055],{},[161,48049,48050,48053],{},[179,48051,48052],{},"Configured",[179,48054,48052],{},[161,48056,48057,48060],{},[179,48058,48059],{},"Both fields should be hyperlinked. If either still says \"Inherited from default\", reopen that link and re-save.",[179,48061],{},[55,48063,48065],{"id":48064},"what-about-microsoft-teams-settings","What about Microsoft Teams settings?",[22,48067,48068],{},"In most tenants, the Teams admin center already permits shared channel collaboration with external orgs by default. If a user from your side reports they cannot accept our shared-channel invite, your Teams admin should verify:",[2354,48070,48071,48083],{},[2357,48072,48073,48074,20790,48077,48080,48081,20056],{},"Microsoft Teams admin center → ",[31,48075,48076],{},"Teams",[31,48078,48079],{},"External access"," → \"Allow Teams accounts not managed by an organization\" or per-domain allow list (if your org uses an allow list, add ",[36,48082,47781],{},[2357,48084,48073,48085,20790,48087,48090,48091,741,48094,48097,48098,20056],{},[31,48086,48076],{},[31,48088,48089],{},"Teams policies"," → the policy assigned to the affected user has ",[31,48092,48093],{},"\"Create shared channels\"",[31,48095,48096],{},"\"Invite external users to shared channels\""," enabled (or at minimum, ",[31,48099,48100],{},"\"Join external shared channels\"",[22,48102,48103],{},"These Teams-level settings are usually permissive by default. The Entra cross-tenant configuration above is the part that's typically missing.",[55,48105,48107],{"id":48106},"replication-delay","Replication delay",[22,48109,48110],{},"Cross-tenant configuration can take up to 15 minutes to propagate across Microsoft's services. If we attempt to invite your user into the shared channel right after you finish, and it fails, please ask us to wait ten minutes and retry before troubleshooting further.",[55,48112,48114],{"id":48113},"letting-us-know-youre-done","Letting us know you're done",[22,48116,48117],{},"Once Inbound and Outbound both read \"Configured\" for Unified.to on your side, please let us know. We'll then send the shared-channel invite to the user(s) you specify, and they'll see the invitation appear in their own Microsoft Teams client.",[55,48119,48121],{"id":48120},"reverting-later","Reverting later",[22,48123,48124],{},"To remove the trust relationship at any time:",[2510,48126,48127,48130],{},[2357,48128,48129],{},"Microsoft Entra admin center → External Identities → Cross-tenant access settings → Organizational settings.",[2357,48131,48132],{},"Find the Unified.to row, click the trash icon at the right, and confirm.",[22,48134,48135],{},"This restores your default policy for our tenant. Any active shared channels become inaccessible to your users at that point.",[55,48137,48139],{"id":48138},"reference","Reference",[22,48141,48142],{},"Microsoft's official documentation:",[2354,48144,48145,48152,48159],{},[2357,48146,48147,48148],{},"B2B direct connect overview: ",[41,48149,48150],{"href":48150,"rel":48151},"https:\u002F\u002Flearn.microsoft.com\u002Fentra\u002Fexternal-id\u002Fb2b-direct-connect-overview",[45],[2357,48153,48154,48155],{},"Configure cross-tenant access settings: ",[41,48156,48157],{"href":48157,"rel":48158},"https:\u002F\u002Flearn.microsoft.com\u002Fentra\u002Fexternal-id\u002Fcross-tenant-access-settings-b2b-direct-connect",[45],[2357,48160,48161,48162],{},"Shared channels in Microsoft Teams: ",[41,48163,48164],{"href":48164,"rel":48165},"https:\u002F\u002Flearn.microsoft.com\u002Fmicrosoftteams\u002Fshared-channels",[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":48167},[48168,48169,48170,48171,48172,48177,48178,48179,48180,48181],{"id":47677,"depth":2434,"text":47678},{"id":47699,"depth":2434,"text":47700},{"id":2541,"depth":2434,"text":2542},{"id":47748,"depth":2434,"text":47749},{"id":20910,"depth":2434,"text":47794,"children":48173},[48174,48175,48176],{"id":47879,"depth":2613,"text":47880},{"id":47955,"depth":2613,"text":47956},{"id":48031,"depth":2613,"text":48032},{"id":48064,"depth":2434,"text":48065},{"id":48106,"depth":2434,"text":48107},{"id":48113,"depth":2434,"text":48114},{"id":48120,"depth":2434,"text":48121},{"id":48138,"depth":2434,"text":48139},"Unified.to offers customers 3 platforms for support,",{"img":7949,"date":48184,"updated":48185,"tag":2457,"integrations":3},"2026-05-01T17:05:00.000Z","2026-05-28T13:12:14.897Z","\u002Fguides\u002Fhow_to_get_a_private_support_channel_for_your_unified_integration",{"title":47607,"description":48182},"guides\u002Fhow_to_get_a_private_support_channel_for_your_unified_integration","OAbsFc4Tyuvd7wxzJq2GMKjVgHeloxOekoyYHGAyjW0",{"id":48191,"title":48192,"body":48193,"description":48207,"extension":2452,"meta":48325,"navigation":2459,"path":48330,"seo":48331,"stem":48332,"__hash__":48333},"guides\u002Fguides\u002Fhow_to_get_your_8x8_connect_api_key_and_account_id_step_by_step_guide.md","How to get your 8x8 Connect API Key and Account ID: Step-by-step guide",{"type":12,"value":48194,"toc":48321},[48195,48198,48200,48205,48208,48211,48217,48227,48233,48239,48245,48254,48260,48266,48272,48276,48289,48295,48309,48312,48315],[15,48196,48192],{"id":48197},"how-to-get-your-8x8-connect-api-key-and-account-id-step-by-step-guide",[19,48199],{},[22,48201,48202],{},[25,48203,48204],{},"July 17, 2025",[22,48206,48207],{},"8x8 Connect supports authentication with API Key and Account ID. To connect, you'll need to generate secure API Key and Account ID from your account settings.",[22,48209,48210],{},"This short guide shows you how to generate one, whether you're testing in your sandbox or helping customers connect their 8x8 Connect account.",[55,48212,48214],{"id":48213},"api-keys",[31,48215,48216],{},"API Keys",[22,48218,48219,48222,48223,97],{},[31,48220,48221],{},"Step 1:"," View the API Keys Section of the Connect Dashboard. This may be accessed ",[41,48224,28103],{"href":48225,"rel":48226},"https:\u002F\u002Fconnect.8x8.com\u002Fmessaging\u002Fapi-keys",[45],[22,48228,48229],{},[4201,48230],{"alt":48231,"src":48232},"611133d-image.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_8x8_connect_api_key_and_account_id_step_by_step_guide-0.png",[22,48234,48235,48238],{},[31,48236,48237],{},"Step 2:"," Click the \"Create API Key\" button.",[22,48240,48241],{},[4201,48242],{"alt":48243,"src":48244},"6dc9838-image.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_8x8_connect_api_key_and_account_id_step_by_step_guide-1.png",[22,48246,48247,48250,48251,97],{},[31,48248,48249],{},"Step 3:"," Name the API Key in the Pop Up, this can be any value. We recommend using a memorable name related to the API key's intended purpose such as \"HealthCareApp_Production\". Once the value is entered in, click ",[31,48252,48253],{},"save",[22,48255,48256],{},[4201,48257],{"alt":48258,"src":48259},"a5372f9-image.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_8x8_connect_api_key_and_account_id_step_by_step_guide-2.png",[22,48261,48262,48265],{},[31,48263,48264],{},"Step 4:"," The new API key should now be located in the list, you can perform a partial search at the top for the name. Only the last 6 characters will be shown, click the document button highlighted in red to reveal the entire API key. You can return to this page to retrieve the API key's value at any time.",[22,48267,48268],{},[4201,48269],{"alt":48270,"src":48271},"9f50dec-image.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_8x8_connect_api_key_and_account_id_step_by_step_guide-3.png",[55,48273,48275],{"id":48274},"account-id-and-subaccount-id","Account ID and SubAccount ID",[22,48277,5050,48278,4950,48281,48284,48285,48288],{},[31,48279,48280],{},"accountId",[31,48282,48283],{},"subAccountId"," can be found in your 8x8 Connect via ",[31,48286,48287],{},"API keys"," page. ",[22,48290,48291],{},[4201,48292],{"alt":48293,"src":48294},"adcd1c81-272d-4b47-9adb-c733f026a2d2.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_8x8_connect_api_key_and_account_id_step_by_step_guide-4.png",[22,48296,48297,48298,48301,48302,48305,48306],{},"Above we can see the Accountid is : ",[31,48299,48300],{},"test11_9tT31"," with SubaccountId : ",[31,48303,48304],{},"test11_9tT31_hq."," Your account may have multiple subaccounts which can be seen if you click the drop down in ",[31,48307,48308],{},"Subaccount ID.",[22,48310,48311],{},"You've now created your 8x8 Connect API Key and Account ID - just one of many if you support multiple vendors. Each one adds new auth flows, schema differences, and ongoing maintenance.",[22,48313,48314],{},"Unified.to removes that overhead with unified objects that work across 660 APIs. Map once, launch everywhere. Your team ships features instead of debugging vendor-specific edge cases.",[22,48316,48317,48320],{},[41,48318,41423],{"href":4152,"rel":48319},[45]," to see how much faster you can launch customer integrations with Unified.to.",{"title":2433,"searchDepth":2434,"depth":2434,"links":48322},[48323,48324],{"id":48213,"depth":2434,"text":48216},{"id":48274,"depth":2434,"text":48275},{"img":48326,"date":48327,"updated":48328,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_8x8_connect_api_key_and_account_id_step_by_step_guide-icon.png","2025-07-17T19:53:00.000Z","2026-08-04T13:44:58.200Z","Guides, Integration Instructions","\u002Fguides\u002Fhow_to_get_your_8x8_connect_api_key_and_account_id_step_by_step_guide",{"title":48192,"description":48207},"guides\u002Fhow_to_get_your_8x8_connect_api_key_and_account_id_step_by_step_guide","jCF-pMUWWOB66emXwYKjtLxGLT-NeFcN1C-RjYgm1qE",{"id":48335,"title":48336,"body":48337,"description":48475,"extension":2452,"meta":48476,"navigation":2459,"path":48480,"seo":48481,"stem":48482,"__hash__":48483},"guides\u002Fguides\u002Fhow_to_get_your_adp_workforce_now_oauth2_client_id_oauth2_client_secret_oauth2_pem_certificate_and_oauth2_private_key_step_by_step_guide.md","How to get your ADP Workforce Now Oauth2 client ID, Oauth2 client secret, Oauth2 PEM certificate and Oauth2 private key: Step-by-step guide",{"type":12,"value":48338,"toc":48473},[48339,48342,48344,48349,48352,48355,48425,48428,48448,48451,48461,48464,48467],[15,48340,48336],{"id":48341},"how-to-get-your-adp-workforce-now-oauth2-client-id-oauth2-client-secret-oauth2-pem-certificate-and-oauth2-private-key-step-by-step-guide",[19,48343],{},[22,48345,48346],{},[25,48347,48348],{},"April 24, 2023",[22,48350,48351],{},"When connecting ADP Workforce Now to other platforms, authentication requires a Oauth2 client ID, Oauth2 client secret, Oauth2 PEM certificate and Oauth2 private key.",[22,48353,48354],{},"Follow these step-by-step instructions to generate one from your ADP Workforce Now account, or provide them to your customers if they need to connect their account.",[2510,48356,48357,48367,48375,48383,48391,48394,48402,48405,48413,48416,48419],{},[2357,48358,48359,48360,34,48363,97],{},"Log into your ADP account and access the ADP API Central portal.  You will need the paid ",[36,48361,48362],{},"ADP API Central",[41,48364,25056],{"href":48365,"rel":48366},"https:\u002F\u002Fapps.adp.com\u002Fen-US\u002Fapps\u002F410612",[45],[2357,48368,48369,48370,48372],{},"Select a project or create a new project",[5888,48371],{},[4201,48373],{"alt":5892,"src":48374},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_adp_workforce_now_oauth2_client_id_oauth2_client_secret_oauth2_pem_certificate_and_oauth2_private_key_step_by_step_guide-0.png",[2357,48376,48377,48378,48380],{},"Enter the project details.",[5888,48379],{},[4201,48381],{"alt":5892,"src":48382},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_adp_workforce_now_oauth2_client_id_oauth2_client_secret_oauth2_pem_certificate_and_oauth2_private_key_step_by_step_guide-1.png",[2357,48384,48385,48386,48388],{},"Select domain",[5888,48387],{},[4201,48389],{"alt":5892,"src":48390},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_adp_workforce_now_oauth2_client_id_oauth2_client_secret_oauth2_pem_certificate_and_oauth2_private_key_step_by_step_guide-2.png",[2357,48392,48393],{},"Inside the Production integration Page, select the most suitable option for you.",[2357,48395,48396,48397,48399],{},"After creating a new Project, select Development Credentials",[5888,48398],{},[4201,48400],{"alt":5892,"src":48401},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_adp_workforce_now_oauth2_client_id_oauth2_client_secret_oauth2_pem_certificate_and_oauth2_private_key_step_by_step_guide-3.png",[2357,48403,48404],{},"This page will Provide the Client ID, Secret Key and Certificates",[2357,48406,48407,48408,48410],{},"Select Manage Certificate to generate Certificate",[5888,48409],{},[4201,48411],{"alt":5892,"src":48412},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_adp_workforce_now_oauth2_client_id_oauth2_client_secret_oauth2_pem_certificate_and_oauth2_private_key_step_by_step_guide-4.png",[2357,48414,48415],{},"Fill out the form, which will provide the PEM Key required to create a connection.",[2357,48417,48418],{},"The processing time for the certificate is few minutes. Generated Certificate will be required to create a connection.",[2357,48420,48421,48422,48424],{},"If asked, select ",[36,48423,34178],{}," permission.",[22,48426,48427],{},"For Unified, you need to have access to the following APIS for your App:",[2354,48429,48430,48433,48436,48439,48442,48445],{},[2357,48431,48432],{},"Job Applications API",[2357,48434,48435],{},"Job Applicants API",[2357,48437,48438],{},"Job Requisitions API",[2357,48440,48441],{},"Client Data - Validation Tables API",[2357,48443,48444],{},"Worker Leaves API",[2357,48446,48447],{},"Worker API",[22,48449,48450],{},"To add the API to your application scope, contact your ADP representative. Make sure you provide the following:",[2354,48452,48453,48455,48458],{},[2357,48454,47769],{},[2357,48456,48457],{},"Application name",[2357,48459,48460],{},"List of APIs to be added",[22,48462,48463],{},"Generating a ADP Workforce Now Oauth2 client ID, Oauth2 client secret, Oauth2 PEM certificate and Oauth2 private key is the first step. The harder part is building pipelines that stay reliable as customers add more systems.",[22,48465,48466],{},"Unified.to gives you options: deliver data via API, streaming webhooks, database sync, or even as MCP tools for AI agents. One integration layer that adapts to your architecture instead of forcing tradeoffs.",[22,48468,48469,48472],{},[41,48470,41423],{"href":4152,"rel":48471},[45]," to see how we simplify integration delivery across 1567 integrations and 37 categories.",{"title":2433,"searchDepth":2434,"depth":2434,"links":48474},[],"When connecting ADP Workforce Now to other platforms, authentication requires a Oauth2 client ID, Oauth2 client secret, Oauth2 PEM certificate and Oauth2...",{"img":48477,"date":48478,"updated":48479,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_adp_workforce_now_oauth2_client_id_oauth2_client_secret_oauth2_pem_certificate_and_oauth2_private_key_step_by_step_guide-icon.png","2023-04-24T19:31:00.000Z","2026-10-20T14:34:18.770Z","\u002Fguides\u002Fhow_to_get_your_adp_workforce_now_oauth2_client_id_oauth2_client_secret_oauth2_pem_certificate_and_oauth2_private_key_step_by_step_guide",{"title":48336,"description":48475},"guides\u002Fhow_to_get_your_adp_workforce_now_oauth2_client_id_oauth2_client_secret_oauth2_pem_certificate_and_oauth2_private_key_step_by_step_guide","CE5XvSSun0tVVH4uTD9DuvTmdhKi50v2XT6wFTGPARs",{"id":48485,"title":48486,"body":48487,"description":48501,"extension":2452,"meta":48606,"navigation":2459,"path":48610,"seo":48611,"stem":48612,"__hash__":48613},"guides\u002Fguides\u002Fhow_to_get_your_amazon_s3_aws_region_aws_s3_key_and_aws_s3_secret_step_by_step_guide.md","How to get your Amazon S3 AWS Region, AWS S3 Key and AWS S3 Secret: Step-by-step guide",{"type":12,"value":48488,"toc":48604},[48489,48492,48494,48499,48502,48505,48511,48514,48592,48595,48598],[15,48490,48486],{"id":48491},"how-to-get-your-amazon-s3-aws-region-aws-s3-key-and-aws-s3-secret-step-by-step-guide",[19,48493],{},[22,48495,48496],{},[25,48497,48498],{},"December 22, 2023",[22,48500,48501],{},"Developers connecting to Amazon S3 will need an AWS Region, AWS S3 Key and AWS S3 Secret for authentication.",[22,48503,48504],{},"Here's how to generate, configure, and copy your Amazon S3 AWS Region, AWS S3 Key and AWS S3 Secret so you can use it in your integration or share steps with your customers.",[15,48506,48508],{"id":48507},"generating-aws-access-key-id-and-secret-access-key",[31,48509,48510],{},"Generating AWS Access Key ID and Secret Access Key",[22,48512,48513],{},"You can easily access your AWS S3 account using a Access key and Secret Access key of your AWS account.",[2510,48515,48516,48527,48542,48553,48556,48579],{},[2357,48517,48518,48519,48522,48524],{},"If you don't have one already then go to your account and click on ",[31,48520,48521],{},"My Security Credentials",[5888,48523],{},[4201,48525],{"alt":5892,"src":48526},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_amazon_s3_aws_region_aws_s3_key_and_aws_s3_secret_step_by_step_guide-0.png",[2357,48528,48529,48530,48533,48534,48536,48539,48541],{},"Then select ",[31,48531,48532],{},"Access keys (access key ID and secret access key)"," section.",[5888,48535],{},[4201,48537],{"alt":5892,"src":48538},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_amazon_s3_aws_region_aws_s3_key_and_aws_s3_secret_step_by_step_guide-1.png",[5888,48540],{},"There is an important notification on the section, which recommends you to create an IAM Role instead of creating root access keys.",[2357,48543,48544,48545,48548,48550],{},"Click on ",[31,48546,48547],{},"Create New Access Key",[5888,48549],{},[4201,48551],{"alt":5892,"src":48552},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_amazon_s3_aws_region_aws_s3_key_and_aws_s3_secret_step_by_step_guide-2.png",[2357,48554,48555],{},"Download the Key pairs to your system for future use.",[2357,48557,48544,48558,48563,48564,4950,48569,48574,48576],{},[25,48559,48560],{},[31,48561,48562],{},"Show Access key"," and you will get your ",[25,48565,48566],{},[31,48567,48568],{},"Access Key ID",[25,48570,48571],{},[31,48572,48573],{},"Secret Access Key.",[5888,48575],{},[4201,48577],{"alt":5892,"src":48578},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_amazon_s3_aws_region_aws_s3_key_and_aws_s3_secret_step_by_step_guide-3.png",[2357,48580,48581,48582,4950,48586,48591],{},"You need to use this ",[25,48583,48584],{},[31,48585,48568],{},[25,48587,48588],{},[31,48589,48590],{},"Secret Access Key"," to connect to your AWS connect and access the S3 bucket.",[22,48593,48594],{},"With your Amazon S3 AWS Region, AWS S3 Key and AWS S3 Secret in hand, you're ready to connect. But managing keys, tokens, and refresh flows across every vendor quickly becomes a security risk.",[22,48596,48597],{},"Unified.to abstracts all of that behind a single, secure layer. We never store customer data, credentials are always under your control, and our permissioning model removes the risk of misconfigured scopes.",[22,48599,48600,48603],{},[41,48601,41423],{"href":4152,"rel":48602},[45]," to see how Unified keeps integrations real-time, compliant, and safe at scale.",{"title":2433,"searchDepth":2434,"depth":2434,"links":48605},[],{"img":48607,"date":48608,"updated":48609,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_amazon_s3_aws_region_aws_s3_key_and_aws_s3_secret_step_by_step_guide-icon.svg","2023-12-22T16:06:00.000Z","2026-06-16T18:14:36.470Z","\u002Fguides\u002Fhow_to_get_your_amazon_s3_aws_region_aws_s3_key_and_aws_s3_secret_step_by_step_guide",{"title":48486,"description":48501},"guides\u002Fhow_to_get_your_amazon_s3_aws_region_aws_s3_key_and_aws_s3_secret_step_by_step_guide","Y30Ws6mE8Zu6UEBsqBTF32_0B3cU16M6fkBxrEDSGNM",{"id":48615,"title":48616,"body":48617,"description":48630,"extension":2452,"meta":48697,"navigation":2459,"path":48701,"seo":48702,"stem":48703,"__hash__":48704},"guides\u002Fguides\u002Fhow_to_get_your_ashby_api_key_step_by_step_guide.md","How to get your Ashby API Key: Step-by-step guide",{"type":12,"value":48618,"toc":48695},[48619,48622,48624,48628,48631,48634,48684,48687,48689],[15,48620,48616],{"id":48621},"how-to-get-your-ashby-api-key-step-by-step-guide",[19,48623],{},[22,48625,48626],{},[25,48627,48348],{},[22,48629,48630],{},"Ashby supports authentication with an API Key. To connect, you'll need to generate an secure API Key from your account settings.",[22,48632,48633],{},"This short guide shows you how to generate one, whether you're testing in your sandbox or helping customers connect their Ashby account.",[2510,48635,48636,48639,48648,48651,48659,48673,48676],{},[2357,48637,48638],{},"Sign in to Ashby and click \"Admin\" in the top navigation bar",[2357,48640,48641,48642,48644],{},"Navigate to Integrations > API Keys",[5888,48643],{},[4201,48645],{"alt":48646,"src":48647},"image","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_ashby_api_key_step_by_step_guide-0.png",[2357,48649,48650],{},"Click + New in the upper right corner",[2357,48652,48653,48654,48656],{},"Add a name for the new API Key, click Create API Key",[5888,48655],{},[4201,48657],{"alt":20627,"src":48658},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_ashby_api_key_step_by_step_guide-1.png",[2357,48660,48661,48662,48664,48667,48669,48670,48672],{},"Set necessary API Scopes, e.g.",[5888,48663],{},[4201,48665],{"alt":20627,"src":48666},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_ashby_api_key_step_by_step_guide-2.png",[5888,48668],{},"To read Applications, you will also need the \"Offers\" READ permission.",[5888,48671],{},"To use Webhooks, you will also need the \"API Keys\" WRITE permission.",[2357,48674,48675],{},"Click \"Save and Continue\"",[2357,48677,48678,48679,48681],{},"Copy the API Key",[5888,48680],{},[4201,48682],{"alt":20627,"src":48683},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_ashby_api_key_step_by_step_guide-3.png",[22,48685,48686],{},"Generating a Ashby API Key is the first step. The harder part is building pipelines that stay reliable as customers add more systems.",[22,48688,48466],{},[22,48690,48691,48694],{},[41,48692,41423],{"href":4152,"rel":48693},[45]," to see how we simplify integration delivery across 1602 integrations and 37 categories.",{"title":2433,"searchDepth":2434,"depth":2434,"links":48696},[],{"img":48698,"date":48699,"updated":48700,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_ashby_api_key_step_by_step_guide-icon.png","2023-04-24T19:37:00.000Z","2026-10-21T16:35:50.051Z","\u002Fguides\u002Fhow_to_get_your_ashby_api_key_step_by_step_guide",{"title":48616,"description":48630},"guides\u002Fhow_to_get_your_ashby_api_key_step_by_step_guide","Lgz4-V3d3H8QdmN7oRi3kY5zpaAQsjpEXvMlHig5sWE",{"id":48706,"title":48707,"body":48708,"description":48722,"extension":2452,"meta":48834,"navigation":2459,"path":48838,"seo":48839,"stem":48840,"__hash__":48841},"guides\u002Fguides\u002Fhow_to_get_your_brex_api_token_step_by_step_guide.md","How to get your Brex API token: Step-by-step guide",{"type":12,"value":48709,"toc":48830},[48710,48713,48715,48720,48723,48726,48732,48801,48807,48813,48816,48819,48822,48825],[15,48711,48707],{"id":48712},"how-to-get-your-brex-api-token-step-by-step-guide",[19,48714],{},[22,48716,48717],{},[25,48718,48719],{},"March 21, 2025",[22,48721,48722],{},"If you're building an integration with Brex, you'll need an API token from your customer's Brex account to authenticate requests.",[22,48724,48725],{},"This guide shows you (or your customers) how to generate one from Brex's account settings.",[3629,48727,48729],{"id":48728},"generate-a-user-token",[31,48730,48731],{},"Generate a user token",[2510,48733,48734,48749,48758,48763,48775,48785,48793],{},[2357,48735,48736,48737,48742,48743,48748],{},"Sign in to ",[41,48738,48741],{"href":48739,"rel":48740},"https:\u002F\u002Fdashboard.brex.com\u002F",[45],"dashboard.brex.com"," as an ",[41,48744,48747],{"href":48745,"rel":48746},"https:\u002F\u002Fdeveloper.brex.com\u002Fdocs\u002Froles_permissions_scopes",[45],"account admin or card admin"," .",[2357,48750,7257,48751,48748],{},[41,48752,48755],{"href":48753,"rel":48754},"https:\u002F\u002Fdashboard.brex.com\u002Fsettings\u002Fdeveloper",[45],[25,48756,48757],{},"Developer > Settings",[2357,48759,6184,48760,48748],{},[25,48761,48762],{},"Create Token",[2357,48764,48765,48766,48769,48770,48772],{},"Create a name for your token that will help you identify it. Choose what level of data access you need for your application; these are the ",[41,48767,16739],{"href":48745,"rel":48768},[45]," your token will have.",[5888,48771],{},[4201,48773],{"alt":5892,"src":48774},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_brex_api_token_step_by_step_guide-0.png",[2357,48776,48777,48778,48748,48780,48782],{},"The next screen will confirm your previous selections. Make sure it looks good, then select ",[25,48779,6980],{},[5888,48781],{},[4201,48783],{"alt":5892,"src":48784},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_brex_api_token_step_by_step_guide-1.png",[2357,48786,48787,48788,48790],{},"Your token is now created. Copy and store the token securely. You won't be able to see it again.",[5888,48789],{},[4201,48791],{"alt":5892,"src":48792},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_brex_api_token_step_by_step_guide-2.png",[2357,48794,48795,48796,48798],{},"Back on the developer page of your Brex dashboard, you should see your token listed now. As a security measure, part of the string is obfuscated. If you lose it, create a new one and replace the token.",[5888,48797],{},[4201,48799],{"alt":5892,"src":48800},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_brex_api_token_step_by_step_guide-3.png",[22,48802,48803,48806],{},[31,48804,48805],{},"Caution",": Your user token is private and should not be shared. Never check it into version control or save it somewhere publicly accessible. If your user token is compromised or leaked, make sure to revoke it.",[3629,48808,48810],{"id":48809},"token-revocation-and-expiration",[31,48811,48812],{},"Token revocation and expiration",[22,48814,48815],{},"User tokens will expire if they are not used to make an API call for 90 days.",[22,48817,48818],{},"If your token is compromised, or you no longer need it, revoke the user token from the developer page in your Brex dashboard. Once revoked, any calls made with this token will immediately begin to fail.",[22,48820,48821],{},"You've now created your Brex API token - just one of many if you support multiple vendors. Each one adds new auth flows, schema differences, and ongoing maintenance.",[22,48823,48824],{},"Unified.to removes that overhead with unified objects that work across 475 APIs. Map once, launch everywhere. Your team ships features instead of debugging vendor-specific edge cases.",[22,48826,48827,48320],{},[41,48828,41423],{"href":4152,"rel":48829},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":48831},[48832,48833],{"id":48728,"depth":2613,"text":48731},{"id":48809,"depth":2613,"text":48812},{"img":48835,"date":48836,"updated":48837,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_brex_api_token_step_by_step_guide-icon.png","2025-03-21T21:13:00.000Z","2026-06-16T18:13:02.127Z","\u002Fguides\u002Fhow_to_get_your_brex_api_token_step_by_step_guide",{"title":48707,"description":48722},"guides\u002Fhow_to_get_your_brex_api_token_step_by_step_guide","YAU5nrLdWOZMr2SuWVHcSJRbl1Kyf_H9kdsA5dm89TA",{"id":48843,"title":48844,"body":48845,"description":48968,"extension":2452,"meta":48969,"navigation":2459,"path":48972,"seo":48973,"stem":48974,"__hash__":48975},"guides\u002Fguides\u002Fhow_to_get_your_bullhorn_oauth2_client_id_oauth2_client_secret_api_username_and_api_password_step_by_step_guide.md","How to get your Bullhorn OAuth2 Client ID, OAuth2 Client Secret, API Username and API Password: Step-by-step guide",{"type":12,"value":48846,"toc":48959},[48847,48850,48852,48856,48859,48862,48866,48869,48871,48875,48878,48881,48887,48890,48895,48899,48902,48905,48913,48916,48923,48927,48930,48933,48935,48948,48951,48953],[15,48848,48844],{"id":48849},"how-to-get-your-bullhorn-oauth2-client-id-oauth2-client-secret-api-username-and-api-password-step-by-step-guide",[19,48851],{},[22,48853,48854],{},[25,48855,48348],{},[22,48857,48858],{},"If you're building an integration with Bullhorn, you'll need an OAuth2 Client ID, OAuth2 Client Secret, API Username and API Password from your customer's Bullhorn account to authenticate requests.",[22,48860,48861],{},"This guide shows you (or your customers) how to generate one from Bullhorn's account settings.",[55,48863,48865],{"id":48864},"why-this-is-required","Why this is required?",[22,48867,48868],{},"Bullhorn requires every connected application to use its own API user, client ID, client secret, and approved redirect URI. The redirect URI cannot be updated through the Bullhorn web interface, so Bullhorn Support must be contacted to approve and configure the redirect URI.",[55,48870,36209],{"id":36208},[3629,48872,48874],{"id":48873},"_1-create-an-api-user-in-bullhorn","1. Create an API User in Bullhorn",[22,48876,48877],{},"The customer must create a dedicated API user for the application they want to connect.",[22,48879,48880],{},"During this process, Bullhorn will provide:",[2354,48882,48883,48885],{},[2357,48884,4491],{},[2357,48886,4494],{},[22,48888,48889],{},"These credentials will later be used when creating the connection in Unified.",[22,48891,48892,48894],{},[31,48893,4943],{},": A new API user is required each time a new application is connected to Bullhorn.",[3629,48896,48898],{"id":48897},"_2-contact-bullhorn-support","2. Contact Bullhorn Support",[22,48900,48901],{},"After creating the API user, the customer must contact Bullhorn Support and request that the redirect URI for the API user be updated.",[22,48903,48904],{},"The customer should provide:",[2354,48906,48907,48910],{},[2357,48908,48909],{},"The API user or application they created",[2357,48911,48912],{},"The Unified redirect URI",[22,48914,48915],{},"Example request:",[22,48917,48918,48919],{},"Please update the redirect URI for our Bullhorn API user to the following Unified redirect URI: ",[31,48920,48921],{},[36,48922,21741],{},[3629,48924,48926],{"id":48925},"_3-wait-for-bullhorn-to-approve-and-apply-the-redirect-uri-change","3. Wait for Bullhorn to approve and apply the Redirect URI change",[22,48928,48929],{},"Bullhorn does not currently allow redirect URIs to be configured through the Bullhorn web UI.",[22,48931,48932],{},"Because of this, the redirect URI change must be completed by Bullhorn Support before the connection can work.",[55,48934,8198],{"id":8197},[2354,48936,48937,48939,48942,48945],{},[2357,48938,36348],{},[2357,48940,48941],{},"This is a Bullhorn limitation and cannot be configured directly in the Bullhorn UI or programmatically via Unified.",[2357,48943,48944],{},"This is a one-time setup",[2357,48946,48947],{},"If you create a new API user in the future, you will need to go through this process again",[22,48949,48950],{},"Generating a Bullhorn OAuth2 Client ID, OAuth2 Client Secret, API Username and API Password is the first step. The harder part is building pipelines that stay reliable as customers add more systems.",[22,48952,48466],{},[22,48954,48955,48958],{},[41,48956,41423],{"href":4152,"rel":48957},[45]," to see how we simplify integration delivery across 1561 integrations and 37 categories.",{"title":2433,"searchDepth":2434,"depth":2434,"links":48960},[48961,48962,48967],{"id":48864,"depth":2434,"text":48865},{"id":36208,"depth":2434,"text":36209,"children":48963},[48964,48965,48966],{"id":48873,"depth":2613,"text":48874},{"id":48897,"depth":2613,"text":48898},{"id":48925,"depth":2613,"text":48926},{"id":8197,"depth":2434,"text":8198},"If you're building an integration with Bullhorn, you'll need an OAuth2 Client ID, OAuth2 Client Secret, API Username and API Password from your customer's...",{"img":48970,"date":48699,"updated":48971,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_bullhorn_oauth2_client_id_oauth2_client_secret_api_username_and_api_password_step_by_step_guide-icon.png","2026-10-19T18:20:39.104Z","\u002Fguides\u002Fhow_to_get_your_bullhorn_oauth2_client_id_oauth2_client_secret_api_username_and_api_password_step_by_step_guide",{"title":48844,"description":48968},"guides\u002Fhow_to_get_your_bullhorn_oauth2_client_id_oauth2_client_secret_api_username_and_api_password_step_by_step_guide","26myRHvziX4y-nXGjb8U8O9XILTY7R9z-qLNXfkXxvI",{"id":48977,"title":48978,"body":48979,"description":48992,"extension":2452,"meta":49030,"navigation":2459,"path":49034,"seo":49035,"stem":49036,"__hash__":49037},"guides\u002Fguides\u002Fhow_to_get_your_ceridian_dayforce_username_password_and_client_namespace_step_by_step_guide.md","How to get your Ceridian Dayforce Username, Password and Client Namespace: Step-by-step guide",{"type":12,"value":48980,"toc":49028},[48981,48984,48986,48990,48993,48996,48999,49013,49016,49019,49022],[15,48982,48978],{"id":48983},"how-to-get-your-ceridian-dayforce-username-password-and-client-namespace-step-by-step-guide",[19,48985],{},[22,48987,48988],{},[25,48989,48348],{},[22,48991,48992],{},"Developers connecting to Ceridian Dayforce will need an Username, Password and Client Namespace for authentication.",[22,48994,48995],{},"Here's how to generate, configure, and copy your Ceridian Dayforce Username, Password and Client Namespace so you can use it in your integration or share steps with your customers.",[22,48997,48998],{},"To get the Dayforce client namespace, follow these steps:",[2510,49000,49001,49004,49007,49010],{},[2357,49002,49003],{},"Log in to Dayforce.",[2357,49005,49006],{},"Navigate to the \"Company\" tab.",[2357,49008,49009],{},"Click on \"Settings\".",[2357,49011,49012],{},"Under the \"General\" section, you should find the \"Client Namespace\" field. The value in this field is the Dayforce client namespace.",[22,49014,49015],{},"Getting your Ceridian Dayforce Username, Password and Client Namespace is the first step. The bigger challenge is supporting dozens of vendors - each with unique auth flows, schemas, and maintenance requirements.",[22,49017,49018],{},"Unified.to is a real-time integration platform built to replace that work. Instead of building and maintaining 1567 custom connectors, you get one secure, normalized API layer across 37 SaaS tools.",[22,49020,49021],{},"On top of that, our usage-based pricing scales cleanly with your product. No per-connection fees, no setup charges, and no lock-in, just infrastructure economics that grow with you.",[22,49023,49024,49027],{},[41,49025,41423],{"href":4152,"rel":49026},[45]," to discover how predictable integration costs should be.",{"title":2433,"searchDepth":2434,"depth":2434,"links":49029},[],{"img":49031,"date":49032,"updated":49033,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_ceridian_dayforce_username_password_and_client_namespace_step_by_step_guide-icon.svg","2023-04-24T19:39:00.000Z","2026-10-20T14:33:53.197Z","\u002Fguides\u002Fhow_to_get_your_ceridian_dayforce_username_password_and_client_namespace_step_by_step_guide",{"title":48978,"description":48992},"guides\u002Fhow_to_get_your_ceridian_dayforce_username_password_and_client_namespace_step_by_step_guide","7P8N6OfFLZq7eJLbXwk5Fz6IZfbGF5i5_GdZGXnnH_8",{"id":49039,"title":49040,"body":49041,"description":49055,"extension":2452,"meta":49122,"navigation":2459,"path":49126,"seo":49127,"stem":49128,"__hash__":49129},"guides\u002Fguides\u002Fhow_to_get_your_crelate_api_key_step_by_step_guide.md","How to get your Crelate API key: Step-by-step guide",{"type":12,"value":49042,"toc":49120},[49043,49046,49048,49053,49056,49059,49064,49067,49073,49078,49085,49091,49097,49103,49109,49112,49115],[15,49044,49040],{"id":49045},"how-to-get-your-crelate-api-key-step-by-step-guide",[19,49047],{},[22,49049,49050],{},[25,49051,49052],{},"August 18, 2023",[22,49054,49055],{},"To access Crelate data or automate workflows through an integration, an API key is required.",[22,49057,49058],{},"This guide walks you through where to find it and how to set it up for development or end-customer use.",[22,49060,49061],{},[31,49062,49063],{},"Where Is My API Key?",[22,49065,49066],{},"Your API Key can be found in your Settings Tab under \"My Settings & Preferences\". You will have to enable your API Key. Once Your API is enabled, you will be presented with your API Key.",[22,49068,49069,49070],{},"If you ever need to regenerate a new API Key, you can do so by clicking \"Regenerate New Key\". However, please note: ",[31,49071,49072],{},"Any Change in API KEY (for instance generating a new key or turning API Access off) will result in any exsisting links with the old API key to fail.",[22,49074,49075],{},[31,49076,49077],{},"Managing API",[22,49079,49080,49081,49084],{},"If you would like to manage your API, you can do so by going into your settings and clicking API Management under (Advanced Settings). You will presented with a screen that will allow you to manage users who have turned on API Access. If you click on a user who has enabled their API, administrators will have the option of turning off API Access for that user. Administrators can do this by clicking \"Clear API Key\". ",[31,49082,49083],{},"Clearing the API key will cause any references to that API Key to fail and will turn off that users API access to that specific API key",". If that user would like API access again, they will have to regenerate another API key.",[22,49086,49087,49088,7395],{},"To start, select your navigation menu and select \"",[31,49089,49090],{},"Your Profile & Preferences",[22,49092,49093],{},[4201,49094],{"alt":49095,"src":49096},"mceclip1.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_crelate_api_key_step_by_step_guide-0.png",[22,49098,49099,49100],{},"Next, navigate to ",[31,49101,49102],{},"API Access",[22,49104,49105],{},[4201,49106],{"alt":49107,"src":49108},"mceclip0.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_crelate_api_key_step_by_step_guide-1.png",[22,49110,49111],{},"You've now created your Crelate API key - just one of many if you support multiple vendors. Each one adds new auth flows, schema differences, and ongoing maintenance.",[22,49113,49114],{},"Unified.to removes that overhead with unified objects that work across 514 APIs. Map once, launch everywhere. Your team ships features instead of debugging vendor-specific edge cases.",[22,49116,49117,48320],{},[41,49118,41423],{"href":4152,"rel":49119},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":49121},[],{"img":49123,"date":49124,"updated":49125,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_crelate_api_key_step_by_step_guide-icon.png","2023-08-18T14:28:00.000Z","2026-07-02T13:17:00.256Z","\u002Fguides\u002Fhow_to_get_your_crelate_api_key_step_by_step_guide",{"title":49040,"description":49055},"guides\u002Fhow_to_get_your_crelate_api_key_step_by_step_guide","pam-6Xj7m9WtLfyyDxNap9eoawgk_x_pbF9ST6IJBf4",{"id":49131,"title":49132,"body":49133,"description":49147,"extension":2452,"meta":49245,"navigation":2459,"path":49249,"seo":49250,"stem":49251,"__hash__":49252},"guides\u002Fguides\u002Fhow_to_get_your_dashlane_api_key_step_by_step_guide.md","How to get your Dashlane API Key: Step-by-step guide",{"type":12,"value":49134,"toc":49240},[49135,49138,49140,49145,49148,49151,49155,49165,49171,49228,49231,49234],[15,49136,49132],{"id":49137},"how-to-get-your-dashlane-api-key-step-by-step-guide",[19,49139],{},[22,49141,49142],{},[25,49143,49144],{},"March 26, 2025",[22,49146,49147],{},"When connecting Dashlane to other platforms, authentication requires an API Key.",[22,49149,49150],{},"Follow these step-by-step instructions to generate one from your Dashlane account, or provide them to your customers if they need to connect their account.",[55,49152,49154],{"id":49153},"generate-a-dashlane-api-key","Generate a Dashlane API key",[22,49156,49157,49158,49161,49162,97],{},"To access the Dashlane API endpoints, you'll need an API key. This key can be generated in two ways: directly through the ",[31,49159,49160],{},"Admin Console"," or the ",[31,49163,49164],{},"Dashlane CLI",[3629,49166,49168],{"id":49167},"generate-an-api-key-using-dashlane-admin-console",[31,49169,49170],{},"Generate an API key using Dashlane Admin Console",[2510,49172,49173,49178,49192,49203],{},[2357,49174,49175,49176,48533],{},"Open the Admin Console and navigate to the ",[31,49177,4433],{},[2357,49179,5187,49180,49183,49184,97,49187,49189],{},[31,49181,49182],{},"Public API"," and then ",[31,49185,49186],{},"Create key",[5888,49188],{},[4201,49190],{"alt":48646,"src":49191},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_dashlane_api_key_step_by_step_guide-0.png",[2357,49193,49194,49195,97,49198,49200],{},"Enter a name for the key and select ",[31,49196,49197],{},"Generate key",[5888,49199],{},[4201,49201],{"alt":48646,"src":49202},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_dashlane_api_key_step_by_step_guide-1.png",[2357,49204,49205,49206,49208,49210,49211,49213,49218,49220,49223,49225],{},"Copy or download the bearer token. The bearer token will be used to authenticate and access the endpoints.",[5888,49207],{},[31,49209,5164],{},": Save your bearer token securely in a Secret on your vault, as it will only be displayed once.",[5888,49212],{},[41,49214,49217],{"href":49215,"rel":49216},"https:\u002F\u002Fsupport.dashlane.com\u002Fhc\u002Farticles\u002F17020356625682",[45],"Add and manage secrets in Dashlane",[5888,49219],{},[4201,49221],{"alt":48646,"src":49222},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_dashlane_api_key_step_by_step_guide-2.png",[5888,49224],{},[4201,49226],{"alt":48646,"src":49227},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_dashlane_api_key_step_by_step_guide-3.png",[22,49229,49230],{},"You've now retrieved your Dashlane API Key. That's one system covered, but scaling integrations one by one means repeating this process hundreds of times.",[22,49232,49233],{},"Unified.to handles this for you: 475 integrations out of the box, all with normalized schemas, real-time delivery, and Virtual Webhooks. No polling scripts, no retry logic, no maintenance backlog.",[22,49235,49236,49239],{},[41,49237,41423],{"href":4152,"rel":49238},[45]," to see how Unified cuts integration work from quarters to days.",{"title":2433,"searchDepth":2434,"depth":2434,"links":49241},[49242],{"id":49153,"depth":2434,"text":49154,"children":49243},[49244],{"id":49167,"depth":2613,"text":49170},{"img":49246,"date":49247,"updated":49248,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_dashlane_api_key_step_by_step_guide-icon.png","2025-03-26T13:37:00.000Z","2026-06-16T18:12:37.521Z","\u002Fguides\u002Fhow_to_get_your_dashlane_api_key_step_by_step_guide",{"title":49132,"description":49147},"guides\u002Fhow_to_get_your_dashlane_api_key_step_by_step_guide","NtMvqnilMU9FElayL2EU1pqtQyy3BM7KGuJz9YAWG7o",{"id":49254,"title":49255,"body":49256,"description":49270,"extension":2452,"meta":49347,"navigation":2459,"path":49351,"seo":49352,"stem":49353,"__hash__":49354},"guides\u002Fguides\u002Fhow_to_get_your_deel_access_token_step_by_step_guide.md","How to get your Deel Access Token: Step-by-step guide",{"type":12,"value":49257,"toc":49345},[49258,49261,49263,49268,49271,49274,49279,49289,49295,49304,49310,49334,49337,49339],[15,49259,49255],{"id":49260},"how-to-get-your-deel-access-token-step-by-step-guide",[19,49262],{},[22,49264,49265],{},[25,49266,49267],{},"August 26, 2023",[22,49269,49270],{},"When connecting Deel to other platforms, authentication requires an Access Token.",[22,49272,49273],{},"Follow these step-by-step instructions to generate one from your Deel account, or provide them to your customers if they need to connect their account.",[22,49275,49276],{},[31,49277,49278],{},"Generating Access Tokens",[2510,49280,49281,49286],{},[2357,49282,7120,49283,97],{},[31,49284,49285],{},"Apps & Integrations > Developer Center",[2357,49287,49288],{},"Select the type of Token, whether Organization or Personal. The former ties the keys to the whole organization while the latter ties the keys to an individual - token will expire once this person leaves the company.",[22,49290,49291],{},[4201,49292],{"alt":49293,"src":49294},"181cd5c-accesstoken.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_deel_access_token_step_by_step_guide-0.png",[2510,49296,49297],{},[2357,49298,49299,49300,49303],{},"Add a token name and click on the ",[31,49301,49302],{},"Next"," button.",[22,49305,49306],{},[4201,49307],{"alt":49308,"src":49309},"8e6d69f-accessscopes.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_deel_access_token_step_by_step_guide-1.png",[2510,49311,49312,49331],{},[2357,49313,49314,49315,49318,49319,33620,49322,319,49325,319,49328],{},"In the popup, select the scopes for the access token and click ",[31,49316,49317],{},"Generate",".\n",[36,49320,49321],{},"people:read",[36,49323,49324],{},"organizations:read",[36,49326,49327],{},"payslips:read",[36,49329,49330],{},"time-off:read",[2357,49332,49333],{},"Make sure to copy and save your newly generated token because you won't be able to see it again!",[22,49335,49336],{},"Generating a Deel Access Token is the first step. The harder part is building pipelines that stay reliable as customers add more systems.",[22,49338,48466],{},[22,49340,49341,49344],{},[41,49342,41423],{"href":4152,"rel":49343},[45]," to see how we simplify integration delivery across 721 integrations and 33 categories.",{"title":2433,"searchDepth":2434,"depth":2434,"links":49346},[],{"img":49348,"date":49349,"updated":49350,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_deel_access_token_step_by_step_guide-icon.png","2023-08-26T17:09:00.000Z","2026-08-13T16:37:35.558Z","\u002Fguides\u002Fhow_to_get_your_deel_access_token_step_by_step_guide",{"title":49255,"description":49270},"guides\u002Fhow_to_get_your_deel_access_token_step_by_step_guide","UACq-5ZlZFNYhji8Y8QYzQDO7SA6Cw-lqr1qy350J9s",{"id":49356,"title":49357,"body":49358,"description":49371,"extension":2452,"meta":49424,"navigation":2459,"path":49427,"seo":49428,"stem":49429,"__hash__":49430},"guides\u002Fguides\u002Fhow_to_get_your_dialpad_api_key_step_by_step_guide.md","How to get your Dialpad API Key: Step-by-step guide",{"type":12,"value":49359,"toc":49422},[49360,49363,49365,49369,49372,49375,49378,49401,49408,49411,49414,49417],[15,49361,49357],{"id":49362},"how-to-get-your-dialpad-api-key-step-by-step-guide",[19,49364],{},[22,49366,49367],{},[25,49368,48348],{},[22,49370,49371],{},"Dialpad supports authentication with an API Key. To connect, you'll need to generate an secure API Key from your account settings.",[22,49373,49374],{},"This short guide shows you how to generate one, whether you're testing in your sandbox or helping customers connect their Dialpad account.",[22,49376,49377],{},"To create and access your API key, you need to follow the below steps. Note that only Company Admins can create API keys on Dialpad.",[2510,49379,49380,49383,49388,49391,49397],{},[2357,49381,49382],{},"Navigate to Admin Settings > My Company > Authentication > API Keys",[2357,49384,5187,49385],{},[31,49386,49387],{},"Add Key",[2357,49389,49390],{},"Name your key and set the expiration terms",[2357,49392,49393,49394],{},"Select desired ",[31,49395,49396],{},"Additional Scopes",[2357,49398,5187,49399],{},[31,49400,46022],{},[22,49402,49403],{},[41,49404,49407],{"href":49405,"rel":49406},"https:\u002F\u002Fuse.vg\u002FwWKws7",[45],"video",[22,49409,49410],{},"Note: API keys can only be created by Dialpad customers on the Pro and Enterprise plans, and you must be a Company Admin to create and access an API key.",[22,49412,49413],{},"You've now retrieved your Dialpad API Key. That's one system covered, but scaling integrations one by one means repeating this process hundreds of times.",[22,49415,49416],{},"Unified.to handles this for you: 1258 integrations out of the box, all with normalized schemas, real-time delivery, and Virtual Webhooks. No polling scripts, no retry logic, no maintenance backlog.",[22,49418,49419,49239],{},[41,49420,41423],{"href":4152,"rel":49421},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":49423},[],{"img":49425,"date":49032,"updated":49426,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_dialpad_api_key_step_by_step_guide-icon.png","2026-10-10T01:17:26.406Z","\u002Fguides\u002Fhow_to_get_your_dialpad_api_key_step_by_step_guide",{"title":49357,"description":49371},"guides\u002Fhow_to_get_your_dialpad_api_key_step_by_step_guide","2FmN2ICCwkj-6Bq0IWtNHulaYd0DCNchRX7tb1jm9oo",{"id":49432,"title":27991,"body":49433,"description":49767,"extension":2452,"meta":49768,"navigation":2459,"path":49772,"seo":49773,"stem":49774,"__hash__":49775},"guides\u002Fguides\u002Fhow_to_get_your_discord_oauth_2_credentials_and_bot_token.md",{"type":12,"value":49434,"toc":49760},[49435,49438,49440,49445,49450,49453,49457,49497,49503,49510,49514,49517,49556,49562,49570,49574,49581,49604,49611,49616,49620,49623,49689,49695,49699,49739,49745,49748,49755],[15,49436,27991],{"id":49437},"how-to-get-your-discord-oauth-2-credentials-and-bot-token",[19,49439],{},[22,49441,49442],{},[25,49443,49444],{},"May 21, 2024",[22,49446,49447],{},[25,49448,49449],{},"Last updated: May 2026",[22,49451,49452],{},"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 the Discord integration and access Discord via Unified.to's unified API.",[55,49454,49456],{"id":49455},"register-your-application-in-discord","Register your application in Discord",[2510,49458,49459,49473,49479],{},[2357,49460,49461,49462,97,49467,49469],{},"Sign into Discord and navigate to the ",[41,49463,49466],{"href":49464,"rel":49465},"https:\u002F\u002Fdiscord.com\u002Fdevelopers\u002Fapplications",[45],"Developer Portal",[5888,49468],{},[4201,49470],{"alt":49471,"src":49472},"discord_1.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_discord_oauth_2_credentials_and_bot_token-0.png",[2357,49474,16292,49475,49478],{},[31,49476,49477],{},"New Application"," at the top right of the page.",[2357,49480,37282,49481,49484,49485],{},[31,49482,49483],{},"Create an application"," window:",[2354,49486,49487,49490,49493],{},[2357,49488,49489],{},"Enter a name for your application",[2357,49491,49492],{},"Check the box to agree to Discord's terms of service and developer policy",[2357,49494,16292,49495],{},[31,49496,21975],{},[22,49498,49499],{},[4201,49500],{"alt":49501,"src":49502},"discord_2.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_discord_oauth_2_credentials_and_bot_token-1.png",[22,49504,49505,49506,49509],{},"Discord will create a new application and take you to the ",[31,49507,49508],{},"General Information"," tab for your application's page. Think of this application as the container for both your OAuth 2 credentials and your bot user.",[55,49511,49513],{"id":49512},"get-your-discord-oauth-2-credentials","Get your Discord OAuth 2 credentials",[22,49515,49516],{},"Once your application is registered, you can obtain its OAuth 2 credentials. These authenticate your app and let it access the Discord API through Unified.to.",[2510,49518,49519,49525,49536,49544,49550],{},[2357,49520,49521,49522,49524],{},"On your application's page, select the ",[31,49523,7055],{}," tab from the left sidebar.",[2357,49526,20156,49527,49530,49531,741,49533,49535],{},[31,49528,49529],{},"Client Information",", make note of your ",[31,49532,4491],{},[31,49534,4494],{}," — you'll need these later.",[2357,49537,20156,49538,22578,49541,97],{},[31,49539,49540],{},"Redirects",[31,49542,49543],{},"Add Redirect",[2357,49545,49546,49547,49549],{},"Enter ",[36,49548,21741],{}," as the redirect URL. (If your workspace is hosted in the EU or AU region, use the corresponding regional redirect URL.)",[2357,49551,16292,49552,49555],{},[31,49553,49554],{},"Save Changes"," at the bottom of the page.",[22,49557,49558],{},[4201,49559],{"alt":49560,"src":49561},"discord_4.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_discord_oauth_2_credentials_and_bot_token-2.png",[4937,49563,49564],{},[22,49565,49566,49569],{},[31,49567,49568],{},"Keep these private."," Never commit your Client Secret or Bot Token to source control, share them in screenshots, or include them in client-side code. Store them in environment variables or a secrets manager.",[55,49571,49573],{"id":49572},"retrieve-your-discord-bot-token","Retrieve your Discord bot token",[22,49575,49576,49577,49580],{},"The Discord integration also requires a ",[31,49578,49579],{},"Bot Token"," to access the Discord API.",[2510,49582,49583,49589,49597],{},[2357,49584,21834,49585,49588],{},[31,49586,49587],{},"Bot"," from the left sidebar.",[2357,49590,20156,49591,49594,49595,97],{},[31,49592,49593],{},"Build-A-Bot > Token",", copy the ",[31,49596,49579],{},[2357,49598,49599,49600,49603],{},"If no token is shown (for a new bot), click ",[31,49601,49602],{},"Reset Token"," to generate one, confirm in the dialog, and copy the new token that appears.",[4937,49605,49606],{},[22,49607,49608,49610],{},[31,49609,22779],{}," Resetting the token invalidates the previous one. If a bot is already running in production with the existing token, resetting will break those connections until you update them. You also won't be able to view a token again after it's generated, so store it securely right away.",[22,49612,49613],{},[4201,49614],{"alt":20627,"src":49615},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_discord_oauth_2_credentials_and_bot_token-3.png",[55,49617,49619],{"id":49618},"configure-bot-permissions-and-intents","Configure bot permissions and intents",[22,49621,49622],{},"Enable the permissions and privileged gateway intents that match the data your integration accesses. Enable only what you need — Unified.to maps each capability to the minimum required access. The Discord integration supports messages and channels (via the Messaging API) and members (via the HRIS API):",[2354,49624,49625,49641,49672],{},[2357,49626,49627,49630,49631,23303,49634,49636,49637,49640],{},[31,49628,49629],{},"To list channels"," (Messaging Channel ",[36,49632,49633],{},"list",[36,49635,28161],{},"): no privileged intent is required. The bot needs the standard ",[31,49638,49639],{},"View Channels"," permission in the server.",[2357,49642,49643,49646,49647,23303,49649,23303,49651,23303,49653,23303,49655,49658,49659,49662,49663,49666,49667,49669],{},[31,49644,49645],{},"To read or write messages"," (Messaging Message ",[36,49648,49633],{},[36,49650,28901],{},[36,49652,25946],{},[36,49654,28161],{},[36,49656,49657],{},"remove","): enable ",[31,49660,49661],{},"Message Content Intent"," under ",[31,49664,49665],{},"Privileged Gateway Intents",". Note that Message Content Intent is gated by Discord and may require verification once your bot is in a larger number of servers.",[5888,49668],{},[4201,49670],{"alt":20627,"src":49671},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_discord_oauth_2_credentials_and_bot_token-4.png",[2357,49673,49674,49677,49678,23303,49680,49682,49683,49662,49686,49688],{},[31,49675,49676],{},"To read members"," (HRIS Employee ",[36,49679,49633],{},[36,49681,28161],{},", which maps Discord guild members to the unified employee object — a Unified.to abstraction, not a Discord-native concept): enable ",[31,49684,49685],{},"Server Members Intent",[31,49687,49665],{},". (Discord's documentation refers to this as the Guild Members Intent; the developer portal UI labels it \"Server Members Intent.\")",[22,49690,49691,49692,49694],{},"After enabling the intents you need, click ",[31,49693,49554],{}," at the bottom of the page. Granting intents or permissions you don't use increases risk and can complicate Discord's review process once your bot reaches a larger number of servers.",[55,49696,49698],{"id":49697},"activate-discord-in-unifiedto","Activate Discord in Unified.to",[2510,49700,49701,49706,49712,49734],{},[2357,49702,16270,49703,45685],{},[41,49704,4433],{"href":16276,"rel":49705},[45],[2357,49707,49708,49709,49711],{},"Find and click on the ",[31,49710,21800],{}," integration card.",[2357,49713,49714,49715,49718,49719],{},"On the integration details page, select ",[31,49716,49717],{},"Your OAuth 2 credentials",", then enter your:\n",[2354,49720,49721,49726,49730],{},[2357,49722,49723,49724],{},"Discord ",[31,49725,4491],{},[2357,49727,49723,49728],{},[31,49729,4494],{},[2357,49731,49723,49732],{},[31,49733,49579],{},[2357,49735,16292,49736,49738],{},[31,49737,16295],{}," to save your changes and enable the Discord integration.",[22,49740,49741],{},[4201,49742],{"alt":49743,"src":49744},"discord_7.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_discord_oauth_2_credentials_and_bot_token-5.png",[22,49746,49747],{},"You can now use the Unified API to build new experiences with Discord.",[22,49749,49750,49751],{},"→ ",[41,49752,49754],{"href":21420,"rel":49753},[45],"Start your 30-day free trial",[22,49756,49750,49757],{},[41,49758,41423],{"href":4152,"rel":49759},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":49761},[49762,49763,49764,49765,49766],{"id":49455,"depth":2434,"text":49456},{"id":49512,"depth":2434,"text":49513},{"id":49572,"depth":2434,"text":49573},{"id":49618,"depth":2434,"text":49619},{"id":49697,"depth":2434,"text":49698},"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...",{"img":49769,"date":49770,"updated":49771,"tag":2457,"integrations":31311},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_discord_oauth_2_credentials_and_bot_token-icon.webp","2024-05-21T00:00:00.000Z","2026-08-23T14:54:02.964Z","\u002Fguides\u002Fhow_to_get_your_discord_oauth_2_credentials_and_bot_token",{"title":27991,"description":49767},"guides\u002Fhow_to_get_your_discord_oauth_2_credentials_and_bot_token","pJ0WF0fQJXRi-_eGysW1PGMAUCM5vqw0rz6qrdY5xqE",{"id":49777,"title":49778,"body":49779,"description":49891,"extension":2452,"meta":49892,"navigation":2459,"path":49896,"seo":49897,"stem":49898,"__hash__":49899},"guides\u002Fguides\u002Fhow_to_get_your_elmo_client_id_and_client_secret_step_by_step_guide.md","How to get your ELMO client ID and client secret: Step-by-step guide",{"type":12,"value":49780,"toc":49889},[49781,49784,49786,49791,49794,49797,49802,49805,49817,49821,49879,49882,49884],[15,49782,49778],{"id":49783},"how-to-get-your-elmo-client-id-and-client-secret-step-by-step-guide",[19,49785],{},[22,49787,49788],{},[25,49789,49790],{},"December 11, 2023",[22,49792,49793],{},"ELMO supports authentication with client ID and client secret. To connect, you'll need to generate secure client ID and client secret from your account settings.",[22,49795,49796],{},"This short guide shows you how to generate one, whether you're testing in your sandbox or helping customers connect their ELMO account.",[22,49798,49799],{},[31,49800,49801],{},"Authentication Methods",[22,49803,49804],{},"ELMO uses three main credentials for API authentication:",[2354,49806,49807,49812],{},[2357,49808,49809,49811],{},[31,49810,4732],{}," A unique identifier for your application.",[2357,49813,49814,49816],{},[31,49815,4738],{}," A secure key used in conjunction with the Client ID.",[22,49818,49819],{},[31,49820,20911],{},[2510,49822,49823,49833,49859],{},[2357,49824,49825,49828,49829,49832],{},[31,49826,49827],{},"Request Access:"," Contact your ",[31,49830,49831],{},"ELMO Account Manager"," to confirm your organization has API access enabled.",[2357,49834,49835,49838],{},[31,49836,49837],{},"Assign Permissions:",[2354,49839,49840,49846,49856],{},[2357,49841,49842,49843,97],{},"Log in to the ",[31,49844,49845],{},"ELMO Administration portal",[2357,49847,7120,49848,49851,49852,49855],{},[31,49849,49850],{},"Security Profiles"," and add a profile with the ",[31,49853,49854],{},"API Access Manager","role.",[2357,49857,49858],{},"Assign this profile to the specific user who will manage the integration.",[2357,49860,49861,49864],{},[31,49862,49863],{},"Generate Credentials:",[2354,49865,49866,49872],{},[2357,49867,49868,49869,97],{},"Have a Company Admin access the ",[31,49870,49871],{},"API Management console",[2357,49873,49874,49875,4950,49877,97],{},"Generate and securely record the ",[31,49876,4491],{},[31,49878,4494],{},[22,49880,49881],{},"You've now created your ELMO client ID and client secret - just one of many if you support multiple vendors. Each one adds new auth flows, schema differences, and ongoing maintenance.",[22,49883,48824],{},[22,49885,49886,48320],{},[41,49887,41423],{"href":4152,"rel":49888},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":49890},[],"ELMO supports authentication with client ID and client secret. To connect, you'll need to generate secure client ID and client secret from your account...",{"img":49893,"date":49894,"updated":49895,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_elmo_client_id_and_client_secret_step_by_step_guide-icon.png","2023-12-11T23:57:00.000Z","2026-06-16T18:14:39.959Z","\u002Fguides\u002Fhow_to_get_your_elmo_client_id_and_client_secret_step_by_step_guide",{"title":49778,"description":49891},"guides\u002Fhow_to_get_your_elmo_client_id_and_client_secret_step_by_step_guide","W8MaTvDQRkc9ZFYCEbd_DXun-75qt9ENa5Cb59_ZU8Q",{"id":49901,"title":49902,"body":49903,"description":50000,"extension":2452,"meta":50001,"navigation":2459,"path":50005,"seo":50006,"stem":50007,"__hash__":50008},"guides\u002Fguides\u002Fhow_to_get_your_gainsight_client_id_client_secret_and_gainsight_api_domain_step_by_step_guide.md","How to get your Gainsight Client ID, Client Secret and Gainsight API Domain: Step-by-step guide",{"type":12,"value":49904,"toc":49998},[49905,49908,49910,49915,49918,49921,49924,49964,49967,49971,49982,49987,49990,49992],[15,49906,49902],{"id":49907},"how-to-get-your-gainsight-client-id-client-secret-and-gainsight-api-domain-step-by-step-guide",[19,49909],{},[22,49911,49912],{},[25,49913,49914],{},"November 15, 2025",[22,49916,49917],{},"Gainsight supports authentication with Client ID, Client Secret and Gainsight API Domain. To connect, you'll need to generate secure Client ID, Client Secret and Gainsight API Domain from your account settings.",[22,49919,49920],{},"This short guide shows you how to generate one, whether you're testing in your sandbox or helping customers connect their Gainsight account.",[22,49922,49923],{},"To generate the M2M OAuth key:",[2510,49925,49926,49931,49936,49946,49953,49959],{},[2357,49927,7120,49928,97],{},[31,49929,49930],{},"Administration > Connectors 2.0",[2357,49932,6184,49933,49935],{},[31,49934,45057],{},". The Create Connection dialog appears.",[2357,49937,49938,49939,49942,49943,97],{},"From the ",[31,49940,49941],{},"Connector"," dropdown list, select ",[31,49944,49945],{},"Gainsight API",[2357,49947,49948,49949,49952],{},"In the ",[31,49950,49951],{},"Name of the connection"," field, enter the name of the connection.",[2357,49954,49948,49955,49958],{},[31,49956,49957],{},"Authentication Type",", select the OAuth.",[2357,49960,6184,49961,97],{},[31,49962,49963],{},"Generate OAuth Credentials",[22,49965,49966],{},"New OAuth API Key and OAuth API Secret keys are generated, which you can copy and use for authentication in all of the REST API requests to Gainsight.",[22,49968,49969,2646],{},[31,49970,4943],{},[2354,49972,49973,49976,49979],{},[2357,49974,49975],{},"M2M OAuth can be created and managed only by super admins.",[2357,49977,49978],{},"M2M OAuth cannot be used for Event APIs.",[2357,49980,49981],{},"Two different M2M connections cannot have the same name for a single connection.",[22,49983,49984],{},[4201,49985],{"alt":5892,"src":49986},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_gainsight_client_id_client_secret_and_gainsight_api_domain_step_by_step_guide-0.png",[22,49988,49989],{},"Generating a Gainsight Client ID, Client Secret and Gainsight API Domain is the first step. The harder part is building pipelines that stay reliable as customers add more systems.",[22,49991,48466],{},[22,49993,49994,49997],{},[41,49995,41423],{"href":4152,"rel":49996},[45]," to see how we simplify integration delivery across 475 integrations and 29 categories.",{"title":2433,"searchDepth":2434,"depth":2434,"links":49999},[],"Gainsight supports authentication with Client ID, Client Secret and Gainsight API Domain. To connect, you'll need to generate secure Client ID, Client Secret...",{"img":50002,"date":50003,"updated":50004,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_gainsight_client_id_client_secret_and_gainsight_api_domain_step_by_step_guide-icon.svg","2025-11-15T01:04:00.000Z","2026-06-16T18:11:49.976Z","\u002Fguides\u002Fhow_to_get_your_gainsight_client_id_client_secret_and_gainsight_api_domain_step_by_step_guide",{"title":49902,"description":50000},"guides\u002Fhow_to_get_your_gainsight_client_id_client_secret_and_gainsight_api_domain_step_by_step_guide","5rqGomN8f40ewVsC3wx_00zEU0Mn3LdATElKnwjxlsk",{"id":50010,"title":50011,"body":50012,"description":50025,"extension":2452,"meta":50154,"navigation":2459,"path":50158,"seo":50159,"stem":50160,"__hash__":50161},"guides\u002Fguides\u002Fhow_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide.md","How to get your Greenhouse API Key and Job board token: Step-by-step guide",{"type":12,"value":50013,"toc":50152},[50014,50017,50019,50023,50026,50029,50037,50042,50051,50056,50068,50073,50117,50122,50134,50139,50142,50145,50147],[15,50015,50011],{"id":50016},"how-to-get-your-greenhouse-api-key-and-job-board-token-step-by-step-guide",[19,50018],{},[22,50020,50021],{},[25,50022,48348],{},[22,50024,50025],{},"Developers connecting to Greenhouse will need an API Key and Job board token for authentication.",[22,50027,50028],{},"Here's how to generate, configure, and copy your Greenhouse API Key and Job board token so you can use it in your integration or share steps with your customers.",[2510,50030,50031],{},[2357,50032,50033,50034,50036],{},"To create a Greenhouse \"Harvest\" API key, click the Configure icon on your Greenhouse navigation bar and select \"",[25,50035,4881],{},"\" on the left.",[22,50038,50039],{},[4201,50040],{"alt":48646,"src":50041},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide-0.png",[2510,50043,50044],{},[2357,50045,50046,50047,50050],{},"Click \"",[25,50048,50049],{},"API Credential Management","\".",[22,50052,50053],{},[4201,50054],{"alt":48646,"src":50055},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide-1.png",[2510,50057,50058],{},[2357,50059,50046,50060,50063,50064,50067],{},[25,50061,50062],{},"Create New API Key","\", and select \"",[25,50065,50066],{},"Harvest","\" for the API Type.",[22,50069,50070],{},[4201,50071],{"alt":48646,"src":50072},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide-2.png",[2510,50074,50075,50085,50096,50104,50107,50114],{},[2357,50076,50046,50077,50050,50080,50082],{},[25,50078,50079],{},"Manage Permissions",[5888,50081],{},[4201,50083],{"alt":48646,"src":50084},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide-3.png",[2357,50086,50087,50088,97,50091,50093],{},"Copy your Harvest API key to a secure location then click ",[25,50089,50090],{},"\"I have stored the API key\"",[5888,50092],{},[4201,50094],{"alt":48646,"src":50095},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide-4.png",[2357,50097,50098,50099,50101],{},"Set Jobs, Job Posts, and Candidates, Applications, Scorecards permissions.",[5888,50100],{},[4201,50102],{"alt":48646,"src":50103},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide-5.png",[2357,50105,50106],{},"Click Save",[2357,50108,50109,50110,50113],{},"Optionally,  you can specify the job board token for your organization. Go to the \"",[25,50111,50112],{},"Configure Job Boards","\" page. (Configure gear icon > Job Boards & Posts)",[2357,50115,50116],{},"Find and edit the job board. (Ellipsis icon > Edit Board Settings)",[22,50118,50119],{},[4201,50120],{"alt":48646,"src":50121},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide-6.png",[2510,50123,50124],{},[2357,50125,47907,50126,50129,50130,50133],{},[25,50127,50128],{},"Edit Your Job Board"," page, find the ",[25,50131,50132],{},"URL"," section. Copy this value as this is the token.",[22,50135,50136],{},[4201,50137],{"alt":48646,"src":50138},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide-7.png",[22,50140,50141],{},"Getting your Greenhouse API Key and Job board token is the first step. The bigger challenge is supporting dozens of vendors - each with unique auth flows, schemas, and maintenance requirements.",[22,50143,50144],{},"Unified.to is a real-time integration platform built to replace that work. Instead of building and maintaining 1435 custom connectors, you get one secure, normalized API layer across 37 SaaS tools.",[22,50146,49021],{},[22,50148,50149,49027],{},[41,50150,41423],{"href":4152,"rel":50151},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":50153},[],{"img":50155,"date":50156,"updated":50157,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide-icon.png","2023-04-24T19:41:00.000Z","2026-10-16T15:57:05.621Z","\u002Fguides\u002Fhow_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide",{"title":50011,"description":50025},"guides\u002Fhow_to_get_your_greenhouse_api_key_and_job_board_token_step_by_step_guide","Nsto22d4E--FEoJBUZkVOYKoyXjXkty1YB6d8C2ZKUI",{"id":50163,"title":50164,"body":50165,"description":50179,"extension":2452,"meta":50227,"navigation":2459,"path":50231,"seo":50232,"stem":50233,"__hash__":50234},"guides\u002Fguides\u002Fhow_to_get_your_helpscout_api_key_step_by_step_guide.md","How to get your Helpscout API Key: Step-by-step guide",{"type":12,"value":50166,"toc":50225},[50167,50170,50172,50177,50180,50183,50189,50195,50204,50210,50215,50218,50220],[15,50168,50164],{"id":50169},"how-to-get-your-helpscout-api-key-step-by-step-guide",[19,50171],{},[22,50173,50174],{},[25,50175,50176],{},"June 8, 2024",[22,50178,50179],{},"Developers connecting to Helpscout will need an API Key for authentication.",[22,50181,50182],{},"Here's how to generate, configure, and copy your Helpscout API Key so you can use it in your integration or share steps with your customers.",[22,50184,50185,50186,97],{},"To generate, view, or regenerate the API key, click the \"person\" icon on the top right of your account, next to the search, then click ",[31,50187,50188],{},"Your Profile",[22,50190,50191],{},[4201,50192],{"alt":50193,"src":50194},"your-profile.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_helpscout_api_key_step_by_step_guide-0.png",[22,50196,50197,50198,50200,50201,50203],{},"Next, click the ",[31,50199,37791],{}," link in the menu on the left and select ",[31,50202,48216],{}," tab",[22,50205,50206],{},[4201,50207],{"alt":50208,"src":50209},"api-keys.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_helpscout_api_key_step_by_step_guide-1.png",[22,50211,50212,50214],{},[31,50213,22779],{}," If you don't see an API key in your profile, that's because you haven't been granted the \"Docs: Create new, edit settings & Collections\" permission by the Account Owner or an Administrator.",[22,50216,50217],{},"Generating a Helpscout API Key is the first step. The harder part is building pipelines that stay reliable as customers add more systems.",[22,50219,48466],{},[22,50221,50222,49997],{},[41,50223,41423],{"href":4152,"rel":50224},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":50226},[],{"img":50228,"date":50229,"updated":50230,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_helpscout_api_key_step_by_step_guide-icon.png","2024-06-08T05:44:00.000Z","2026-06-16T18:13:20.249Z","\u002Fguides\u002Fhow_to_get_your_helpscout_api_key_step_by_step_guide",{"title":50164,"description":50179},"guides\u002Fhow_to_get_your_helpscout_api_key_step_by_step_guide","uN__wgE3gxqyt63H3zOKvzpTwhMX63PJhetYA_10j4s",{"id":50236,"title":50237,"body":50238,"description":50251,"extension":2452,"meta":50530,"navigation":2459,"path":50533,"seo":50534,"stem":50535,"__hash__":50536},"guides\u002Fguides\u002Fhow_to_get_your_hibob_service_user_id_and_service_user_token_step_by_step_guide.md","How to get your HiBob Service User ID and Service User Token: Step-by-step guide",{"type":12,"value":50239,"toc":50521},[50240,50243,50245,50249,50252,50255,50261,50264,50283,50286,50292,50295,50298,50306,50309,50327,50333,50336,50340,50347,50350,50356,50362,50382,50388,50391,50408,50413,50419,50425,50428,50504,50510,50513,50516],[15,50241,50237],{"id":50242},"how-to-get-your-hibob-service-user-id-and-service-user-token-step-by-step-guide",[19,50244],{},[22,50246,50247],{},[25,50248,48348],{},[22,50250,50251],{},"If you're building an integration with HiBob, you'll need an Service User ID and Service User Token from your customer's HiBob account to authenticate requests.",[22,50253,50254],{},"This guide shows you (or your customers) how to generate one from HiBob's account settings.",[55,50256,50258],{"id":50257},"step-1-create-a-service-user",[31,50259,50260],{},"Step 1: Create a service user",[22,50262,50263],{},"Service Users are created and managed in the Service Users section in Bob.",[2510,50265,50266,50277],{},[2357,50267,50268,50271,50272,97],{},[31,50269,50270],{},"If you have direct access to Bob:"," Go to the Service Users configuration page to create a new user and copy the ID and token. See ",[41,50273,50276],{"href":50274,"rel":50275},"https:\u002F\u002Fhelp.hibob.com\u002Fhc\u002Fen-us\u002Farticles\u002F27875098648465-Manage-service-users",[45],"Manage service users",[2357,50278,50279,50282],{},[31,50280,50281],{},"If you don't have direct access to Bob",": Ask a Bob Admin to generate the credentials for you.",[22,50284,50285],{},"You'll need this ID and token to authenticate your API requests.",[55,50287,50289],{"id":50288},"step-2-creating-a-permission-group",[31,50290,50291],{},"Step 2: Creating a permission group",[22,50293,50294],{},"By default, service users have no access permissions.",[22,50296,50297],{},"To assign them access:",[2510,50299,50300,50303],{},[2357,50301,50302],{},"Create a dedicated Permission Group.",[2357,50304,50305],{},"Add the Service User to this group.",[22,50307,50308],{},"This group should include only the permissions required for the API operations the service user will perform.",[2354,50310,50311,50321],{},[2357,50312,50313,8032,50316,97],{},[31,50314,50315],{},"If you have access to Bob:",[41,50317,50320],{"href":50318,"rel":50319},"https:\u002F\u002Fhelp.hibob.com\u002Fhc\u002Fen-us\u002Farticles\u002F29550415706897",[45],"Create a service user permission group",[2357,50322,50323,50326],{},[31,50324,50325],{},"If not",": Ask a Bob Admin to create one and assign the user to it.",[55,50328,50330],{"id":50329},"step-3-set-permissions",[31,50331,50332],{},"Step 3: Set permissions",[22,50334,50335],{},"A new permission group does not have any permissions enabled by default.",[22,50337,50338],{},[31,50339,20025],{},[2584,50341,50345],{"className":50342,"code":50344,"language":2652},[50343],"language-text","- **Ask Bob Admin** to help determine which permissions are required for this service user. To learn more, see [Manage service users](https:\u002F\u002Fhelp.hibob.com\u002Fhc\u002Fen-us\u002Farticles\u002F27875098648465).\n- **Default employee data permissions**: To read basic employee data via the People search API, assign the Default Employee Fields permissions. This includes access to the \"root,\" \"about,\" \"employment,\" and \"work\" categories. To learn more, see [Permissions for Default Employee Fields in People Search API](https:\u002F\u002Fhelp.hibob.com\u002Fhc\u002Fen-us\u002Farticles\u002F27875098648465#h_01JB9DYK9SZEJ7MF4DA7RHJE03).\n",[36,50346,50344],{"__ignoreMap":2433},[22,50348,50349],{},"Permissions are grouped into:",[3629,50351,50353],{"id":50352},"_31-features",[31,50354,50355],{},"3.1 Features",[22,50357,50358,50359,97],{},"Grant access to Bob features you need to access via the API you plan to use with this service user. For example, if you want to access reports, you may need to activate some options in ",[31,50360,50361],{},"Features > Reports",[2510,50363,50364,50370,50373],{},[2357,50365,50366,50367,97],{},"From the top right, click ",[31,50368,50369],{},"Edit",[2357,50371,50372],{},"Select the area of Bob you'd like to manage.",[2357,50374,50375,50376,50378],{},"Check or uncheck the permissions this group should have.",[5888,50377],{},[4201,50379],{"alt":50380,"src":50381},"e2e3b78-image.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_hibob_service_user_id_and_service_user_token_step_by_step_guide-0.png",[3629,50383,50385],{"id":50384},"_32-peoples-data",[31,50386,50387],{},"3.2 People's data",[22,50389,50390],{},"Grant access to people's data in each area of Bob for the API you plan to use with this service user.",[2510,50392,50393,50397,50399],{},[2357,50394,50366,50395,97],{},[31,50396,50369],{},[2357,50398,50372],{},[2357,50400,50401,50402,50404],{},"Mark the checkbox(es) to enable or disable the permissions you'd like to give the service users in this group.",[5888,50403],{},[4201,50405],{"alt":50406,"src":50407},"5da0461-image.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_hibob_service_user_id_and_service_user_token_step_by_step_guide-1.png",[22,50409,50410],{},[31,50411,50412],{},"'View', 'edit' and 'view history'",[2584,50414,50417],{"className":50415,"code":50416,"language":2652},[50343],"To access Employee data via the API you need to grant basic view access to each category:\n\n- **View all employees' [Category name] sections**\n\nIf you want to access history data (such as all the entries in the Lifecycle or Work table), you also need to grant the history access:\n\n- **View all employees' [Category name] section histories**.\n\nIf you want to update data or access sensitive data that requires an extra layer of permissions, you need to grant the edit permission:\n\n- **Edit all employees' [Category name] sections**\n",[36,50418,50416],{"__ignoreMap":2433},[3629,50420,50422],{"id":50421},"_33-access-rights",[31,50423,50424],{},"3.3 Access rights",[22,50426,50427],{},"Grant access to the people whose data you want to access via the API you plan to use with this service user.",[2510,50429,50430,50439],{},[2357,50431,49938,50432,50435,50436,97],{},[31,50433,50434],{},"People's data"," tab, click ",[31,50437,50438],{},"Access data for",[2357,50440,50441,50442,50445,50446],{},"Select whose data these permissions apply to (by default, the access rights are set to all employees using the ",[31,50443,50444],{},"Lifecycle status equals Any"," condition). Options are:\n",[2354,50447,50448,50476,50488],{},[2357,50449,50450,50453,50454],{},[31,50451,50452],{},"Everyone",": all employees marked as Employed in the system.",[4937,50455,50456],{},[22,50457,50458,50460,50461,50464,50465,50468,50469,50472,50473,50475],{},[31,50459,4943],{},": By default, the service user's permission group grants access to all ",[31,50462,50463],{},"active"," employees. To access inactive employees you need to use ",[31,50466,50467],{},"select by condition"," and remove the condition: ",[31,50470,50471],{},"Lifecycle status equals Employed"," from the permission group's ",[31,50474,50438],{}," settings.",[2357,50477,50478,50481,50482,50484,50485,97],{},[31,50479,50480],{},"Select people by condition",": click ",[31,50483,50369],{},", select conditions from the dropdown menu, then click ",[31,50486,50487],{},"Apply",[2357,50489,50490,50481,50493,50495,50496,97,50498,50500],{},[31,50491,50492],{},"Select people by name",[31,50494,50369],{},", select specific employees, then click ",[31,50497,50487],{},[5888,50499],{},[4201,50501],{"alt":50502,"src":50503},"c66efe9d529d03feeac57366db8107db3dec560db38cf0c6bd9910e1bcc618d3-image.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_hibob_service_user_id_and_service_user_token_step_by_step_guide-2.png",[22,50505,50506,50507,97],{},"To learn more, see ",[41,50508,50320],{"href":50318,"rel":50509},[45],[22,50511,50512],{},"You've now created your HiBob Service User ID and Service User Token - just one of many if you support multiple vendors. Each one adds new auth flows, schema differences, and ongoing maintenance.",[22,50514,50515],{},"Unified.to removes that overhead with unified objects that work across 1412 APIs. Map once, launch everywhere. Your team ships features instead of debugging vendor-specific edge cases.",[22,50517,50518,48320],{},[41,50519,41423],{"href":4152,"rel":50520},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":50522},[50523,50524,50525],{"id":50257,"depth":2434,"text":50260},{"id":50288,"depth":2434,"text":50291},{"id":50329,"depth":2434,"text":50332,"children":50526},[50527,50528,50529],{"id":50352,"depth":2613,"text":50355},{"id":50384,"depth":2613,"text":50387},{"id":50421,"depth":2613,"text":50424},{"img":50531,"date":50156,"updated":50532,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_hibob_service_user_id_and_service_user_token_step_by_step_guide-icon.png","2026-10-16T14:51:09.839Z","\u002Fguides\u002Fhow_to_get_your_hibob_service_user_id_and_service_user_token_step_by_step_guide",{"title":50237,"description":50251},"guides\u002Fhow_to_get_your_hibob_service_user_id_and_service_user_token_step_by_step_guide","LfqhhFrh_fyapYOKTVO-Pmlsyg5IkYglpuRVi5cDqhs",{"id":50538,"title":50539,"body":50540,"description":50553,"extension":2452,"meta":51023,"navigation":2459,"path":51026,"seo":51027,"stem":51028,"__hash__":51029},"guides\u002Fguides\u002Fhow_to_get_your_highlevel_api_key_and_location_id_step_by_step_guide.md","How to get your HighLevel API Key and Location ID: Step-by-step guide",{"type":12,"value":50541,"toc":51006},[50542,50545,50547,50551,50554,50557,50563,50565,50567,50569,50581,50589,50595,50597,50599,50607,50609,50613,50617,50622,50626,50634,50639,50643,50649,50654,50658,50664,50669,50673,50675,50825,50832,50836,50847,50852,50856,50862,50867,50871,50876,50880,50884,50889,50893,50895,50903,50913,50917,50932,50934,50939,50943,50961,50966,50968,50970,50972,50974,50988,50993,50996,50999,51004],[15,50543,50539],{"id":50544},"how-to-get-your-highlevel-api-key-and-location-id-step-by-step-guide",[19,50546],{},[22,50548,50549],{},[25,50550,48348],{},[22,50552,50553],{},"HighLevel supports authentication with API Key and Location ID. To connect, you'll need to generate secure API Key and Location ID from your account settings.",[22,50555,50556],{},"This short guide shows you how to generate one, whether you're testing in your sandbox or helping customers connect their HighLevel account.",[22,50558,44625,50559,44629,50561,44633],{},[31,50560,44628],{},[31,50562,44632],{},[19,50564],{},[55,50566,44639],{"id":44638},[22,50568,44642],{},[2354,50570,50571,50575],{},[2357,50572,50573],{},[31,50574,44649],{},[2357,50576,50577,44655,50579],{},[31,50578,44654],{},[25,50580,44658],{},[22,50582,44661,50583,741,50585,44666,50587,44670],{},[31,50584,23529],{},[31,50586,44410],{},[31,50588,44669],{},[4937,50590,50591],{},[22,50592,50593,44677],{},[31,50594,22779],{},[19,50596],{},[55,50598,44682],{"id":2541},[2354,50600,50601],{},[2357,50602,44687,50603,4149,50605,44694],{},[31,50604,44690],{},[31,50606,44693],{},[55,50608,44697],{"id":20910},[3629,50610,50612],{"id":50611},"_1-navigate-to-your-sub-account","1. Navigate to Your Sub-Account",[22,50614,44705,50615,97],{},[31,50616,44708],{},[22,50618,50619],{},[4201,50620],{"alt":5892,"src":50621},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_highlevel_api_key_and_location_id_step_by_step_guide-0.png",[3629,50623,50625],{"id":50624},"_2-open-private-integrations","2. Open Private Integrations",[2354,50627,50628],{},[2357,50629,21005,50630,34,50632],{},[31,50631,44721],{},[25,50633,44724],{},[22,50635,50636],{},[4201,50637],{"alt":5892,"src":50638},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_highlevel_api_key_and_location_id_step_by_step_guide-1.png",[3629,50640,50642],{"id":50641},"_3-create-a-new-integration","3. Create a New Integration",[2354,50644,50645],{},[2357,50646,16292,50647],{},[31,50648,44737],{},[22,50650,50651],{},[4201,50652],{"alt":5892,"src":50653},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_highlevel_api_key_and_location_id_step_by_step_guide-2.png",[3629,50655,50657],{"id":50656},"_4-name-your-integration","4. Name Your Integration",[2354,50659,50660],{},[2357,50661,44748,50662,2980],{},[36,50663,44751],{},[22,50665,50666],{},[4201,50667],{"alt":5892,"src":50668},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_highlevel_api_key_and_location_id_step_by_step_guide-3.png",[3629,50670,50672],{"id":50671},"_5-select-required-scopes","5. Select Required Scopes",[22,50674,44762],{},[155,50676,50677,50687],{},[158,50678,50679],{},[161,50680,50681,50683,50685],{},[164,50682,44771],{},[164,50684,44774],{},[164,50686,44777],{},[174,50688,50689,50699,50709,50721,50733,50743,50753,50763,50773,50783,50793,50803,50815],{},[161,50690,50691,50693,50695],{},[179,50692,4650],{},[179,50694,44786],{},[179,50696,50697],{},[36,50698,44791],{},[161,50700,50701,50703,50705],{},[179,50702,4653],{},[179,50704,44786],{},[179,50706,50707],{},[36,50708,44802],{},[161,50710,50711,50713,50715],{},[179,50712,4650],{},[179,50714,44809],{},[179,50716,50717,319,50719],{},[36,50718,44814],{},[36,50720,44817],{},[161,50722,50723,50725,50727],{},[179,50724,4653],{},[179,50726,44809],{},[179,50728,50729,319,50731],{},[36,50730,44828],{},[36,50732,44831],{},[161,50734,50735,50737,50739],{},[179,50736,4650],{},[179,50738,44838],{},[179,50740,50741],{},[36,50742,44843],{},[161,50744,50745,50747,50749],{},[179,50746,4653],{},[179,50748,44838],{},[179,50750,50751],{},[36,50752,44854],{},[161,50754,50755,50757,50759],{},[179,50756,4650],{},[179,50758,44861],{},[179,50760,50761],{},[36,50762,44866],{},[161,50764,50765,50767,50769],{},[179,50766,4653],{},[179,50768,44861],{},[179,50770,50771],{},[36,50772,44877],{},[161,50774,50775,50777,50779],{},[179,50776,4650],{},[179,50778,44884],{},[179,50780,50781],{},[36,50782,44791],{},[161,50784,50785,50787,50789],{},[179,50786,4653],{},[179,50788,44884],{},[179,50790,50791],{},[36,50792,44802],{},[161,50794,50795,50797,50799],{},[179,50796,4650],{},[179,50798,44905],{},[179,50800,50801],{},[36,50802,44843],{},[161,50804,50805,50807,50809],{},[179,50806,4650],{},[179,50808,44916],{},[179,50810,50811,319,50813],{},[36,50812,44921],{},[36,50814,44791],{},[161,50816,50817,50819,50821],{},[179,50818,4653],{},[179,50820,44916],{},[179,50822,50823],{},[36,50824,44802],{},[22,50826,50827,34,50829],{},[31,50828,44940],{},[41,50830,44943],{"href":44943,"rel":50831},[45],[3629,50833,50835],{"id":50834},"_6-create-and-confirm","6. Create and Confirm",[2354,50837,50838,50842],{},[2357,50839,16292,50840],{},[31,50841,21975],{},[2357,50843,50844,50845],{},"Then click ",[31,50846,44960],{},[22,50848,50849],{},[4201,50850],{"alt":5892,"src":50851},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_highlevel_api_key_and_location_id_step_by_step_guide-4.png",[3629,50853,50855],{"id":50854},"_7-copy-api-token","7. Copy API Token",[2354,50857,50858],{},[2357,50859,44971,50860],{},[31,50861,44974],{},[22,50863,50864],{},[4201,50865],{"alt":5892,"src":50866},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_highlevel_api_key_and_location_id_step_by_step_guide-5.png",[2354,50868,50869],{},[2357,50870,44982],{},[22,50872,50873],{},[4201,50874],{"alt":5892,"src":50875},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_highlevel_api_key_and_location_id_step_by_step_guide-6.png",[3629,50877,50879],{"id":50878},"_8-get-location-id","8. Get Location ID",[22,50881,44993,50882,2646],{},[31,50883,44996],{},[22,50885,50886],{},[4201,50887],{"alt":5892,"src":50888},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_highlevel_api_key_and_location_id_step_by_step_guide-7.png",[2354,50890,50891],{},[2357,50892,45004],{},[22,50894,17183],{},[2584,50896,50897],{"className":2649,"code":45009,"language":2651,"meta":2652,"style":2433},[36,50898,50899],{"__ignoreMap":2433},[414,50900,50901],{"class":2593,"line":2594},[414,50902,45009],{},[2354,50904,50905],{},[2357,50906,45018,50907,45022,50909,45025,50911],{},[36,50908,45021],{},[31,50910,44996],{},[36,50912,45028],{},[3629,50914,50916],{"id":50915},"_9-connect-in-unified","9. Connect in Unified",[2354,50918,50919,50924,50928],{},[2357,50920,45036,50921],{},[41,50922,45039],{"href":45039,"rel":50923},[45],[2357,50925,21834,50926],{},[31,50927,45045],{},[2357,50929,16292,50930],{},[31,50931,16295],{},[19,50933],{},[22,50935,50936],{},[4201,50937],{"alt":5892,"src":50938},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_highlevel_api_key_and_location_id_step_by_step_guide-8.png",[3629,50940,50942],{"id":50941},"_10-create-connection","10. Create Connection",[2354,50944,50945,50957],{},[2357,50946,22760,50947],{},[2354,50948,50949,50953],{},[2357,50950,50951],{},[31,50952,44974],{},[2357,50954,50955],{},[31,50956,44996],{},[2357,50958,16292,50959],{},[31,50960,45057],{},[22,50962,50963],{},[4201,50964],{"alt":5892,"src":50965},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_highlevel_api_key_and_location_id_step_by_step_guide-9.png",[55,50967,45077],{"id":45076},[22,50969,45080],{},[19,50971],{},[22,50973,45085],{},[2354,50975,50976,50980,50984],{},[2357,50977,45090,50978],{},[31,50979,45093],{},[2357,50981,45096,50982,45099],{},[31,50983,16739],{},[2357,50985,8879,50986,45104],{},[31,50987,44996],{},[22,50989,45107,50990,45111],{},[41,50991,123],{"href":121,"rel":50992},[45],[22,50994,50995],{},"You've now created your HighLevel API Key and Location ID - just one of many if you support multiple vendors. Each one adds new auth flows, schema differences, and ongoing maintenance.",[22,50997,50998],{},"Unified.to removes that overhead with unified objects that work across 1323 APIs. Map once, launch everywhere. Your team ships features instead of debugging vendor-specific edge cases.",[22,51000,51001,48320],{},[41,51002,41423],{"href":4152,"rel":51003},[45],[4156,51005,5736],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":51007},[51008,51009,51010,51022],{"id":44638,"depth":2434,"text":44639},{"id":2541,"depth":2434,"text":44682},{"id":20910,"depth":2434,"text":44697,"children":51011},[51012,51013,51014,51015,51016,51017,51018,51019,51020,51021],{"id":50611,"depth":2613,"text":50612},{"id":50624,"depth":2613,"text":50625},{"id":50641,"depth":2613,"text":50642},{"id":50656,"depth":2613,"text":50657},{"id":50671,"depth":2613,"text":50672},{"id":50834,"depth":2613,"text":50835},{"id":50854,"depth":2613,"text":50855},{"id":50878,"depth":2613,"text":50879},{"id":50915,"depth":2613,"text":50916},{"id":50941,"depth":2613,"text":50942},{"id":45076,"depth":2434,"text":45077},{"img":51024,"date":50156,"updated":51025,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_highlevel_api_key_and_location_id_step_by_step_guide-icon.png","2026-10-13T18:45:32.214Z","\u002Fguides\u002Fhow_to_get_your_highlevel_api_key_and_location_id_step_by_step_guide",{"title":50539,"description":50553},"guides\u002Fhow_to_get_your_highlevel_api_key_and_location_id_step_by_step_guide","uYfPYQwqPByhY0a9DSIV8nQVQ3N_8-MEIzUwMEvKTMI",{"id":51031,"title":51032,"body":51033,"description":51047,"extension":2452,"meta":51309,"navigation":2459,"path":51313,"seo":51314,"stem":51315,"__hash__":51316},"guides\u002Fguides\u002Fhow_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps.md","How to get your HubSpot developer key and OAuth 2 credentials (Legacy Apps)",{"type":12,"value":51034,"toc":51299},[51035,51038,51040,51045,51048,51053,51057,51060,51077,51081,51084,51108,51112,51115,51127,51132,51183,51190,51196,51215,51219,51239,51243,51285,51287],[15,51036,51032],{"id":51037},"how-to-get-your-hubspot-developer-key-and-oauth-2-credentials-legacy-apps",[19,51039],{},[22,51041,51042],{},[25,51043,51044],{},"February 12, 2023",[22,51046,51047],{},"This guide will show you how to retrieve your OAuth 2 credentials and developer API key in HubSpot.",[22,51049,51050,51052],{},[31,51051,4943],{},": HubSpot allows you to create different types of apps - public and private. This guide is about public apps.",[55,51054,51056],{"id":51055},"register-a-hubspot-developer-account","Register a HubSpot Developer Account",[22,51058,51059],{},"First, you'll need to register for a free account on HubSpot if you haven't already.",[2510,51061,51062,51069,51074],{},[2357,51063,16460,51064,97],{},[41,51065,51068],{"href":51066,"rel":51067},"https:\u002F\u002Fdevelopers.hubspot.com\u002Fget-started",[45],"HubSpot Developers portal",[2357,51070,16292,51071],{},[31,51072,51073],{},"Create App Developer Account.",[2357,51075,51076],{},"Follow the onboarding to complete your account setup.",[55,51078,51080],{"id":51079},"get-your-hubspot-developer-api-key","Get your HubSpot Developer API key",[22,51082,51083],{},"Developer account API keys are separate from standard API keys - they can be used to manage subscriptions for webhooks and other HubSpot features.",[2510,51085,51086,51094,51099,51102],{},[2357,51087,51088,51089,97],{},"Inside the HubSpot developer dashboard, open the sidebar and click ",[41,51090,51093],{"href":51091,"rel":51092},"https:\u002F\u002Fapp.hubspot.com\u002Fdeveloper\u002F47094559\u002Fapplications",[45],"Apps",[2357,51095,16292,51096,97],{},[31,51097,51098],{},"Get HubSpot API key",[2357,51100,51101],{},"Follow the instructions to create a Developer API key.",[2357,51103,16292,51104,51107],{},[31,51105,51106],{},"Show key"," to reveal your key. You will need this for the final step.",[55,51109,51111],{"id":51110},"create-a-hubspot-app","Create a HubSpot app",[22,51113,51114],{},"A HubSpot app is a container for your integration settings and is where you'll create and find your OAuth 2 credentials.",[2510,51116,51117],{},[2357,51118,51119,51120,51123,51124],{},"On the Development page → Legacy Apps→ click ",[31,51121,51122],{},"Create Legacy App →"," Select ",[31,51125,51126],{},"Public App.",[22,51128,51129],{},[4201,51130],{"alt":5892,"src":51131},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps-0.png",[2510,51133,51134,51137,51142,51158,51177],{},[2357,51135,51136],{},"Give your app a name and description.",[2357,51138,28015,51139,45621],{},[31,51140,51141],{},"Auth",[2357,51143,20156,51144,51147,51148,51152,51154],{},[31,51145,51146],{},"Redirect URLs,"," enter: ",[31,51149,51150],{},[36,51151,21741],{},[5888,51153],{},[4201,51155],{"alt":51156,"src":51157},"Screenshot_2024-08-16_at_3.41.50_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps-1.png",[2357,51159,20156,51160,51163,51164,51167,51168,51171,51173],{},[31,51161,51162],{},"Scopes,"," click ",[31,51165,51166],{},"Add new scopes"," and select the permissions that your application will require. For example, if your application reads Deals, then select ",[36,51169,51170],{},"crm.deal.read",[5888,51172],{},[4201,51174],{"alt":51175,"src":51176},"ba5f5e7e-5c03-49b4-8662-75d3a50f4f01.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps-2.png",[2357,51178,16292,51179,51182],{},[31,51180,51181],{},"Create app"," to finish setting up your app.",[55,51184,51186,51187,51189],{"id":51185},"optional-add-the-oauth-scope-to-your-app","(optional) Add the ",[36,51188,36617],{}," scope to your app",[22,51191,51192,51193,51195],{},"For apps created before April 2024, the ",[36,51194,36617],{}," 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.",[2510,51197,51198,51205,51211],{},[2357,51199,20156,51200,22578,51202],{},[31,51201,36554],{},[31,51203,51204],{},"Add new scope.",[2357,51206,51207,51208,51210],{},"Search for ",[31,51209,36617],{}," and select it.",[2357,51212,16292,51213,97],{},[31,51214,6845],{},[55,51216,51218],{"id":51217},"get-your-oauth-2-credentials","Get your OAuth 2 credentials",[2510,51220,51221,51226],{},[2357,51222,51223,51224,45621],{},"After creating your app, you will be redirected to the App Info tab. Click again on the ",[31,51225,51141],{},[2357,51227,51228,51229,51232,51233,51235],{},"Your unique ",[31,51230,51231],{},"Client ID and Client secret"," will be displayed. You will need these for the next step.",[5888,51234],{},[4201,51236],{"alt":51237,"src":51238},"Screenshot_2024-08-16_at_3.52.29_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps-3.png",[55,51240,51242],{"id":51241},"activate-the-hubspot-integration-in-unifiedto-with-your-client-id-and-secret","Activate the HubSpot integration in Unified.to with your client ID and secret",[2510,51244,51245,51253,51273],{},[2357,51246,51247,51248],{},"Open a new tab and navigate to ",[41,51249,51252],{"href":51250,"rel":51251},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fhubspot",[45],"the HubSpot integration in Unified.to",[2357,51254,51255,51256],{},"You will need the following three pieces of information from the earlier steps:",[2510,51257,51258,51262,51267],{},[2357,51259,51260],{},[31,51261,4491],{},[2357,51263,51264],{},[31,51265,51266],{},"Client secret",[2357,51268,51269,51272],{},[31,51270,51271],{},"Developer API key"," from the developer dashboard",[2357,51274,51275,51276,51278,51279,51281],{},"Copy and paste these values into their respective fields on the page. Make sure that ",[31,51277,49717],{}," is selected above.",[5888,51280],{},[4201,51282],{"alt":51283,"src":51284},"Screenshot_2024-08-16_at_4.19.04_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps-4.png",[55,51286,37023],{"id":37022},[2354,51288,51289,51294],{},[2357,51290,51291],{},[41,51292,37045],{"href":37043,"rel":51293},[45],[2357,51295,51296],{},[41,51297,36393],{"href":46475,"rel":51298},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":51300},[51301,51302,51303,51304,51306,51307,51308],{"id":51055,"depth":2434,"text":51056},{"id":51079,"depth":2434,"text":51080},{"id":51110,"depth":2434,"text":51111},{"id":51185,"depth":2434,"text":51305},"(optional) Add the oauth scope to your app",{"id":51217,"depth":2434,"text":51218},{"id":51241,"depth":2434,"text":51242},{"id":37022,"depth":2434,"text":37023},{"img":51310,"date":51311,"updated":51312,"tag":2457,"integrations":37069},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps-icon.png","2023-02-12T00:00:00.000Z","2026-08-23T14:54:18.520Z","\u002Fguides\u002Fhow_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps",{"title":51032,"description":51047},"guides\u002Fhow_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps","_WR0qVKEGWC0qzpkWZQ5Nh8ygP5rWGv5d5bKJNILEWk",{"id":51318,"title":51319,"body":51320,"description":51334,"extension":2452,"meta":51386,"navigation":2459,"path":51390,"seo":51391,"stem":51392,"__hash__":51393},"guides\u002Fguides\u002Fhow_to_get_your_humaans_api_key_step_by_step_guide.md","How to get your Humaans API Key: Step-by-step guide",{"type":12,"value":51321,"toc":51384},[51322,51325,51327,51332,51335,51338,51364,51373,51376,51379],[15,51323,51319],{"id":51324},"how-to-get-your-humaans-api-key-step-by-step-guide",[19,51326],{},[22,51328,51329],{},[25,51330,51331],{},"November 14, 2023",[22,51333,51334],{},"When connecting Humaans to other platforms, authentication requires an API Key.",[22,51336,51337],{},"Follow these step-by-step instructions to generate one from your Humaans account, or provide them to your customers if they need to connect their account.",[2510,51339,51340,51343,51346,51349,51352,51355,51358,51361],{},[2357,51341,51342],{},"Log in to the Humaans Admin Dashboard",[2357,51344,51345],{},"Go to Settings",[2357,51347,51348],{},"Open API access tokens",[2357,51350,51351],{},"Click Create new token",[2357,51353,51354],{},"Give it a name (e.g. \"Unified.to\")",[2357,51356,51357],{},"Copy the generated token",[2357,51359,51360],{},"Paste it into the API Token field",[2357,51362,51363],{},"Click Authorize",[22,51365,51366,51368,51369,51372],{},[31,51367,22779],{}," You'll need ",[31,51370,51371],{},"Admin access"," in Humaans to see \"API access tokens.\"",[22,51374,51375],{},"You've now retrieved your Humaans API Key. That's one system covered, but scaling integrations one by one means repeating this process hundreds of times.",[22,51377,51378],{},"Unified.to handles this for you: 1659 integrations out of the box, all with normalized schemas, real-time delivery, and Virtual Webhooks. No polling scripts, no retry logic, no maintenance backlog.",[22,51380,51381,49239],{},[41,51382,41423],{"href":4152,"rel":51383},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":51385},[],{"img":51387,"date":51388,"updated":51389,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_humaans_api_key_step_by_step_guide-icon.png","2023-11-14T18:49:00.000Z","2026-10-22T23:11:42.709Z","\u002Fguides\u002Fhow_to_get_your_humaans_api_key_step_by_step_guide",{"title":51319,"description":51334},"guides\u002Fhow_to_get_your_humaans_api_key_step_by_step_guide","y4IbFDg_TpGA3kSKZhO6aIGQtMNvIPXrl5Tsh4aa1mQ",{"id":51395,"title":51396,"body":51397,"description":51410,"extension":2452,"meta":51528,"navigation":2459,"path":51531,"seo":51532,"stem":51533,"__hash__":51534},"guides\u002Fguides\u002Fhow_to_get_your_icims_api_username_api_password_and_customer_id_step_by_step_guide.md","How to get your iCIMS API Username, API Password and Customer ID: Step-by-step guide",{"type":12,"value":51398,"toc":51519},[51399,51402,51404,51408,51411,51414,51418,51421,51425,51428,51439,51443,51447,51467,51471,51474,51483,51487,51495,51498,51506,51509,51512,51514],[15,51400,51396],{"id":51401},"how-to-get-your-icims-api-username-api-password-and-customer-id-step-by-step-guide",[19,51403],{},[22,51405,51406],{},[25,51407,48348],{},[22,51409,51410],{},"When connecting iCIMS to other platforms, authentication requires a API Username, API Password and Customer ID.",[22,51412,51413],{},"Follow these step-by-step instructions to generate one from your iCIMS account, or provide them to your customers if they need to connect their account.",[15,51415,51417],{"id":51416},"how-to-get-your-icims-api-credentials","How to get your iCIMS API credentials",[22,51419,51420],{},"This guide explains how to obtain the required credentials for connecting iCIMS. You'll need to work with iCIMS support to get these credentials.",[55,51422,51424],{"id":51423},"required-credentials","Required credentials",[22,51426,51427],{},"To connect iCIMS, you'll need:",[2354,51429,51430,51433,51436],{},[2357,51431,51432],{},"Customer ID (your unique platform identifier)",[2357,51434,51435],{},"API Username",[2357,51437,51438],{},"API Password",[55,51440,51442],{"id":51441},"steps-to-obtain-your-credentials","Steps to obtain your credentials",[3629,51444,51446],{"id":51445},"step-1-contact-icims-support","Step 1: Contact iCIMS support",[2510,51448,51449,51452,51455],{},[2357,51450,51451],{},"Reach out to your iCIMS account representative or support team",[2357,51453,51454],{},"Request API access for integration purposes",[2357,51456,51457,51458],{},"Specify that you need:\n",[2354,51459,51460,51463,51465],{},[2357,51461,51462],{},"Customer ID",[2357,51464,51435],{},[2357,51466,51438],{},[3629,51468,51470],{"id":51469},"step-2-receive-your-credentials","Step 2: Receive your credentials",[22,51472,51473],{},"iCIMS support will provide you with:",[2354,51475,51476,51479,51481],{},[2357,51477,51478],{},"Your unique Customer ID",[2357,51480,51435],{},[2357,51482,51438],{},[3629,51484,51486],{"id":51485},"step-3-verify-access","Step 3: Verify access",[2510,51488,51489,51492],{},[2357,51490,51491],{},"Once you receive your credentials, keep them in a secure location",[2357,51493,51494],{},"Enter the credentials in the inputs on this page to create a connection to your iCIMS account",[55,51496,51497],{"id":8197},"Important notes",[2354,51499,51500,51503],{},[2357,51501,51502],{},"These credentials must be provided by iCIMS support",[2357,51504,51505],{},"The Customer ID is unique to your organization",[22,51507,51508],{},"Getting your iCIMS API Username, API Password and Customer ID is the first step. The bigger challenge is supporting dozens of vendors - each with unique auth flows, schemas, and maintenance requirements.",[22,51510,51511],{},"Unified.to is a real-time integration platform built to replace that work. Instead of building and maintaining 514 custom connectors, you get one secure, normalized API layer across 30 SaaS tools.",[22,51513,49021],{},[22,51515,51516,49027],{},[41,51517,41423],{"href":4152,"rel":51518},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":51520},[51521,51522,51527],{"id":51423,"depth":2434,"text":51424},{"id":51441,"depth":2434,"text":51442,"children":51523},[51524,51525,51526],{"id":51445,"depth":2613,"text":51446},{"id":51469,"depth":2613,"text":51470},{"id":51485,"depth":2613,"text":51486},{"id":8197,"depth":2434,"text":51497},{"img":51529,"date":50156,"updated":51530,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_icims_api_username_api_password_and_customer_id_step_by_step_guide-icon.png","2026-07-02T13:18:24.091Z","\u002Fguides\u002Fhow_to_get_your_icims_api_username_api_password_and_customer_id_step_by_step_guide",{"title":51396,"description":51410},"guides\u002Fhow_to_get_your_icims_api_username_api_password_and_customer_id_step_by_step_guide","-VjhLHILi9-AVKYYHF7iIO20upW0njgEGVfyxNq_3x8",{"id":51536,"title":51537,"body":51538,"description":51595,"extension":2452,"meta":51596,"navigation":2459,"path":51600,"seo":51601,"stem":51602,"__hash__":51603},"guides\u002Fguides\u002Fhow_to_get_your_jobdiva_client_id_username_email_and_password_step_by_step_guide.md","How to get your JobDiva Client ID, Username\u002Femail and Password: Step-by-step guide",{"type":12,"value":51539,"toc":51593},[51540,51543,51545,51549,51552,51555,51559,51562,51566,51569,51572,51583,51586,51588],[15,51541,51537],{"id":51542},"how-to-get-your-jobdiva-client-id-usernameemail-and-password-step-by-step-guide",[19,51544],{},[22,51546,51547],{},[25,51548,49052],{},[22,51550,51551],{},"If you're building an integration with JobDiva, you'll need an Client ID, Username\u002Femail and Password from your customer's JobDiva account to authenticate requests.",[22,51553,51554],{},"This guide shows you (or your customers) how to generate one from JobDiva's account settings.",[15,51556,51558],{"id":51557},"obtain-a-jobdiva-client-id","Obtain a JobDiva Client ID",[22,51560,51561],{},"Contact JobDiva Support to obtain a Client ID to use for your integration.",[15,51563,51565],{"id":51564},"create-a-jobdiva-api-user","Create a JobDiva API User",[22,51567,51568],{},"A JobDiva admin must establish a dedicated API username and password.",[22,51570,51571],{},"In JobDiva:",[2510,51573,51574,51577,51580],{},[2357,51575,51576],{},"Navigate to Settings > My Team > Add User.",[2357,51578,51579],{},"Add a new user.",[2357,51581,51582],{},"Allow to access JobDiva API Calls permission for the user.",[22,51584,51585],{},"With your JobDiva Client ID, Username\u002Femail and Password in hand, you're ready to connect. But managing keys, tokens, and refresh flows across every vendor quickly becomes a security risk.",[22,51587,48597],{},[22,51589,51590,48603],{},[41,51591,41423],{"href":4152,"rel":51592},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":51594},[],"If you're building an integration with JobDiva, you'll need an Client ID, Username\u002Femail and Password from your customer's JobDiva account to authenticate...",{"img":51597,"date":51598,"updated":51599,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_jobdiva_client_id_username_email_and_password_step_by_step_guide-icon.png","2023-08-18T15:07:00.000Z","2026-07-28T15:49:36.946Z","\u002Fguides\u002Fhow_to_get_your_jobdiva_client_id_username_email_and_password_step_by_step_guide",{"title":51537,"description":51595},"guides\u002Fhow_to_get_your_jobdiva_client_id_username_email_and_password_step_by_step_guide","fBEwqNoqK2hgmzhGcG7ii_twaKkXPSiZZIu5FVuwNHo",{"id":51605,"title":51606,"body":51607,"description":51620,"extension":2452,"meta":51723,"navigation":2459,"path":51727,"seo":51728,"stem":51729,"__hash__":51730},"guides\u002Fguides\u002Fhow_to_get_your_jobvite_api_key_api_key_secret_and_email_step_by_step_guide.md","How to get your Jobvite API Key, API Key Secret and Email: Step-by-step guide",{"type":12,"value":51608,"toc":51718},[51609,51612,51614,51618,51621,51623,51627,51634,51641,51645,51683,51686,51689,51697,51701,51704,51707,51710,51713],[15,51610,51606],{"id":51611},"how-to-get-your-jobvite-api-key-api-key-secret-and-email-step-by-step-guide",[19,51613],{},[22,51615,51616],{},[25,51617,49052],{},[22,51619,51620],{},"To access Jobvite data or automate workflows through an integration, a API Key, API Key Secret and Email are required.",[22,51622,49058],{},[55,51624,51626],{"id":51625},"how-do-i-get-my-jobvite-api-key-and-secret","How do I get my Jobvite API key and secret?",[22,51628,51629,51630],{},"Your API key and secret are both provided by Jobvite's Customer Success team. To request API credentials, file a support ticket at:\n",[41,51631,51632],{"href":51632,"rel":51633},"https:\u002F\u002Fwww.jobvite.com\u002Fsupport\u002Fsubmit-a-case\u002F",[45],[22,51635,51636,51637,51640],{},"(Note: you will need to be logged in to submit a case. If you don't see a button titled ",[31,51638,51639],{},"Submit a Request",", reach out to your account representative i.e. your Customer Success Manager or Account Manager)",[3629,51642,51644],{"id":51643},"submit-a-ticket","Submit a ticket",[2354,51646,51647,51654,51659],{},[2357,51648,51649,51650,51653],{},"Select the ",[31,51651,51652],{},"issue type"," from the dropdown menu",[2357,51655,51656,51657],{},"Add a ",[31,51658,7799],{},[2357,51660,51661,51662,51664,51665],{},"Add a detailed ",[31,51663,27096],{}," of the request:\n",[2354,51666,51667,51673],{},[2357,51668,51669,51672],{},[31,51670,51671],{},"API names"," that you want to grant access to",[2357,51674,51675,51678,51679,51682],{},[31,51676,51677],{},"Email"," of a dedicated Jobvite user to determine that an update was made by the API and not an actual user. This email address needs to accept the Jobvite registration process. Assign the ",[31,51680,51681],{},"Administrator"," role to this user.",[22,51684,51685],{},"Alternatively, you may start a support chat (see bottom right corner of Help Center) to chat with their support team for guidance on retrieving an API Key.",[22,51687,51688],{},"Please make sure that Jobvite gives you access to:",[2354,51690,51691,51694],{},[2357,51692,51693],{},"New User module",[2357,51695,51696],{},"Enable New Contact Details UI",[22,51698,51699],{},[31,51700,5952],{},[22,51702,51703],{},"Please note that access to the Contacts API requires that the Jobvite Customer has enabled the Jobvite Engage product on their account. The contacts API is not supported for customers who have not enabled the Jobvite Engage product (additional fee required).",[22,51705,51706],{},"JobVite Contacts are required for access to Candidates.",[22,51708,51709],{},"You've now retrieved your Jobvite API Key, API Key Secret and Email. That's one system covered, but scaling integrations one by one means repeating this process hundreds of times.",[22,51711,51712],{},"Unified.to handles this for you: 805 integrations out of the box, all with normalized schemas, real-time delivery, and Virtual Webhooks. No polling scripts, no retry logic, no maintenance backlog.",[22,51714,51715,49239],{},[41,51716,41423],{"href":4152,"rel":51717},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":51719},[51720],{"id":51625,"depth":2434,"text":51626,"children":51721},[51722],{"id":51643,"depth":2613,"text":51644},{"img":51724,"date":51725,"updated":51726,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_jobvite_api_key_api_key_secret_and_email_step_by_step_guide-icon.png","2023-08-18T15:04:00.000Z","2026-08-25T14:47:12.148Z","\u002Fguides\u002Fhow_to_get_your_jobvite_api_key_api_key_secret_and_email_step_by_step_guide",{"title":51606,"description":51620},"guides\u002Fhow_to_get_your_jobvite_api_key_api_key_secret_and_email_step_by_step_guide","IO5WEkNl42yG2GVZH0ijqTRE2eFA6cKBYf_I36zW6vw",{"id":51732,"title":51733,"body":51734,"description":51747,"extension":2452,"meta":51799,"navigation":2459,"path":51803,"seo":51804,"stem":51805,"__hash__":51806},"guides\u002Fguides\u002Fhow_to_get_your_lever_api_key_step_by_step_guide.md","How to get your Lever API Key: Step-by-step guide",{"type":12,"value":51735,"toc":51797},[51736,51739,51741,51745,51748,51751,51786,51789,51791],[15,51737,51733],{"id":51738},"how-to-get-your-lever-api-key-step-by-step-guide",[19,51740],{},[22,51742,51743],{},[25,51744,48348],{},[22,51746,51747],{},"When connecting Lever to other platforms, authentication requires an API Key.",[22,51749,51750],{},"Follow these step-by-step instructions to generate one from your Lever account, or provide them to your customers if they need to connect their account.",[2510,51752,51753,51756,51764,51767,51775,51783],{},[2357,51754,51755],{},"To generate API credentials, navigate to Settings > Integrations and API > API Credentials.",[2357,51757,51758,51759,51761],{},"Click the Generate New Key button",[5888,51760],{},[4201,51762],{"alt":48646,"src":51763},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_lever_api_key_step_by_step_guide-0.png",[2357,51765,51766],{},"Input a name for the key that reflects the service or integration that will be using the key",[2357,51768,51769,51770,51772],{},"Under the 'Permissions' heading, select \"Select all\"",[5888,51771],{},[4201,51773],{"alt":20627,"src":51774},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_lever_api_key_step_by_step_guide-1.png",[2357,51776,51777,51778,51780],{},"Click the Copy Key button next to the API key (which can be found next to the 'Key name' field).",[5888,51779],{},[4201,51781],{"alt":48646,"src":51782},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_lever_api_key_step_by_step_guide-2.png",[2357,51784,51785],{},"Click done",[22,51787,51788],{},"Generating a Lever API Key is the first step. The harder part is building pipelines that stay reliable as customers add more systems.",[22,51790,48466],{},[22,51792,51793,51796],{},[41,51794,41423],{"href":4152,"rel":51795},[45]," to see how we simplify integration delivery across 1412 integrations and 37 categories.",{"title":2433,"searchDepth":2434,"depth":2434,"links":51798},[],{"img":51800,"date":51801,"updated":51802,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_lever_api_key_step_by_step_guide-icon.png","2023-04-24T19:42:00.000Z","2026-10-16T14:41:44.139Z","\u002Fguides\u002Fhow_to_get_your_lever_api_key_step_by_step_guide",{"title":51733,"description":51747},"guides\u002Fhow_to_get_your_lever_api_key_step_by_step_guide","hNFcfoJkSl3wyBrXLffzqOErsYcjxI0l58y-gsfV9yQ",{"id":51808,"title":51809,"body":51810,"description":51823,"extension":2452,"meta":51901,"navigation":2459,"path":51905,"seo":51906,"stem":51907,"__hash__":51908},"guides\u002Fguides\u002Fhow_to_get_your_loxo_agency_slug_api_key_and_agency_id_step_by_step_guide.md","How to get your Loxo Agency slug, API Key and Agency ID: Step-by-step guide",{"type":12,"value":51811,"toc":51897},[51812,51815,51817,51821,51824,51827,51831,51834,51840,51843,51849,51852,51858,51862,51865,51871,51874,51886,51889,51892],[15,51813,51809],{"id":51814},"how-to-get-your-loxo-agency-slug-api-key-and-agency-id-step-by-step-guide",[19,51816],{},[22,51818,51819],{},[25,51820,49052],{},[22,51822,51823],{},"If you're building an integration with Loxo, you'll need an Agency slug, API Key and Agency ID from your customer's Loxo account to authenticate requests.",[22,51825,51826],{},"This guide shows you (or your customers) how to generate one from Loxo's account settings.",[3629,51828,51830],{"id":51829},"where-do-i-find-my-api-key","Where do I find my API Key?",[22,51832,51833],{},"To get your API Key, we'll need to go to Loxo. Once there, click on your profile icon and then Settings.",[22,51835,51836],{},[4201,51837],{"alt":51838,"src":51839},"Loxo-Settings-1024x565.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_loxo_agency_slug_api_key_and_agency_id_step_by_step_guide-0.png",[22,51841,51842],{},"In the Settings view, look for the API Keys card and click on it.",[22,51844,51845],{},[4201,51846],{"alt":51847,"src":51848},"Loxo-Settings-API-1024x577.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_loxo_agency_slug_api_key_and_agency_id_step_by_step_guide-1.png",[22,51850,51851],{},"In the API Keys view, click the Add button.",[22,51853,51854],{},[4201,51855],{"alt":51856,"src":51857},"Loxo-Settings-API-Key-1024x571.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_loxo_agency_slug_api_key_and_agency_id_step_by_step_guide-2.png",[3629,51859,51861],{"id":51860},"how-can-i-get-my-agency-slug","How can I get my Agency Slug?",[22,51863,51864],{},"To get your agency slug, navigate to your agency's career page. You can find it under your profile's menu.",[22,51866,51867],{},[4201,51868],{"alt":51869,"src":51870},"Loxo-Career-Page-1024x570.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_loxo_agency_slug_api_key_and_agency_id_step_by_step_guide-3.png",[22,51872,51873],{},"On the Careers page, your agency slug will be the first part of the path, after the domain.",[22,51875,51876,51878,51879,51882,51883],{},[31,51877,17799],{},": ",[36,51880,51881],{},"https:\u002F\u002Fapp.loxo.co\u002Fweblime-consultants"," = ",[25,51884,51885],{},"weblime-consultants",[22,51887,51888],{},"You've now retrieved your Loxo Agency slug, API Key and Agency ID. That's one system covered, but scaling integrations one by one means repeating this process hundreds of times.",[22,51890,51891],{},"Unified.to handles this for you: 1319 integrations out of the box, all with normalized schemas, real-time delivery, and Virtual Webhooks. No polling scripts, no retry logic, no maintenance backlog.",[22,51893,51894,49239],{},[41,51895,41423],{"href":4152,"rel":51896},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":51898},[51899,51900],{"id":51829,"depth":2613,"text":51830},{"id":51860,"depth":2613,"text":51861},{"img":51902,"date":51903,"updated":51904,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_loxo_agency_slug_api_key_and_agency_id_step_by_step_guide-icon.png","2023-08-18T15:03:00.000Z","2026-10-13T14:44:12.962Z","\u002Fguides\u002Fhow_to_get_your_loxo_agency_slug_api_key_and_agency_id_step_by_step_guide",{"title":51809,"description":51823},"guides\u002Fhow_to_get_your_loxo_agency_slug_api_key_and_agency_id_step_by_step_guide","2SvJKnWAmsTITG7yqfAbLAkRzJkdbnAsqDzOBqkKbEg",{"id":51910,"title":51911,"body":51912,"description":51925,"extension":2452,"meta":52212,"navigation":2459,"path":52216,"seo":52217,"stem":52218,"__hash__":52219},"guides\u002Fguides\u002Fhow_to_get_your_microsoft_active_directory_entra_id_client_id_client_secret_and_tenant_id_step_by_step_guide.md","How to get your Microsoft Active Directory \u002F Entra ID Client ID, Client Secret and Tenant ID: Step-by-step guide",{"type":12,"value":51913,"toc":52205},[51914,51917,51919,51923,51926,51929,51933,51939,51942,52003,52009,52023,52029,52033,52042,52048,52051,52057,52066,52073,52076,52100,52106,52112,52118,52130,52136,52182,52186,52189,52195,52198,52200],[15,51915,51911],{"id":51916},"how-to-get-your-microsoft-active-directory-entra-id-client-id-client-secret-and-tenant-id-step-by-step-guide",[19,51918],{},[22,51920,51921],{},[25,51922,48348],{},[22,51924,51925],{},"Developers connecting to Microsoft Active Directory \u002F Entra ID will need an Client ID, Client Secret and Tenant ID for authentication.",[22,51927,51928],{},"Here's how to generate, configure, and copy your Microsoft Active Directory \u002F Entra ID Client ID, Client Secret and Tenant ID so you can use it in your integration or share steps with your customers.",[15,51930,51932],{"id":51931},"microsoft-adentra-id-client-id-and-secret-authentication","Microsoft AD\u002FEntra ID Client ID and Secret Authentication",[55,51934,51936],{"id":51935},"step-1-register-an-application",[31,51937,51938],{},"Step: 1 Register an application",[22,51940,51941],{},"Registering your application establishes a trust relationship between the 3rd-party application and the Microsoft identity platform. The trust is unidirectional: the application trusts the Microsoft identity platform, and not the other way around. Once created, the application object can't be moved between different tenants.",[2510,51943,51944,51951,51961,51977,51984,51991],{},[2357,51945,43551,51946,97],{},[41,51947,51950],{"href":51948,"rel":51949},"https:\u002F\u002Fentra.microsoft.com\u002F",[45],"Microsoft Entra admin center",[2357,51952,51953,51954,51956,51957,51960],{},"If you have access to multiple tenants, use the ",[31,51955,36643],{}," icon in the top menu to switch to the tenant in which you want to register the application from the ",[31,51958,51959],{},"Directories + subscriptions"," menu.",[2357,51962,51963,51964,51967,51968,51967,51970,51973,51974,97],{},"Browse to ",[31,51965,51966],{},"Identity"," > ",[31,51969,47930],{},[31,51971,51972],{},"App registrations"," and select ",[31,51975,51976],{},"New registration",[2357,51978,51979,51980,51983],{},"Enter a display ",[31,51981,51982],{},"Name"," for the application.",[2357,51985,51986,51987,51990],{},"Specify who can use the application in the ",[31,51988,51989],{},"Supported account types"," section",[2357,51992,5187,51993,51996,51997,51999],{},[31,51994,51995],{},"Register"," to complete the initial app registration.",[5888,51998],{},[4201,52000],{"alt":52001,"src":52002},"portal-02-app-reg-01.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_microsoft_active_directory_entra_id_client_id_client_secret_and_tenant_id_step_by_step_guide-0.png",[22,52004,52005,52006,52008],{},"When registration finishes, the Microsoft Entra admin center displays the app registration's ",[31,52007,4426],{}," pane. On this page, the app was assigned values for:",[2354,52010,52011,52017],{},[2357,52012,52013,52016],{},[31,52014,52015],{},"Application (client) ID"," which uniquely identifies your application in the Microsoft cloud ecosystem, across all tenants.",[2357,52018,52019,52022],{},[31,52020,52021],{},"Object ID"," which uniquely identifies your application in your tenant.",[22,52024,52025],{},[4201,52026],{"alt":52027,"src":52028},"portal-03-app-reg-02.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_microsoft_active_directory_entra_id_client_id_client_secret_and_tenant_id_step_by_step_guide-1.png",[55,52030,52032],{"id":52031},"step-2-generate-client-secret","Step 2: Generate Client Secret",[22,52034,52035,52036,52041],{},"Credentials are used by ",[41,52037,52040],{"href":52038,"rel":52039},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fentra\u002Fidentity-platform\u002Fmsal-client-applications",[45],"confidential client applications"," that access a web API. Examples of confidential clients are web apps, other web APIs, or service-type and daemon-type applications. Credentials allow your application to authenticate as itself, requiring no interaction from a user at runtime.",[22,52043,52044],{},[4201,52045],{"alt":52046,"src":52047},"portal-05-app-reg-04-credentials.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_microsoft_active_directory_entra_id_client_id_client_secret_and_tenant_id_step_by_step_guide-2.png",[22,52049,52050],{},"For this case, go to the Client Secrets tab, to generate a new Client Secret. The generated secret's value will be the one that will be used in Unified's authentication process.",[55,52052,52054],{"id":52053},"step-3-configure-permissions-for-microsoft-graph",[31,52055,52056],{},"Step 3: Configure permissions for Microsoft Graph",[22,52058,52059,52060,52065],{},"Microsoft Graph exposes ",[41,52061,52064],{"href":52062,"rel":52063},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fgraph\u002Fpermissions-overview#application-permissions",[45],"application permissions"," for apps that call Microsoft Graph with their own identity. These permissions always require administrator consent.",[22,52067,52068,52069,52072],{},"Preconfigure the application permissions the app needs when you register the app. An administrator can consent to these permissions either by using the ",[41,52070,51950],{"href":51948,"rel":52071},[45]," when they install the app in their organization, or you can provide a sign-up experience in the app through which administrators can consent to the permissions you configured. Once Microsoft Entra ID records the administrator consent, the app can request tokens without having to request consent again.",[22,52074,52075],{},"To configure application permissions for the app in the app registrations experience on the Microsoft Entra admin center, follow these steps:",[2354,52077,52078,52087,52094],{},[2357,52079,52080,52081,52084,52085,97],{},"On the application's ",[31,52082,52083],{},"API permissions"," page, choose ",[31,52086,22581],{},[2357,52088,5187,52089,52091,52092,97],{},[31,52090,22585],{}," > select ",[31,52093,22599],{},[2357,52095,49948,52096,52099],{},[31,52097,52098],{},"Select Permissions"," dialog, choose the permissions to configure to the app.",[22,52101,52102,52103,52105],{},"The following screenshot shows the ",[31,52104,52098],{}," dialog box for Microsoft Graph application permissions.",[22,52107,52108],{},[4201,52109],{"alt":52110,"src":52111},"Screenshot_2025-09-18_at_11.37.04_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_microsoft_active_directory_entra_id_client_id_client_secret_and_tenant_id_step_by_step_guide-3.png",[55,52113,52115],{"id":52114},"step-4-grant-tenant-wide-admin-consent-in-enterprise-apps-pane",[31,52116,52117],{},"Step 4: Grant tenant-wide admin consent in Enterprise apps pane",[22,52119,52120,52121,52124,52125,97],{},"You can grant tenant-wide admin consent through the ",[31,52122,52123],{},"Enterprise applications"," pane if the application is already provisioned in your tenant. For example, an app could be provisioned in your tenant if at least one user consents to the application. For more information, see ",[41,52126,52129],{"href":52127,"rel":52128},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fentra\u002Fidentity-platform\u002Fhow-applications-are-added",[45],"How and why applications are added to Microsoft Entra ID",[22,52131,52132,52133,52135],{},"To grant tenant-wide admin consent to an app listed in ",[31,52134,52123],{}," pane:",[2510,52137,52138,52149,52158,52161,52176],{},[2357,52139,43551,52140,52143,52144,97],{},[41,52141,51950],{"href":51948,"rel":52142},[45]," as at least a ",[41,52145,52148],{"href":52146,"rel":52147},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fentra\u002Fidentity\u002Frole-based-access-control\u002Fpermissions-reference#cloud-application-administrator",[45],"Cloud Application Administrator",[2357,52150,51963,52151,51967,52153,51967,52156,97],{},[31,52152,47818],{},[31,52154,52155],{},"Enterprise apps",[31,52157,47941],{},[2357,52159,52160],{},"Enter the name of the existing application in the search box, and then select the application from the search results.",[2357,52162,5187,52163,52166,52167,97,52170,52172],{},[31,52164,52165],{},"Permissions"," under ",[31,52168,52169],{},"Security",[5888,52171],{},[4201,52173],{"alt":52174,"src":52175},"grant-tenant-wide-admin-consent.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_microsoft_active_directory_entra_id_client_id_client_secret_and_tenant_id_step_by_step_guide-4.png",[2357,52177,52178,52179,97],{},"Carefully review the permissions that the application requires. If you agree with the permissions the application requires, select ",[31,52180,52181],{},"Grant admin consent",[55,52183,52185],{"id":52184},"step-5-setup-authentication-in-unified","Step 5: Setup Authentication in Unified",[22,52187,52188],{},"Setup the Authentication credentials in Unified using the client ID, and generated secret, along with the tenant ID",[22,52190,52191],{},[4201,52192],{"alt":52193,"src":52194},"Screenshot_2025-09-18_at_12.09.32_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_microsoft_active_directory_entra_id_client_id_client_secret_and_tenant_id_step_by_step_guide-5.png",[22,52196,52197],{},"You've now created your Microsoft Active Directory \u002F Entra ID Client ID, Client Secret and Tenant ID - just one of many if you support multiple vendors. Each one adds new auth flows, schema differences, and ongoing maintenance.",[22,52199,49114],{},[22,52201,52202,48320],{},[41,52203,41423],{"href":4152,"rel":52204},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":52206},[52207,52208,52209,52210,52211],{"id":51935,"depth":2434,"text":51938},{"id":52031,"depth":2434,"text":52032},{"id":52053,"depth":2434,"text":52056},{"id":52114,"depth":2434,"text":52117},{"id":52184,"depth":2434,"text":52185},{"img":52213,"date":52214,"updated":52215,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_microsoft_active_directory_entra_id_client_id_client_secret_and_tenant_id_step_by_step_guide-icon.png","2023-04-24T19:43:00.000Z","2026-07-02T14:17:21.341Z","\u002Fguides\u002Fhow_to_get_your_microsoft_active_directory_entra_id_client_id_client_secret_and_tenant_id_step_by_step_guide",{"title":51911,"description":51925},"guides\u002Fhow_to_get_your_microsoft_active_directory_entra_id_client_id_client_secret_and_tenant_id_step_by_step_guide","p_xDi-Xum0n0I10ZW3xft9ydiwHMxG8g7O2FE_x9bko",{"id":52221,"title":52222,"body":52223,"description":52430,"extension":2452,"meta":52431,"navigation":2459,"path":52436,"seo":52437,"stem":52438,"__hash__":52439},"guides\u002Fguides\u002Fhow_to_get_your_microsoft_azure_ad_oauth_2_credentials.md","How to get your Microsoft Azure AD OAuth 2 credentials",{"type":12,"value":52224,"toc":52424},[52225,52228,52230,52235,52238,52242,52310,52314,52376,52380,52414,52416,52421],[15,52226,52222],{"id":52227},"how-to-get-your-microsoft-azure-ad-oauth-2-credentials",[19,52229],{},[22,52231,52232],{},[25,52233,52234],{},"June 3, 2024",[22,52236,52237],{},"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 in the Microsoft Azure ecosystem e.g. Outlook, Teams, and Dynamics.",[55,52239,52241],{"id":52240},"register-an-app-in-microsoft-azure-portal","Register an app in Microsoft Azure Portal",[2510,52243,52244,52251,52262,52276],{},[2357,52245,7120,52246],{},[41,52247,52250],{"href":52248,"rel":52249},"https:\u002F\u002Fportal.azure.com\u002F",[45],"Microsoft Azure Portal",[2357,52252,51207,52253,51210,52256,52258],{},[31,52254,52255],{},"Azure Active Directory",[5888,52257],{},[4201,52259],{"alt":52260,"src":52261},"oidc-microsoft-1.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_microsoft_azure_ad_oauth_2_credentials-0.png",[2357,52263,52264,52265,36644,52267,52270,52272],{},"From the sidebar, under Manage, click ",[31,52266,51972],{},[31,52268,52269],{},"New registration.",[5888,52271],{},[4201,52273],{"alt":52274,"src":52275},"oidc-microsoft-2.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_microsoft_azure_ad_oauth_2_credentials-1.png",[2357,52277,52278,52279,52304,52306],{},"Fill in the following form to register a new app:",[2510,52280,52281,52284,52290,52300],{},[2357,52282,52283],{},"Enter any name you'd like for your app.",[2357,52285,5187,52286,52289],{},[31,52287,52288],{},"Accounts in any organizational directory (Any Azure AD directory - Multitenant) and personal Microsoft accounts (e.g. Skype, Xbox)"," to allow anyone to log in.",[2357,52291,20156,52292,52294,52295],{},[31,52293,4497],{},", enter ",[41,52296,52298],{"href":21741,"rel":52297},[45],[36,52299,21741],{},[2357,52301,16292,52302,97],{},[31,52303,51995],{},[5888,52305],{},[4201,52307],{"alt":52308,"src":52309},"oidc-microsoft-3.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_microsoft_azure_ad_oauth_2_credentials-2.png",[55,52311,52313],{"id":52312},"get-your-client-id-and-client-secret","Get your client ID and client secret",[2510,52315,52316,52324,52339,52354,52365],{},[2357,52317,52318,52319,52321,52322,2980],{},"After registering your app and on the resulting page, copy the ",[31,52320,4491],{}," (found next to ",[31,52323,52015],{},[2357,52325,48544,52326,52329,52330,52333,52335],{},[31,52327,52328],{},"Add a certificate or secret"," (found next to ",[31,52331,52332],{},"Client credentials)",[5888,52334],{},[4201,52336],{"alt":52337,"src":52338},"oidc-microsoft-4.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_microsoft_azure_ad_oauth_2_credentials-3.png",[2357,52340,6235,52341,52344,52345,97,52348,52350],{},[31,52342,52343],{},"Client secrets (0)",", click ",[31,52346,52347],{},"New client secret",[5888,52349],{},[4201,52351],{"alt":52352,"src":52353},"oidc-microsoft-5.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_microsoft_azure_ad_oauth_2_credentials-4.png",[2357,52355,16292,52356,52358,52359,52361],{},[31,52357,47868],{}," - do not change anything else in the dialog.",[5888,52360],{},[4201,52362],{"alt":52363,"src":52364},"oidc-microsoft-6.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_microsoft_azure_ad_oauth_2_credentials-5.png",[2357,52366,52367,52368,52370,52372],{},"On the next page, copy the ",[31,52369,5247],{},[5888,52371],{},[4201,52373],{"alt":52374,"src":52375},"oidc-microsoft-7.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_microsoft_azure_ad_oauth_2_credentials-6.png",[55,52377,52379],{"id":52378},"enter-your-oauth-credentials-on-unifiedto","Enter your OAuth credentials on Unified.to",[2510,52381,52382,52385,52395,52398,52406],{},[2357,52383,52384],{},"Take note of your Microsoft client ID and client secret from the above steps",[2357,52386,16460,52387,52390,52391],{},[41,52388,21814],{"href":4146,"rel":52389},[45]," and find the integration page for the Microsoft integration you are interested in e.g. ",[41,52392,52393],{"href":52393,"rel":52394},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fmicrosoft_ad",[45],[2357,52396,52397],{},"Enter your client ID",[2357,52399,52400,52401,52403],{},"Enter your client secret",[5888,52402],{},[4201,52404],{"alt":20627,"src":52405},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_microsoft_azure_ad_oauth_2_credentials-7.png",[2357,52407,52408,52409,52411],{},"Make sure that you enable the correct permission scopes for your application.",[5888,52410],{},[4201,52412],{"alt":20627,"src":52413},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_microsoft_azure_ad_oauth_2_credentials-8.png",[55,52415,5622],{"id":5621},[22,52417,52418],{},[31,52419,52420],{},"I'm getting an 'invalid client secret' error",[22,52422,52423],{},"This error indicates a problem with the client ID and\u002For 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":2433,"searchDepth":2434,"depth":2434,"links":52425},[52426,52427,52428,52429],{"id":52240,"depth":2434,"text":52241},{"id":52312,"depth":2434,"text":52313},{"id":52378,"depth":2434,"text":52379},{"id":5621,"depth":2434,"text":5622},"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...",{"img":52432,"date":52433,"updated":52434,"tag":2457,"integrations":52435},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_microsoft_azure_ad_oauth_2_credentials-icon.png","2024-06-03T00:00:00.000Z","2026-08-23T14:53:59.999Z","microsoft_ad","\u002Fguides\u002Fhow_to_get_your_microsoft_azure_ad_oauth_2_credentials",{"title":52222,"description":52430},"guides\u002Fhow_to_get_your_microsoft_azure_ad_oauth_2_credentials","v03dzFU4QxUWUoQzIXc8GHkOkCq1n3Kd1Gi7IDPovV0",{"id":52441,"title":52442,"body":52443,"description":52700,"extension":2452,"meta":52701,"navigation":2459,"path":52705,"seo":52706,"stem":52707,"__hash__":52708},"guides\u002Fguides\u002Fhow_to_get_your_oauth_2_credentials_for_gmail.md","How to get your OAuth 2 credentials for Gmail",{"type":12,"value":52444,"toc":52692},[52445,52448,52450,52454,52458,52472,52476,52493,52499,52503,52525,52529,52532,52563,52565,52609,52614,52618,52644,52648,52655,52674,52679,52682,52687],[15,52446,52442],{"id":52447},"how-to-get-your-oauth-2-credentials-for-gmail",[19,52449],{},[22,52451,52452],{},[25,52453,23266],{},[22,52455,52456],{},[25,52457,49449],{},[22,52459,52460,52461,52465,52466,52471],{},"To access Google services such as Gmail (also known as Google Mail) through the ",[41,52462,8712],{"href":52463,"rel":52464},"https:\u002F\u002Funified.to\u002Ftechnology",[45],", you'll generate and retrieve your ",[41,52467,52470],{"href":52468,"rel":52469},"https:\u002F\u002Funified.to\u002Fembeddedauth",[45],"OAuth"," 2 credentials in the Google Cloud Console, then enter them in Unified.to.",[55,52473,52475],{"id":52474},"create-or-select-a-project-on-google-cloud-console","Create or select a project on Google Cloud Console",[2510,52477,52478,52483],{},[2357,52479,16460,52480,97],{},[41,52481,7099],{"href":7097,"rel":52482},[45],[2357,52484,52485,52486],{},"From the top nav bar, select an existing project or create a new one.\n",[2354,52487,52488],{},[2357,52489,52490,52491,97],{},"If creating a new project, name it whatever you want and click ",[31,52492,21975],{},[22,52494,52495],{},[4201,52496],{"alt":52497,"src":52498},"Screenshot_2024-09-09_at_9.56.18_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_oauth_2_credentials_for_gmail-0.png",[55,52500,52502],{"id":52501},"enable-the-gmail-api","Enable the Gmail API",[2510,52504,52505,52516,52521],{},[2357,52506,52507,52508,52511,52512,52515],{},"With your project selected, open the left sidebar and navigate to ",[31,52509,52510],{},"APIs & Services > Library"," (or search for ",[31,52513,52514],{},"Library"," from the top nav bar).",[2357,52517,51207,52518,52520],{},[31,52519,7163],{}," and click the matching result.",[2357,52522,16292,52523,97],{},[31,52524,7129],{},[55,52526,52528],{"id":52527},"configure-your-oauth-consent-screen","Configure your OAuth consent screen",[22,52530,52531],{},"Google requires you to configure the OAuth consent screen before it will let you create an OAuth client ID. The consent screen is what users see when they grant your app access to their Gmail.",[2510,52533,52534,52540,52557,52560],{},[2357,52535,52536,52537,97],{},"Open the left sidebar and navigate to ",[31,52538,52539],{},"APIs & Services > OAuth consent screen",[2357,52541,52542,52543],{},"Choose the user type:\n",[2354,52544,52545,52551],{},[2357,52546,52547,52550],{},[31,52548,52549],{},"Internal"," — for Google Workspace organization-internal apps.",[2357,52552,52553,52556],{},[31,52554,52555],{},"External"," — for consumer Gmail accounts or public apps.",[2357,52558,52559],{},"Fill in the required fields: app name, user support email, and developer contact information (and, for production, your authorized domains).",[2357,52561,52562],{},"Complete the consent screen setup.",[55,52564,51218],{"id":51217},[2510,52566,52567,52575,52582,52588,52597,52601],{},[2357,52568,16270,52569,52511,52572,52515],{},[31,52570,52571],{},"APIs & Services > Credentials",[31,52573,52574],{},"Credentials",[2357,52576,16292,52577,36664,52580,97],{},[31,52578,52579],{},"Create Credentials",[31,52581,36221],{},[2357,52583,21834,52584,52587],{},[31,52585,52586],{},"Web application"," as the application type, and name your app whatever you want.",[2357,52589,20156,52590,52593,52594,52596],{},[31,52591,52592],{},"Authorized redirect URIs",", enter ",[36,52595,21741],{}," (or the corresponding EU\u002FAU regional URL if your workspace is hosted there).",[2357,52598,16292,52599,97],{},[31,52600,21975],{},[2357,52602,52603,52604,741,52606,52608],{},"A dialog will appear displaying your new ",[31,52605,4491],{},[31,52607,4494],{},". Copy both — you'll need them for the next step.",[4937,52610,52611],{},[22,52612,52613],{},"Store your Client Secret securely. Never commit it to source control or include it in client-side code; keep it in environment variables or a secrets manager.",[55,52615,52617],{"id":52616},"activate-gmail-in-unifiedto","Activate Gmail in Unified.to",[2510,52619,52620,52627,52639],{},[2357,52621,16460,52622,97],{},[41,52623,52626],{"href":52624,"rel":52625},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fgooglemail",[45],"Gmail integration page on Unified.to",[2357,52628,47907,52629,52631,52632,52634,52635,741,52637,97],{},[31,52630,22285],{}," tab, with ",[31,52633,6814],{}," selected as the authentication method, enter your ",[31,52636,4491],{},[31,52638,4494],{},[2357,52640,16292,52641,52643],{},[31,52642,6845],{}," to save your changes and activate the Gmail integration.",[55,52645,52647],{"id":52646},"set-your-oauth-2-reauthentication-policy","Set your OAuth 2 reauthentication policy",[22,52649,52650,52651,52654],{},"If you're connecting a ",[31,52652,52653],{},"Google Workspace"," account, make sure your reauthentication policy is set correctly for the integration to keep functioning. This step requires Google Workspace admin access and doesn't apply to consumer Gmail accounts.",[2510,52656,52657,52663,52666],{},[2357,52658,52659,52660,97],{},"In the Google Workspace Admin Console, navigate to ",[31,52661,52662],{},"Menu > Security > Access and data control > Google Cloud session control",[2357,52664,52665],{},"On the left, select the organizational unit where you want to set the session length. For all users, select the top-level organizational unit. (An organizational unit initially inherits its parent's settings.)",[2357,52667,20156,52668,22582,52671,97],{},[31,52669,52670],{},"Reauthentication policy",[31,52672,52673],{},"Never require reauthentication",[22,52675,52676],{},[4201,52677],{"alt":20627,"src":52678},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_oauth_2_credentials_for_gmail-1.png",[22,52680,52681],{},"You can now use the Unified API to build new experiences with Gmail. Happy building!",[22,52683,49750,52684],{},[41,52685,49754],{"href":21420,"rel":52686},[45],[22,52688,49750,52689],{},[41,52690,41423],{"href":4152,"rel":52691},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":52693},[52694,52695,52696,52697,52698,52699],{"id":52474,"depth":2434,"text":52475},{"id":52501,"depth":2434,"text":52502},{"id":52527,"depth":2434,"text":52528},{"id":51217,"depth":2434,"text":51218},{"id":52616,"depth":2434,"text":52617},{"id":52646,"depth":2434,"text":52647},"To access Google services such as Gmail (also known as Google Mail) through the Unified API, you'll generate and retrieve your OAuth 2 credentials in the...",{"img":52702,"date":23981,"updated":52703,"tag":2457,"integrations":52704},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_oauth_2_credentials_for_gmail-icon.svg","2026-08-23T14:53:58.379Z","googlemail","\u002Fguides\u002Fhow_to_get_your_oauth_2_credentials_for_gmail",{"title":52442,"description":52700},"guides\u002Fhow_to_get_your_oauth_2_credentials_for_gmail","KTXCsT7BJ1JB5-83CuzTcSonguACTqfXmO8nuUbyWcc",{"id":52710,"title":52711,"body":52712,"description":53082,"extension":2452,"meta":53083,"navigation":2459,"path":53088,"seo":53089,"stem":53090,"__hash__":53091},"guides\u002Fguides\u002Fhow_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365.md","How to get your OAuth 2 credentials for Microsoft Dynamics 365",{"type":12,"value":52713,"toc":53074},[52714,52717,52719,52724,52728,52731,52733,52736,52755,52763,52765,52768,52780,52784,52787,52846,52849,52855,52859,52912,52916,53024,53030,53036,53040,53054,53057,53062,53068],[15,52715,52711],{"id":52716},"how-to-get-your-oauth-2-credentials-for-microsoft-dynamics-365",[19,52718],{},[22,52720,52721],{},[25,52722,52723],{},"October 29, 2024",[22,52725,52726],{},[25,52727,49449],{},[22,52729,52730],{},"This guide explains how to obtain your OAuth 2.0 credentials and configure API permissions for Microsoft Dynamics 365 business applications in Microsoft Entra ID (formerly Azure Active Directory).",[55,52732,47678],{"id":47677},[22,52734,52735],{},"Business applications in Microsoft Dynamics 365 use Microsoft's identity platform, Entra ID, for secure authentication. By registering your application, you establish a trusted connection that allows Unified.to to access Dynamics 365 data through the Dynamics 365 Web API (Dataverse) and, where applicable, Microsoft Graph and other Microsoft APIs. This works through:",[2354,52737,52738,52744,52750],{},[2357,52739,52740,52743],{},[31,52741,52742],{},"Delegated access",": Your application acts on behalf of the signed-in user. The user is redirected to Microsoft's sign-in page, authenticates, and grants your application consent, with permissions approved by both the administrator and the user.",[2357,52745,52746,52749],{},[31,52747,52748],{},"OAuth 2.0 credentials",": A client ID (which identifies your application) and a client secret (which serves as your application's password).",[2357,52751,52752,52754],{},[31,52753,52165],{},": Specific capabilities your application requests, which must be approved by an administrator.",[22,52756,52757,52758],{},"For more information, see ",[41,52759,52762],{"href":52760,"rel":52761},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fentra\u002Fidentity-platform\u002Fv2-overview",[45],"What is the Microsoft identity platform?",[55,52764,4890],{"id":4889},[22,52766,52767],{},"Ensure you have:",[2354,52769,52770,52777],{},[2357,52771,52772,52773,2980],{},"Access to the Microsoft Entra admin center (",[41,52774,52776],{"href":51948,"rel":52775},[45],"entra.microsoft.com",[2357,52778,52779],{},"Administrator access to Microsoft Entra ID",[55,52781,52783],{"id":52782},"register-your-application","Register your application",[22,52785,52786],{},"You'll first register an application in the Microsoft Entra admin center. This provides you with a client ID and client secret.",[2510,52788,52789,52795,52809],{},[2357,52790,52791,52792,97],{},"Sign in to the ",[41,52793,51950],{"href":51948,"rel":52794},[45],[2357,52796,52797,52798,52800,52801,97,52803,52805],{},"In the left sidebar, go to ",[31,52799,51972],{},", then click ",[31,52802,51976],{},[5888,52804],{},[4201,52806],{"alt":52807,"src":52808},"Screenshot_2024-10-31_at_11.43.24_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365-0.png",[2357,52810,52811,52812],{},"Configure your application:",[2354,52813,52814,52817,52824,52842],{},[2357,52815,52816],{},"Enter a meaningful name (for example, your product name).",[2357,52818,20156,52819,22582,52821,97],{},[31,52820,51989],{},[31,52822,52823],{},"Accounts in any organizational directory (Any Microsoft Entra ID directory - Multitenant)",[2357,52825,37282,52826,52828,52829],{},[31,52827,4497],{}," section:\n",[2354,52830,52831,52837],{},[2357,52832,21834,52833,52836],{},[31,52834,52835],{},"Web"," as the platform.",[2357,52838,49546,52839,52841],{},[36,52840,21741],{}," as the redirect URI (or the corresponding EU\u002FAU regional URL if your workspace is hosted there).",[2357,52843,16292,52844,97],{},[31,52845,51995],{},[22,52847,52848],{},"The redirect URI is where Microsoft sends users and authorization codes after they sign in and grant access, so it must exactly match what Unified.to expects.",[22,52850,52851],{},[4201,52852],{"alt":52853,"src":52854},"Screenshot_2024-10-31_at_11.45.21_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365-1.png",[55,52856,52858],{"id":52857},"get-your-dynamics-365-client-id-and-secret","Get your Dynamics 365 client ID and secret",[2510,52860,52861,52876],{},[2357,52862,52863,52866],{},[31,52864,52865],{},"Retrieve your client ID:",[2354,52867,52868,52873],{},[2357,52869,52870,52871,97],{},"On your application's overview page, locate the ",[31,52872,52015],{},[2357,52874,52875],{},"Copy this value — this is your client ID.",[2357,52877,52878,52881],{},[31,52879,52880],{},"Create a client secret:",[2354,52882,52883,52889,52896,52899,52902,52906],{},[2357,52884,52885,52886,97],{},"In the left menu, select ",[31,52887,52888],{},"Certificates & secrets",[2357,52890,20156,52891,22578,52894,97],{},[31,52892,52893],{},"Client secrets",[31,52895,52347],{},[2357,52897,52898],{},"Provide a description (optional, but helpful for tracking).",[2357,52900,52901],{},"Set the expiration to its maximum value, unless your security policy requires shorter rotation.",[2357,52903,16292,52904,97],{},[31,52905,47868],{},[2357,52907,52908,52909,52911],{},"Immediately copy the secret ",[31,52910,5247],{}," (not the secret ID). You won't be able to view it again after leaving this page, so store it securely right away — never commit it to source control or share it client-side.",[55,52913,52915],{"id":52914},"configure-dynamics-365-api-permissions","Configure Dynamics 365 API permissions",[2510,52917,52918,52963],{},[2357,52919,52920,52923,52924],{},[31,52921,52922],{},"Set up Microsoft Graph permissions."," These are used to obtain information about your users.\n",[2354,52925,52926,52931,52940,52959],{},[2357,52927,52928,52929,97],{},"In the left menu, click ",[31,52930,52083],{},[2357,52932,16292,52933,22582,52935,52937,52938,97],{},[31,52934,22581],{},[31,52936,22585],{},", then choose ",[31,52939,22589],{},[2357,52941,52942,52943],{},"Search for and add the following permissions:\n",[2354,52944,52945,52950,52954],{},[2357,52946,52947],{},[36,52948,52949],{},"openid",[2357,52951,52952],{},[36,52953,7282],{},[2357,52955,52956],{},[36,52957,52958],{},"offline_access",[2357,52960,16292,52961,97],{},[31,52962,44480],{},[2357,52964,52965,52968],{},[31,52966,52967],{},"Set up permissions for your Dynamics 365 business application.",[2354,52969,52970,52979,53004,53009,53020],{},[2357,52971,52972,52973,52975,52976,52978],{},"From the ",[31,52974,52083],{}," screen, click ",[31,52977,22581],{}," again.",[2357,52980,20156,52981,52984,52985],{},[31,52982,52983],{},"More Microsoft APIs",", select the API backing your Dynamics instance:\n",[2354,52986,52987,52996],{},[2357,52988,52989,52990,22582,52993,97],{},"If you're using ",[31,52991,52992],{},"Dynamics Sales",[31,52994,52995],{},"Dynamics CRM",[2357,52997,52989,52998,22582,53001,97],{},[31,52999,53000],{},"Dynamics Customer Engagement",[31,53002,53003],{},"Customer Insights",[2357,53005,53006,53007,97],{},"Choose ",[31,53008,22589],{},[2357,53010,53011,53012],{},"Search for and add the following delegated permission on the Dynamics API:\n",[2354,53013,53014],{},[2357,53015,53016,53019],{},[36,53017,53018],{},"user_impersonation"," (required for basic access)",[2357,53021,16292,53022,97],{},[31,53023,44480],{},[22,53025,53026],{},[4201,53027],{"alt":53028,"src":53029},"Screenshot_2024-10-31_at_11.58.11_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365-2.png",[22,53031,53032,53033,53035],{},"Depending on the specific Dynamics app or environment, you may see slightly different API names (for example, Dataverse or a specific Dynamics module), but you should always choose the API backing your Dynamics instance and add ",[36,53034,53018],{},". Consent to these permissions is granted when an administrator connects the integration through Unified.to's authorization flow.",[55,53037,53039],{"id":53038},"enter-your-dynamics-365-credentials-on-unifiedto","Enter your Dynamics 365 credentials on Unified.to",[2510,53041,53042,53048,53051],{},[2357,53043,21005,53044,53047],{},[41,53045,16278],{"href":16276,"rel":53046},[45]," and search for the Dynamics 365 integration you're using.",[2357,53049,53050],{},"Enter your client ID and client secret from the steps above.",[2357,53052,53053],{},"Save your changes.",[22,53055,53056],{},"You can now use the Microsoft Dynamics 365 integration in your application. Happy building!",[22,53058,49750,53059],{},[41,53060,16751],{"href":16749,"rel":53061},[45],[22,53063,53064],{},[41,53065,53067],{"href":21420,"rel":53066},[45],"→ Start your 30-day free trial",[22,53069,53070],{},[41,53071,53073],{"href":4152,"rel":53072},[45],"→ Book a demo",{"title":2433,"searchDepth":2434,"depth":2434,"links":53075},[53076,53077,53078,53079,53080,53081],{"id":47677,"depth":2434,"text":47678},{"id":4889,"depth":2434,"text":4890},{"id":52782,"depth":2434,"text":52783},{"id":52857,"depth":2434,"text":52858},{"id":52914,"depth":2434,"text":52915},{"id":53038,"depth":2434,"text":53039},"This guide explains how to obtain your OAuth 2.0 credentials and configure API permissions for Microsoft Dynamics 365 business applications in Microsoft Entra...",{"img":53084,"date":53085,"updated":53086,"tag":2457,"integrations":53087},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365-icon.webp","2024-10-29T00:00:00.000Z","2026-08-23T14:53:54.314Z","microsoftdynamics","\u002Fguides\u002Fhow_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365",{"title":52711,"description":53082},"guides\u002Fhow_to_get_your_oauth_2_credentials_for_microsoft_dynamics_365","rGWs5w2kG03r3Cbz1OG3vvfs3DwyE1pZZLp69orUeiI",{"id":53093,"title":53094,"body":53095,"description":53587,"extension":2452,"meta":53588,"navigation":2459,"path":53593,"seo":53594,"stem":53595,"__hash__":53596},"guides\u002Fguides\u002Fhow_to_get_your_oauth_2_credentials_in_pipedrive.md","How to get your OAuth 2 credentials in PipeDrive",{"type":12,"value":53096,"toc":53579},[53097,53100,53102,53107,53110,53119,53121,53124,53134,53138,53158,53162,53217,53221,53253,53257,53291,53295,53298,53362,53381,53535,53548,53552,53576],[15,53098,53094],{"id":53099},"how-to-get-your-oauth-2-credentials-in-pipedrive",[19,53101],{},[22,53103,53104],{},[25,53105,53106],{},"August 26, 2024",[22,53108,53109],{},"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 authenticate your app with Unified.to.",[22,53111,53112],{},[25,53113,53114,53115,97],{},"Note: The state parameter is not automatically available in Marketplace Manager. To enable it for your app, please write to ",[41,53116,53118],{"href":53117},"mailto:marketplace.devs@pipedrive.com","marketplace.devs@pipedrive.com",[55,53120,4890],{"id":4889},[22,53122,53123],{},"Before you create a developer app in Pipedrive, ensure:",[2354,53125,53126],{},[2357,53127,53128,53129,97],{},"You have a Pipedrive developer sandbox account. If you don't have one, sign up at ",[41,53130,53133],{"href":53131,"rel":53132},"https:\u002F\u002Fdevelopers.pipedrive.com\u002F",[45],"Pipedrive's developer portal",[55,53135,53137],{"id":53136},"access-the-developer-hub","Access the Developer Hub",[2510,53139,53140,53143,53146],{},[2357,53141,53142],{},"Log in to your Pipedrive account.",[2357,53144,53145],{},"Click on your profile name in the upper right corner of the top navigation bar.",[2357,53147,21834,53148,53151,53152,53154],{},[31,53149,53150],{},"Developer Hub"," from the drop-down menu.",[5888,53153],{},[4201,53155],{"alt":53156,"src":53157},"Screenshot_2024-08-26_at_3.02.21_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_oauth_2_credentials_in_pipedrive-0.png",[55,53159,53161],{"id":53160},"create-a-pipedrive-public-app","Create a Pipedrive public app",[2510,53163,53164,53170,53175,53207],{},[2357,53165,16292,53166,53169],{},[31,53167,53168],{},"Create an app"," (or \"+ Create an app\" if you have existing apps).",[2357,53171,21834,53172,97],{},[31,53173,53174],{},"Create public app",[2357,53176,53177,53178,97,53181,53186,53201,53203],{},"Fill in your app details under ",[31,53179,53180],{},"Basic info",[2510,53182,53183],{},[2357,53184,53185],{},"In the Callback URL field, choose based on your flow:",[2354,53187,53188,53195],{},[2357,53189,53190,34,53193],{},[31,53191,53192],{},"Unified-hosted OAuth:",[36,53194,21741],{},[2357,53196,53197,53200],{},[31,53198,53199],{},"Pipedrive Marketplace (own install + uninstall):"," your app callback URL. Marketplace requires one callback that handles OAuth install (GET) and uninstall (DELETE). Unified's callback cannot receive uninstall.",[5888,53202],{},[4201,53204],{"alt":53205,"src":53206},"Screenshot_2024-08-26_at_3.06.15_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_oauth_2_credentials_in_pipedrive-1.png",[2357,53208,16292,53209,53212,53213,53216],{},[31,53210,53211],{},"Save."," You will be redirected to the ",[31,53214,53215],{},"OAuth & access scopes"," page after your app is created.",[55,53218,53220],{"id":53219},"configure-scopes-and-get-your-oauth-2-credentials","Configure scopes and get your OAuth 2 credentials",[2510,53222,53223,53235,53241,53249],{},[2357,53224,53225,53226],{},"Select the scopes your app requires. Only choose scopes that are necessary for your app's functionality.\n",[2510,53227,53228],{},[2357,53229,53230,53231,53234],{},"For example, if you want to be notified about new or updated deals from Pipedrive, select ",[31,53232,53233],{},"Deals"," and choose whether you need read-only access or full (i.e. create, update, read, delete) access.",[2357,53236,53237,53238,53240],{},"Scroll down to the ",[31,53239,4491],{}," section.",[2357,53242,53243,53244,741,53246,53248],{},"Here you'll find your ",[36,53245,7513],{},[36,53247,21715],{},". Make a note of them as you will need it for the final step.",[2357,53250,16292,53251,97],{},[31,53252,46022],{},[55,53254,53256],{"id":53255},"activate-the-pipedrive-integration-in-unifiedto-with-your-client-id-and-secret","Activate the Pipedrive integration in Unified.to with your client ID and secret",[2510,53258,53259,53266,53279,53287],{},[2357,53260,51247,53261,97],{},[41,53262,53265],{"href":53263,"rel":53264},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fpipedrive",[45],"the Pipedrive integration in Unified.to",[2357,53267,53268,53269],{},"You will need the following two pieces of information from the earlier steps:\n",[2510,53270,53271,53275],{},[2357,53272,53273],{},[31,53274,4491],{},[2357,53276,53277],{},[31,53278,51266],{},[2357,53280,51275,53281,53283,53284,97],{},[31,53282,6814],{}," is selected under ",[31,53285,53286],{},"Authentication Method",[2357,53288,16292,53289,97],{},[31,53290,16295],{},[55,53292,53294],{"id":53293},"marketplace-listing-byo-callback-import-into-unified","Marketplace listing: BYO callback → import into Unified",[22,53296,53297],{},"If you list on the Pipedrive Marketplace and must own the callback URL for install and uninstall:",[2510,53299,53300,53303,53311,53323,53348],{},[2357,53301,53302],{},"Set Callback URL to your app (not Unified).",[2357,53304,53305,53306,10753,53308,53310],{},"Activate Pipedrive in Unified with the same ",[36,53307,7513],{},[36,53309,21715],{}," from this Marketplace app.",[2357,53312,53313,53314,319,53317,322,53320,97],{},"On install, exchange the code on your server for ",[36,53315,53316],{},"access_token",[36,53318,53319],{},"refresh_token",[36,53321,53322],{},"api_domain",[2357,53324,53325,53326,53329,53330,53333,53334,53336,53337,53339,53340,53343,53344,53347],{},"Create the Unified connection with ",[36,53327,53328],{},"POST \u002Funified\u002Fconnection"," using the payload below. Set ",[36,53331,53332],{},"auth.api_url"," to the company host from Pipedrive's ",[36,53335,53322],{}," token field. Do ",[31,53338,8239],{}," send ",[36,53341,53342],{},"auth.api_domain"," (rejected by connection validation) or ",[36,53345,53346],{},"other_auth_info"," on this OAuth import.",[2357,53349,53350,53351,53354,53355,53358,53359,44633],{},"On uninstall (Pipedrive sends ",[36,53352,53353],{},"DELETE"," to your callback), revoke the refresh token at Pipedrive (",[36,53356,53357],{},"POST https:\u002F\u002Foauth.pipedrive.com\u002Foauth\u002Frevoke","), then call ",[36,53360,53361],{},"DELETE \u002Funified\u002Fconnection\u002F{id}",[22,53363,53364,53367,53368,53370,53371,53374,53375,53377,53378,53380],{},[31,53365,53366],{},"Full import shape"," (adjust ",[36,53369,38588],{}," to match your scopes; set ",[36,53372,53373],{},"api_url"," to Pipedrive's token-response ",[36,53376,53322],{}," value — do not send ",[36,53379,53322],{}," as a connection field):",[2584,53382,53384],{"className":7323,"code":53383,"language":7325,"meta":2433,"style":2433},"{\n  \"integration_type\": \"pipedrive\",\n  \"categories\": [\"crm\"],\n  \"permissions\": [\n    \"crm_deal_read\",\n    \"crm_deal_write\",\n    \"crm_contact_read\",\n    \"crm_contact_write\"\n  ],\n  \"environment\": \"Production\",\n  \"external_xref\": \"\u003Cyour-end-customer-id>\",\n  \"auth\": {\n    \"access_token\": \"\u003Cfrom Pipedrive token response>\",\n    \"refresh_token\": \"\u003Cfrom Pipedrive token response>\",\n    \"expires_in\": 3599,\n    \"api_url\": \"https:\u002F\u002Facme.pipedrive.com\"\n  }\n}\n",[36,53385,53386,53390,53402,53414,53421,53428,53435,53442,53447,53451,53463,53475,53482,53494,53505,53517,53527,53531],{"__ignoreMap":2433},[414,53387,53388],{"class":2593,"line":2594},[414,53389,8916],{"class":2705},[414,53391,53392,53395,53397,53400],{"class":2593,"line":2434},[414,53393,53394],{"class":2607},"  \"integration_type\"",[414,53396,7340],{"class":2705},[414,53398,53399],{"class":2601},"\"pipedrive\"",[414,53401,2757],{"class":2705},[414,53403,53404,53407,53409,53412],{"class":2593,"line":2613},[414,53405,53406],{"class":2607},"  \"categories\"",[414,53408,10492],{"class":2705},[414,53410,53411],{"class":2601},"\"crm\"",[414,53413,10497],{"class":2705},[414,53415,53416,53419],{"class":2593,"line":2625},[414,53417,53418],{"class":2607},"  \"permissions\"",[414,53420,8960],{"class":2705},[414,53422,53423,53426],{"class":2593,"line":2677},[414,53424,53425],{"class":2601},"    \"crm_deal_read\"",[414,53427,2757],{"class":2705},[414,53429,53430,53433],{"class":2593,"line":2751},[414,53431,53432],{"class":2601},"    \"crm_deal_write\"",[414,53434,2757],{"class":2705},[414,53436,53437,53440],{"class":2593,"line":2760},[414,53438,53439],{"class":2601},"    \"crm_contact_read\"",[414,53441,2757],{"class":2705},[414,53443,53444],{"class":2593,"line":2768},[414,53445,53446],{"class":2601},"    \"crm_contact_write\"\n",[414,53448,53449],{"class":2593,"line":2776},[414,53450,15578],{"class":2705},[414,53452,53453,53456,53458,53461],{"class":2593,"line":2784},[414,53454,53455],{"class":2607},"  \"environment\"",[414,53457,7340],{"class":2705},[414,53459,53460],{"class":2601},"\"Production\"",[414,53462,2757],{"class":2705},[414,53464,53465,53468,53470,53473],{"class":2593,"line":2792},[414,53466,53467],{"class":2607},"  \"external_xref\"",[414,53469,7340],{"class":2705},[414,53471,53472],{"class":2601},"\"\u003Cyour-end-customer-id>\"",[414,53474,2757],{"class":2705},[414,53476,53477,53480],{"class":2593,"line":2804},[414,53478,53479],{"class":2607},"  \"auth\"",[414,53481,10477],{"class":2705},[414,53483,53484,53487,53489,53492],{"class":2593,"line":2809},[414,53485,53486],{"class":2607},"    \"access_token\"",[414,53488,7340],{"class":2705},[414,53490,53491],{"class":2601},"\"\u003Cfrom Pipedrive token response>\"",[414,53493,2757],{"class":2705},[414,53495,53496,53499,53501,53503],{"class":2593,"line":2829},[414,53497,53498],{"class":2607},"    \"refresh_token\"",[414,53500,7340],{"class":2705},[414,53502,53491],{"class":2601},[414,53504,2757],{"class":2705},[414,53506,53507,53510,53512,53515],{"class":2593,"line":2843},[414,53508,53509],{"class":2607},"    \"expires_in\"",[414,53511,7340],{"class":2705},[414,53513,53514],{"class":2607},"3599",[414,53516,2757],{"class":2705},[414,53518,53519,53522,53524],{"class":2593,"line":2849},[414,53520,53521],{"class":2607},"    \"api_url\"",[414,53523,7340],{"class":2705},[414,53525,53526],{"class":2601},"\"https:\u002F\u002Facme.pipedrive.com\"\n",[414,53528,53529],{"class":2593,"line":2854},[414,53530,4032],{"class":2705},[414,53532,53533],{"class":2593,"line":2880},[414,53534,3035],{"class":2705},[22,53536,53537,53538,10753,53540,53542,53543,97],{},"Use the same Marketplace ",[36,53539,7513],{},[36,53541,21715],{}," when activating Pipedrive in Unified so token refresh works. General import guidance: ",[41,53544,53547],{"href":53545,"rel":53546},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_migrate_or_import_your_integrations_into_unified",[45],"How to migrate or import your integrations into Unified.to",[22,53549,53550],{},[31,53551,20025],{},[2354,53553,53554,53560],{},[2357,53555,53556,53557,53559],{},"One Marketplace app = one callback URL. You cannot point the same app at both Zig\u002Fyour domain and ",[36,53558,21741],{},". For Marketplace production, use your callback + import. If you still want Unified-hosted OAuth (e.g. internal testing), use a separate private\u002Fsandbox Pipedrive app with Unified's redirect.",[2357,53561,53562,53563,10753,53565,53567,53568,741,53570,53573,53574,97],{},"Refresh works on imported connections when Unified's Pipedrive activation uses the same Marketplace ",[36,53564,7513],{},[36,53566,21715],{}," that issued the tokens. Include ",[36,53569,53319],{},[36,53571,53572],{},"expires_in"," on import; do not send ",[36,53575,53346],{},[4156,53577,53578],{},"html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":2433,"searchDepth":2434,"depth":2434,"links":53580},[53581,53582,53583,53584,53585,53586],{"id":4889,"depth":2434,"text":4890},{"id":53136,"depth":2434,"text":53137},{"id":53160,"depth":2434,"text":53161},{"id":53219,"depth":2434,"text":53220},{"id":53255,"depth":2434,"text":53256},{"id":53293,"depth":2434,"text":53294},"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...",{"img":53589,"date":53590,"updated":53591,"tag":2457,"integrations":53592},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_oauth_2_credentials_in_pipedrive-icon.png","2024-08-26T00:00:00.000Z","2026-08-25T19:26:06.868Z","pipedrive","\u002Fguides\u002Fhow_to_get_your_oauth_2_credentials_in_pipedrive",{"title":53094,"description":53587},"guides\u002Fhow_to_get_your_oauth_2_credentials_in_pipedrive","xIls-oHMh6imm2fMG7mvpQPyzzLDGRlEKuVUw_CgtwE",{"id":53598,"title":53599,"body":53600,"description":53614,"extension":2452,"meta":53756,"navigation":2459,"path":53760,"seo":53761,"stem":53762,"__hash__":53763},"guides\u002Fguides\u002Fhow_to_get_your_openai_api_key_step_by_step_guide.md","How to get your OpenAI API Key: Step-by-step guide",{"type":12,"value":53601,"toc":53748},[53602,53605,53607,53612,53615,53617,53621,53625,53636,53640,53677,53682,53693,53697,53700,53719,53723,53725,53735,53738,53741,53743],[15,53603,53599],{"id":53604},"how-to-get-your-openai-api-key-step-by-step-guide",[19,53606],{},[22,53608,53609],{},[25,53610,53611],{},"February 8, 2024",[22,53613,53614],{},"To access OpenAI data or automate workflows through an integration, an API Key is required.",[22,53616,49058],{},[55,53618,53620],{"id":53619},"how-to-get-an-openai-api-key-llm-ads","How to get an OpenAI API key (LLM + Ads)",[3629,53622,53624],{"id":53623},"_1-create-sign-in-to-your-openai-account","1) Create \u002F sign in to your OpenAI account",[2510,53626,53627,53633],{},[2357,53628,21005,53629],{},[41,53630,53631],{"href":53631,"rel":53632},"https:\u002F\u002Fplatform.openai.com\u002F",[45],[2357,53634,53635],{},"Sign in (or create an account).",[3629,53637,53639],{"id":53638},"_2-create-an-api-key-for-llm-general-api-use","2) Create an API key (for LLM \u002F general API use)",[2510,53641,53642,53655,53660,53669],{},[2357,53643,53644,53645,38099,53647],{},"In the OpenAI Platform, open ",[31,53646,48287],{},[2354,53648,53649],{},[2357,53650,53651],{},[41,53652,53653],{"href":53653,"rel":53654},"https:\u002F\u002Fplatform.openai.com\u002Fapi-keys",[45],[2357,53656,16292,53657,97],{},[31,53658,53659],{},"Create new secret key",[2357,53661,53662,53663,319,53666,20056],{},"Give it a recognizable name (e.g., ",[36,53664,53665],{},"unified-prod",[36,53667,53668],{},"unified-dev",[2357,53670,53671,53672],{},"Copy the key immediately and store it in your password manager \u002F secrets vault.\n",[2354,53673,53674],{},[2357,53675,53676],{},"You won't be able to see the full key again after you close the dialog.",[22,53678,53679],{},[31,53680,53681],{},"Use this key for:",[2354,53683,53684,53687,53690],{},[2357,53685,53686],{},"LLM requests (Responses API \u002F Chat Completions)",[2357,53688,53689],{},"Embeddings",[2357,53691,53692],{},"Ads API",[3629,53694,53696],{"id":53695},"_3-add-billing-if-required","3) Add billing (if required)",[22,53698,53699],{},"If you get \"insufficient_quota\" or similar errors:",[2510,53701,53702,53716],{},[2357,53703,20149,53704,53707,53708],{},[31,53705,53706],{},"Billing"," in the OpenAI Platform:\n",[2354,53709,53710],{},[2357,53711,53712],{},[41,53713,53714],{"href":53714,"rel":53715},"https:\u002F\u002Fplatform.openai.com\u002Faccount\u002Fbilling",[45],[2357,53717,53718],{},"Add a payment method and\u002For purchase credits (depending on your plan).",[3629,53720,53722],{"id":53721},"openai-ads","OpenAI Ads",[19,53724],{},[22,53726,53727,53728,53730,53731,53734],{},"OpenAI does ",[31,53729,8239],{}," issue a separate \"Ads API key\". for the Unified API, you use the ",[31,53732,53733],{},"same OpenAI Platform API key"," created above.",[22,53736,53737],{},"Getting your OpenAI API Key is the first step. The bigger challenge is supporting dozens of vendors - each with unique auth flows, schemas, and maintenance requirements.",[22,53739,53740],{},"Unified.to is a real-time integration platform built to replace that work. Instead of building and maintaining 1635 custom connectors, you get one secure, normalized API layer across 37 SaaS tools.",[22,53742,49021],{},[22,53744,53745,49027],{},[41,53746,41423],{"href":4152,"rel":53747},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":53749},[53750],{"id":53619,"depth":2434,"text":53620,"children":53751},[53752,53753,53754,53755],{"id":53623,"depth":2613,"text":53624},{"id":53638,"depth":2613,"text":53639},{"id":53695,"depth":2613,"text":53696},{"id":53721,"depth":2613,"text":53722},{"img":53757,"date":53758,"updated":53759,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_openai_api_key_step_by_step_guide-icon.png","2024-02-08T16:00:00.000Z","2026-10-22T01:11:42.281Z","\u002Fguides\u002Fhow_to_get_your_openai_api_key_step_by_step_guide",{"title":53599,"description":53614},"guides\u002Fhow_to_get_your_openai_api_key_step_by_step_guide","1DZNI6iBWBYZa9nxjvXzoqHa1_8pl9n9Jcb0-8DuPZg",{"id":53765,"title":53766,"body":53767,"description":53781,"extension":2452,"meta":53816,"navigation":2459,"path":53820,"seo":53821,"stem":53822,"__hash__":53823},"guides\u002Fguides\u002Fhow_to_get_your_paycom_sid_username_and_token_password_step_by_step_guide.md","How to get your Paycom SID\u002FUsername and Token\u002FPassword: Step-by-step guide",{"type":12,"value":53768,"toc":53814},[53769,53772,53774,53779,53782,53784,53787,53801,53804,53807,53809],[15,53770,53766],{"id":53771},"how-to-get-your-paycom-sidusername-and-tokenpassword-step-by-step-guide",[19,53773],{},[22,53775,53776],{},[25,53777,53778],{},"August 28, 2023",[22,53780,53781],{},"To access Paycom data or automate workflows through an integration, a SID\u002FUsername and Token\u002FPassword are required.",[22,53783,49058],{},[22,53785,53786],{},"Please request assistance from your Paycom Account Representative for the following items:",[2510,53788,53789,53792,53795,53798],{},[2357,53790,53791],{},"Enabling the REST API for your Paycom instance",[2357,53793,53794],{},"Whitelisting your OrgChart server IP address",[2357,53796,53797],{},"Creating an API Service User",[2357,53799,53800],{},"Generating valid authentication credentials (SID and Token)",[22,53802,53803],{},"Getting your Paycom SID\u002FUsername and Token\u002FPassword is the first step. The bigger challenge is supporting dozens of vendors - each with unique auth flows, schemas, and maintenance requirements.",[22,53805,53806],{},"Unified.to is a real-time integration platform built to replace that work. Instead of building and maintaining 884 custom connectors, you get one secure, normalized API layer across 34 SaaS tools.",[22,53808,49021],{},[22,53810,53811,49027],{},[41,53812,41423],{"href":4152,"rel":53813},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":53815},[],{"img":53817,"date":53818,"updated":53819,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_paycom_sid_username_and_token_password_step_by_step_guide-icon.png","2023-08-28T16:28:00.000Z","2026-09-16T14:15:03.812Z","\u002Fguides\u002Fhow_to_get_your_paycom_sid_username_and_token_password_step_by_step_guide",{"title":53766,"description":53781},"guides\u002Fhow_to_get_your_paycom_sid_username_and_token_password_step_by_step_guide","OZTsmEdJp3C4Ka7V6UujPGWWd-9eELnLQfIlHr5ch3g",{"id":53825,"title":53826,"body":53827,"description":53840,"extension":2452,"meta":53888,"navigation":2459,"path":53892,"seo":53893,"stem":53894,"__hash__":53895},"guides\u002Fguides\u002Fhow_to_get_your_pcrecruiter_username_password_database_id_app_key_and_app_id_step_by_step_guide.md","How to get your PCRecruiter Username, Password, Database ID, App Key and App ID: Step-by-step guide",{"type":12,"value":53828,"toc":53886},[53829,53832,53834,53838,53841,53844,53847,53873,53876,53879,53881],[15,53830,53826],{"id":53831},"how-to-get-your-pcrecruiter-username-password-database-id-app-key-and-app-id-step-by-step-guide",[19,53833],{},[22,53835,53836],{},[25,53837,49052],{},[22,53839,53840],{},"Developers connecting to PCRecruiter will need an Username, Password, Database ID, App Key and App ID for authentication.",[22,53842,53843],{},"Here's how to generate, configure, and copy your PCRecruiter Username, Password, Database ID, App Key and App ID so you can use it in your integration or share steps with your customers.",[22,53845,53846],{},"To find your Database ID:",[2510,53848,53849,53855,53861,53867],{},[2357,53850,21005,53851,53854],{},[31,53852,53853],{},"System"," in the top navigation bar.",[2357,53856,21005,53857,53860],{},[31,53858,53859],{},"API"," in the menu that opens.",[2357,53862,21005,53863,53866],{},[31,53864,53865],{},"Api Settings"," under API.",[2357,53868,53869,53870,97],{},"This will open a menu that displays the correct ",[31,53871,53872],{},"\"Api Database Id\"",[22,53874,53875],{},"Getting your PCRecruiter Username, Password, Database ID, App Key and App ID is the first step. The bigger challenge is supporting dozens of vendors - each with unique auth flows, schemas, and maintenance requirements.",[22,53877,53878],{},"Unified.to is a real-time integration platform built to replace that work. Instead of building and maintaining 878 custom connectors, you get one secure, normalized API layer across 34 SaaS tools.",[22,53880,49021],{},[22,53882,53883,49027],{},[41,53884,41423],{"href":4152,"rel":53885},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":53887},[],{"img":53889,"date":53890,"updated":53891,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_pcrecruiter_username_password_database_id_app_key_and_app_id_step_by_step_guide-icon.png","2023-08-18T15:13:00.000Z","2026-09-14T16:46:49.422Z","\u002Fguides\u002Fhow_to_get_your_pcrecruiter_username_password_database_id_app_key_and_app_id_step_by_step_guide",{"title":53826,"description":53840},"guides\u002Fhow_to_get_your_pcrecruiter_username_password_database_id_app_key_and_app_id_step_by_step_guide","4p9k24dTobAl9288-KE4rldf0BwncwRvzz5AAzvqN5I",{"id":53897,"title":53898,"body":53899,"description":53965,"extension":2452,"meta":53966,"navigation":2459,"path":53970,"seo":53971,"stem":53972,"__hash__":53973},"guides\u002Fguides\u002Fhow_to_get_your_sap_successfactors_openid_connect_username_password_client_id_client_secret_dependency_name_ias_host_and_api_url_step_by_step_guide.md","How to get your SAP SuccessFactors (OpenID Connect) Username, Password, Client ID, Client Secret, Dependency Name, IAS Host and API URL: Step-by-step guide",{"type":12,"value":53900,"toc":53962},[53901,53904,53906,53911,53914,53916,53922,53952,53955,53957],[15,53902,53898],{"id":53903},"how-to-get-your-sap-successfactors-openid-connect-username-password-client-id-client-secret-dependency-name-ias-host-and-api-url-step-by-step-guide",[19,53905],{},[22,53907,53908],{},[25,53909,53910],{},"August 13, 2025",[22,53912,53913],{},"To access SAP SuccessFactors (OpenID Connect) data or automate workflows through an integration, a Username, Password, Client ID, Client Secret, Dependency Name, IAS Host and API URL are required.",[22,53915,49058],{},[55,53917,53919],{"id":53918},"procedure",[31,53920,53921],{},"Procedure",[2510,53923,53924,53927],{},[2357,53925,53926],{},"Sign into the administration console of your SAP Cloud Identity Services instance.",[2357,53928,7257,53929,8032,53932,8032,53937,8032,53940,8032,53943,53946,53947,97],{},[31,53930,53931],{},"Applications and Resources",[31,53933,53934],{},[414,53935,53936],{},"Your OIDC Application",[31,53938,53939],{},"Application APIs",[31,53941,53942],{},"Client Authentication",[31,53944,53945],{},"Secrets",", add a new secret. Once created, copy the client ID and secret for later use. Note that you won't be able to retrieve the secret from the system later. For more information, see ",[41,53948,53951],{"href":53949,"rel":53950},"https:\u002F\u002Fhelp.sap.com\u002Fdocs\u002Fcloud-identity-services\u002Faa08922a434a456ba44982c9f4f4d790\u002Fdev-configure-secrets-for-api-authentication",[45],"Configure Secrets for API Authentication",[22,53953,53954],{},"You've now retrieved your SAP SuccessFactors (OpenID Connect) Username, Password, Client ID, Client Secret, Dependency Name, IAS Host and API URL. That's one system covered, but scaling integrations one by one means repeating this process hundreds of times.",[22,53956,49233],{},[22,53958,53959,49239],{},[41,53960,41423],{"href":4152,"rel":53961},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":53963},[53964],{"id":53918,"depth":2434,"text":53921},"To access SAP SuccessFactors (OpenID Connect) data or automate workflows through an integration, a Username, Password, Client ID, Client Secret, Dependency...",{"img":53967,"date":53968,"updated":53969,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_sap_successfactors_openid_connect_username_password_client_id_client_secret_dependency_name_ias_host_and_api_url_step_by_step_guide-icon.png","2025-08-13T14:27:00.000Z","2026-06-16T18:12:04.893Z","\u002Fguides\u002Fhow_to_get_your_sap_successfactors_openid_connect_username_password_client_id_client_secret_dependency_name_ias_host_and_api_url_step_by_step_guide",{"title":53898,"description":53965},"guides\u002Fhow_to_get_your_sap_successfactors_openid_connect_username_password_client_id_client_secret_dependency_name_ias_host_and_api_url_step_by_step_guide","2Da4FB90lz1qGHpfd94FuW0lYCgOzM_PsUgYKp_Jbgo",{"id":53975,"title":53976,"body":53977,"description":53990,"extension":2452,"meta":54127,"navigation":2459,"path":54131,"seo":54132,"stem":54133,"__hash__":54134},"guides\u002Fguides\u002Fhow_to_get_your_sap_successfactors_username_company_id_password_and_api_url_step_by_step_guide.md","How to get your SAP SuccessFactors Username, Company ID, Password and API URL: Step-by-step guide",{"type":12,"value":53978,"toc":54122},[53979,53982,53984,53988,53991,53994,53997,54001,54024,54028,54037,54042,54073,54077,54111,54114,54117],[15,53980,53976],{"id":53981},"how-to-get-your-sap-successfactors-username-company-id-password-and-api-url-step-by-step-guide",[19,53983],{},[22,53985,53986],{},[25,53987,48348],{},[22,53989,53990],{},"When connecting SAP SuccessFactors to other platforms, authentication requires a Username, Company ID, Password and API URL.",[22,53992,53993],{},"Follow these step-by-step instructions to generate one from your SAP SuccessFactors account, or provide them to your customers if they need to connect their account.",[22,53995,53996],{},"Please follow the following instructions to obtain your SAP SuccessFactors API credentials.",[55,53998,54000],{"id":53999},"step-1-find-your-api-server-url","Step 1: Find your API Server URL",[2354,54002,54003],{},[2357,54004,54005,54006,54010,54011,54015,54016,54019,54021],{},"Go to this ",[41,54007,45198],{"href":54008,"rel":54009},"https:\u002F\u002Fhelp.sap.com\u002Fdocs\u002FSAP_SUCCESSFACTORS_PLATFORM\u002F93f95815070049ebaaff042d8322d518\u002Faf2b8d5437494b12be88fe374eba75b6.html#api-servers",[45]," and find your data-center (DC).  Remember your API Server URL. For example, if your domain was ",[41,54012,54013],{"href":54013,"rel":54014},"https:\u002F\u002Fsalesdemo2.successfactors.com",[45],", search for ",[36,54017,54018],{},"salesdemo2",[5888,54020],{},[4201,54022],{"alt":20627,"src":54023},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_sap_successfactors_username_company_id_password_and_api_url_step_by_step_guide-0.png",[55,54025,54027],{"id":54026},"step-2-find-your-username-and-company-id","Step 2: Find your Username and Company ID",[2354,54029,54030],{},[2357,54031,54032,54033,54036],{},"To find your SAP SuccessFactors ",[36,54034,54035],{},"username",", log-in to SuccessFactors, then click on your profile image in the upper-right corner to view your username.",[22,54038,54039],{},[4201,54040],{"alt":20627,"src":54041},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_sap_successfactors_username_company_id_password_and_api_url_step_by_step_guide-1.png",[2354,54043,54044,54047,54062],{},[2357,54045,54046],{},"You SHOULD create a new username\u002Fpassword just for API access so that you do not use your own login credentials.",[2357,54048,44993,54049,54052,54053,54056,54057,54059],{},[36,54050,54051],{},"Company ID",", you can click on ",[36,54054,54055],{},"Show version information"," in the top-right menu",[5888,54058],{},[4201,54060],{"alt":20627,"src":54061},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_sap_successfactors_username_company_id_password_and_api_url_step_by_step_guide-2.png",[2357,54063,54064,54065,54067,54068,54070],{},"An alternate method to find your ",[36,54066,54051],{}," under the company settings",[5888,54069],{},[4201,54071],{"alt":20627,"src":54072},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_sap_successfactors_username_company_id_password_and_api_url_step_by_step_guide-3.png",[55,54074,54076],{"id":54075},"step-3-set-security-configuration","Step 3: Set Security Configuration",[2354,54078,54079,54090],{},[2357,54080,54081,54082,54085,54086,54089],{},"Set the ",[36,54083,54084],{},"Allow Admin to Access OData API through Basic Authentication"," permission in ",[36,54087,54088],{},"Admin Center > OData API Basic Authentication Configuration"," page.",[2357,54091,54092,54093,34,54096,34,54099,54102,54103,54106,54107,54110],{},"If you require specific IP Addresses to access the SuccessFactors API, then use the following IP addresses: ",[36,54094,54095],{},"44.199.69.244",[36,54097,54098],{},"3.65.142.239",[36,54100,54101],{},"13.239.151.208",".  This is performed in the ",[36,54104,54105],{},"Admin Center > OData API Basic Authentication Configuration"," or the ",[36,54108,54109],{},"API Center > OData IP Allowlisting"," pages.",[22,54112,54113],{},"You've now created your SAP SuccessFactors Username, Company ID, Password and API URL - just one of many if you support multiple vendors. Each one adds new auth flows, schema differences, and ongoing maintenance.",[22,54115,54116],{},"Unified.to removes that overhead with unified objects that work across 1647 APIs. Map once, launch everywhere. Your team ships features instead of debugging vendor-specific edge cases.",[22,54118,54119,48320],{},[41,54120,41423],{"href":4152,"rel":54121},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":54123},[54124,54125,54126],{"id":53999,"depth":2434,"text":54000},{"id":54026,"depth":2434,"text":54027},{"id":54075,"depth":2434,"text":54076},{"img":54128,"date":54129,"updated":54130,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_sap_successfactors_username_company_id_password_and_api_url_step_by_step_guide-icon.png","2023-04-24T19:44:00.000Z","2026-10-22T11:21:30.548Z","\u002Fguides\u002Fhow_to_get_your_sap_successfactors_username_company_id_password_and_api_url_step_by_step_guide",{"title":53976,"description":53990},"guides\u002Fhow_to_get_your_sap_successfactors_username_company_id_password_and_api_url_step_by_step_guide","EHDFCpVyeX3ytFRVZL5UodNF02LfksmV__RUINz45KQ",{"id":54136,"title":54137,"body":54138,"description":54438,"extension":2452,"meta":54439,"navigation":2459,"path":54443,"seo":54444,"stem":54445,"__hash__":54446},"guides\u002Fguides\u002Fhow_to_get_your_shopify_admin_api_access_token_and_store_id_step_by_step_guide.md","How to get your Shopify Admin API access token and Store ID: Step-by-step guide",{"type":12,"value":54139,"toc":54429},[54140,54143,54145,54149,54152,54155,54159,54182,54191,54195,54225,54229,54259,54263,54280,54337,54343,54347,54389,54393,54418,54421,54424],[15,54141,54137],{"id":54142},"how-to-get-your-shopify-admin-api-access-token-and-store-id-step-by-step-guide",[19,54144],{},[22,54146,54147],{},[25,54148,51331],{},[22,54150,54151],{},"If you're building an integration with Shopify, you'll need an Admin API access token and Store ID from your customer's Shopify account to authenticate requests.",[22,54153,54154],{},"This guide shows you (or your customers) how to generate one from Shopify's account settings.",[55,54156,54158],{"id":54157},"how-do-i-find-my-shopify-access-token-and-store-id","How do I find my Shopify access token and store ID?",[22,54160,54161,54162,34,54164,34,54167,34,54170,34,54172,34,54175,34,54177,54180],{},"Your access token and store ID can be found under ",[31,54163,36643],{},[25,54165,54166],{},">",[31,54168,54169],{},"Apps and sales channels",[25,54171,54166],{},[31,54173,54174],{},"Develop Apps",[25,54176,54166],{},[31,54178,54179],{},"Your_App",[25,54181,97],{},[22,54183,54184,54185,54190],{},"If you have not used access tokens in the Shopify admin before, this guide will walk you through how to do that as well as how to retrieve your unique store ID. Note: These instructions are adapted from the ",[41,54186,54189],{"href":54187,"rel":54188},"https:\u002F\u002Fhelp.shopify.com\u002Fen\u002Fmanual\u002Fapps\u002Fapp-types\u002Fcustom-apps#get-the-api-credentials-for-a-custom-app",[45],"Custom apps"," guide in Shopify.",[3629,54192,54194],{"id":54193},"step-1-activate-custom-app-development","Step 1: Activate custom app development",[2510,54196,54197,54208,54219],{},[2357,54198,54199,54200,51967,54202,97],{},"In the Shopify admin dashboard, click ",[31,54201,36643],{},[41,54203,54206],{"href":54204,"rel":54205},"https:\u002F\u002Fadmin.shopify.com\u002Fsettings\u002Fapps",[45],[31,54207,54169],{},[2357,54209,6184,54210,97,54213,54215],{},[31,54211,54212],{},"Develop apps",[5888,54214],{},[4201,54216],{"alt":54217,"src":54218},"Screenshot_2024-08-08_at_1.52.04_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_shopify_admin_api_access_token_and_store_id_step_by_step_guide-0.png",[2357,54220,54221,54222,97],{},"Read the disclaimer, and then click ",[31,54223,54224],{},"Allow custom app development",[3629,54226,54228],{"id":54227},"step-2-create-a-custom-app","Step 2: Create a custom app",[2510,54230,54231,54236,54255],{},[2357,54232,54233,54234,97],{},"On the same page, click ",[31,54235,53168],{},[2357,54237,54238,54239,54241,54242,54245,54246,54248,54249,54251],{},"In the modal that appears, enter the ",[31,54240,45539],{}," and select an ",[31,54243,54244],{},"App developer",". This can be the store owner or any collaborator with the ",[31,54247,54212],{}," permission.",[5888,54250],{},[4201,54252],{"alt":54253,"src":54254},"Screenshot_2024-08-13_at_2.06.21_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_shopify_admin_api_access_token_and_store_id_step_by_step_guide-1.png",[2357,54256,6184,54257,97],{},[31,54258,51181],{},[3629,54260,54262],{"id":54261},"step-3-configure-admin-api-scopes","Step 3: Configure Admin API scopes",[2510,54264,54265,54277],{},[2357,54266,54267,54268,54271,54273],{},"On the same page, click ",[31,54269,54270],{},"Configure Admin API scopes",[5888,54272],{},[4201,54274],{"alt":54275,"src":54276},"b16e9ec4-a348-4f1d-86fa-f4a3cd115591.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_shopify_admin_api_access_token_and_store_id_step_by_step_guide-2.png",[2357,54278,54279],{},"Select all of the following checkboxes (tip: use the search bar to quickly look these up)",[2354,54281,54282,54290,54301,54309,54320],{},[2357,54283,54284,34,54287],{},[31,54285,54286],{},"Customers:",[36,54288,54289],{},"read_customers",[2357,54291,54292,34,54295,319,54298],{},[31,54293,54294],{},"Inventory:",[36,54296,54297],{},"read_inventory",[36,54299,54300],{},"write_inventory",[2357,54302,54303,34,54306],{},[31,54304,54305],{},"Locations:",[36,54307,54308],{},"read_locations",[2357,54310,54311,34,54314,319,54317],{},[31,54312,54313],{},"Orders:",[36,54315,54316],{},"read_orders",[36,54318,54319],{},"write_orders",[2357,54321,54322,34,54325,319,54328,54331,54333],{},[31,54323,54324],{},"Products:",[36,54326,54327],{},"read_products",[36,54329,54330],{},"write_products",[5888,54332],{},[4201,54334],{"alt":54335,"src":54336},"Screenshot_2024-08-14_at_12.30.29_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_shopify_admin_api_access_token_and_store_id_step_by_step_guide-3.png",[2510,54338,54339],{},[2357,54340,16292,54341],{},[31,54342,46022],{},[3629,54344,54346],{"id":54345},"step-4-install-your-app-and-retrieve-the-access-token","Step 4: Install your app and retrieve the access token",[2510,54348,54349,54363,54369,54378,54383],{},[2357,54350,16270,54351,36545,54354,54357,54359],{},[31,54352,54353],{},"API credentials",[31,54355,54356],{},"Install app",[5888,54358],{},[4201,54360],{"alt":54361,"src":54362},"Screenshot_2024-08-13_at_2.13.26_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_shopify_admin_api_access_token_and_store_id_step_by_step_guide-4.png",[2357,54364,54365,54366],{},"In the modal that appears, click ",[31,54367,54368],{},"Install",[2357,54370,54371,54372,54374],{},"The page will now display a form containing your access token.",[5888,54373],{},[4201,54375],{"alt":54376,"src":54377},"Screenshot_2024-08-08_at_4.22.49_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_shopify_admin_api_access_token_and_store_id_step_by_step_guide-5.png",[2357,54379,28009,54380],{},[31,54381,54382],{},"Reveal token once",[2357,54384,54385,54386],{},"Copy and paste the token to the ",[31,54387,54388],{},"Sign in and Authorize page",[3629,54390,54392],{"id":54391},"step-6-retrieve-your-shopify-store-id","Step 6: Retrieve your Shopify store ID",[2510,54394,54395,54401,54412],{},[2357,54396,54397,54398],{},"While you are in the Shopify admin dashboard, observe the URL in your address bar - it should look something like this: ",[36,54399,54400],{},"https:\u002F\u002Fadmin.shopify.com\u002Fstore\u002F9564e1-49",[2357,54402,54403,54404,54407,54408,54411],{},"Your unique Shopify store ID is the part that comes after ",[36,54405,54406],{},"\u002Fstore"," e.g. ",[36,54409,54410],{},"9564e1-49"," in the above example",[2357,54413,54414,54415,16437],{},"Copy and paste the ID to the ",[31,54416,54417],{},"Sign in and Authorize",[22,54419,54420],{},"You've now retrieved your Shopify Admin API access token and Store ID. That's one system covered, but scaling integrations one by one means repeating this process hundreds of times.",[22,54422,54423],{},"Unified.to handles this for you: 1242 integrations out of the box, all with normalized schemas, real-time delivery, and Virtual Webhooks. No polling scripts, no retry logic, no maintenance backlog.",[22,54425,54426,49239],{},[41,54427,41423],{"href":4152,"rel":54428},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":54430},[54431],{"id":54157,"depth":2434,"text":54158,"children":54432},[54433,54434,54435,54436,54437],{"id":54193,"depth":2613,"text":54194},{"id":54227,"depth":2613,"text":54228},{"id":54261,"depth":2613,"text":54262},{"id":54345,"depth":2613,"text":54346},{"id":54391,"depth":2613,"text":54392},"If you're building an integration with Shopify, you'll need an Admin API access token and Store ID from your customer's Shopify account to authenticate...",{"img":54440,"date":54441,"updated":54442,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_shopify_admin_api_access_token_and_store_id_step_by_step_guide-icon.png","2023-11-14T19:41:00.000Z","2026-10-09T13:47:50.182Z","\u002Fguides\u002Fhow_to_get_your_shopify_admin_api_access_token_and_store_id_step_by_step_guide",{"title":54137,"description":54438},"guides\u002Fhow_to_get_your_shopify_admin_api_access_token_and_store_id_step_by_step_guide","-hlXJHFiIpW5a-NY4TXNainK-Y7NWZP4jhseg6PU2JI",{"id":54448,"title":54449,"body":54450,"description":54597,"extension":2452,"meta":54598,"navigation":2459,"path":54602,"seo":54603,"stem":54604,"__hash__":54605},"guides\u002Fguides\u002Fhow_to_get_your_wayfair_client_id_client_secret_and_vendor_encrypted_key_step_by_step_guide.md","How to get your Wayfair Client ID, Client Secret and Vendor Encrypted Key: Step-by-step guide",{"type":12,"value":54451,"toc":54594},[54452,54455,54457,54462,54465,54468,54474,54476,54583,54586,54588],[15,54453,54449],{"id":54454},"how-to-get-your-wayfair-client-id-client-secret-and-vendor-encrypted-key-step-by-step-guide",[19,54456],{},[22,54458,54459],{},[25,54460,54461],{},"November 19, 2024",[22,54463,54464],{},"If you're building an integration with Wayfair, you'll need an Client ID, Client Secret and Vendor Encrypted Key from your customer's Wayfair account to authenticate requests.",[22,54466,54467],{},"This guide shows you (or your customers) how to generate one from Wayfair's account settings.",[22,54469,16352,54470,54473],{},[36,54471,54472],{},"Encrypted API Key"," can be found in the UI for Supplier management of Vendor apps.",[55,54475,8320],{"id":8319},[2510,54477,54478,54481,54484,54487,54490,54498,54575],{},[2357,54479,54480],{},"Go to the Supplier Integration Status page",[2357,54482,54483],{},"Select \"Vendor Applications\" tab",[2357,54485,54486],{},"Hit \"Manage\" on the Catalog API row",[2357,54488,54489],{},"Select your Vendor from the list",[2357,54491,54492,54493],{},"Grant the needed permissions (see overview of permissions below)\n",[2510,54494,54495],{},[2357,54496,54497],{},"Note: Only the permissions that correspond to capabilities that a given Vendor\nhas adopted will be viewable + grantable.",[2357,54499,54500,54501],{},"Overview of permissions:\n",[2510,54502,54503,54509,54515,54521,54527,54533,54539,54545,54551,54557,54563,54569,54572],{},[2357,54504,54505,54508],{},[31,54506,54507],{},"read-product-classes","; Gets the product classes that suppliers can list items for sale",[2357,54510,54511,54514],{},[31,54512,54513],{},"read-product-catalog","; Export the supplier product catalog",[2357,54516,54517,54520],{},[31,54518,54519],{},"write-product-generic-description","; Update the generic descriptions for products",[2357,54522,54523,54526],{},[31,54524,54525],{},"read-product-generic-description-update-status","; Checks the status of generic description updates",[2357,54528,54529,54532],{},[31,54530,54531],{},"read-product-generic-descriptions-by-part","; Get the existing generic descriptions given a supplier part number",[2357,54534,54535,54538],{},[31,54536,54537],{},"read-media-metadata-tags","; Get the metadata tags associated with media;",[2357,54540,54541,54544],{},[31,54542,54543],{},"read-media-uploaded","; Get the list of media that was uploaded for a product",[2357,54546,54547,54550],{},[31,54548,54549],{},"read-media-uploaded-status","; Get the uploaded status for a given media request",[2357,54552,54553,54556],{},[31,54554,54555],{},"write-media-upload-from-url;"," Uploads new media and associates it with a product",[2357,54558,54559,54562],{},[31,54560,54561],{},"read-product-create-submit-status;"," Check the status of a new product request",[2357,54564,54565,54568],{},[31,54566,54567],{},"read-product-create-questions","; Get the questions required by a product class for listing new items for\nsale",[2357,54570,54571],{},"write-product-create-submit; Submit a new product to be listed on site",[2357,54573,54574],{},"read-supplier-brand-associations; Get the supplier brands that are authorized for the supplier to sell",[2357,54576,54577,54578],{},"On the Vendor application page, can copy their encrypted key by pressing the \"Copy Encrypted Key\" button.\n",[2510,54579,54580],{},[2357,54581,54582],{},"This encrypted key is just an encrypted supplier ID + name. This is more secure\nthan using inputing SuID into the Vendor's system.",[22,54584,54585],{},"Generating a Wayfair Client ID, Client Secret and Vendor Encrypted Key is the first step. The harder part is building pipelines that stay reliable as customers add more systems.",[22,54587,48466],{},[22,54589,54590,54593],{},[41,54591,41423],{"href":4152,"rel":54592},[45]," to see how we simplify integration delivery across 1453 integrations and 37 categories.",{"title":2433,"searchDepth":2434,"depth":2434,"links":54595},[54596],{"id":8319,"depth":2434,"text":8320},"If you're building an integration with Wayfair, you'll need an Client ID, Client Secret and Vendor Encrypted Key from your customer's Wayfair account to...",{"img":54599,"date":54600,"updated":54601,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_wayfair_client_id_client_secret_and_vendor_encrypted_key_step_by_step_guide-icon.png","2024-11-19T21:11:00.000Z","2026-10-16T20:06:20.373Z","\u002Fguides\u002Fhow_to_get_your_wayfair_client_id_client_secret_and_vendor_encrypted_key_step_by_step_guide",{"title":54449,"description":54597},"guides\u002Fhow_to_get_your_wayfair_client_id_client_secret_and_vendor_encrypted_key_step_by_step_guide","Z1ynV6PjyrOhkMOFCgOnellm_EWyHnkvzTNhOfPYFAA",{"id":54607,"title":54608,"body":54609,"description":54622,"extension":2452,"meta":54713,"navigation":2459,"path":54716,"seo":54717,"stem":54718,"__hash__":54719},"guides\u002Fguides\u002Fhow_to_get_your_workable_api_token_and_subdomain_step_by_step_guide.md","How to get your Workable API Token and Subdomain: Step-by-step guide",{"type":12,"value":54610,"toc":54707},[54611,54614,54616,54620,54623,54626,54630,54633,54640,54646,54649,54655,54658,54664,54676,54680,54683,54689,54693,54696,54699,54702],[15,54612,54608],{"id":54613},"how-to-get-your-workable-api-token-and-subdomain-step-by-step-guide",[19,54615],{},[22,54617,54618],{},[25,54619,48348],{},[22,54621,54622],{},"Workable supports authentication with API Token and Subdomain. To connect, you'll need to generate secure API Token and Subdomain from your account settings.",[22,54624,54625],{},"This short guide shows you how to generate one, whether you're testing in your sandbox or helping customers connect their Workable account.",[55,54627,54629],{"id":54628},"generate-an-api-access-token","Generate an API access token",[22,54631,54632],{},"This guide shows how to generate an API access token for your Workable account.",[22,54634,54635,54636,2646],{},"To start, open the drop-down menu on the top right of your screen and select \"Integrations\" or press ",[41,54637,28103],{"href":54638,"rel":54639},"https:\u002F\u002Fwww.workable.com\u002Fbackend\u002Faccount\u002Fintegrations",[45],[22,54641,54642],{},[4201,54643],{"alt":54644,"src":54645},"1a4f1f5-integrations_small.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_workable_api_token_and_subdomain_step_by_step_guide-0.png",[22,54647,54648],{},"Now click on the \"Generate new token\" button:",[22,54650,54651],{},[4201,54652],{"alt":54653,"src":54654},"7d9ac5c-Screenshot_2022-08-11_at_10.39.40_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_workable_api_token_and_subdomain_step_by_step_guide-1.png",[22,54656,54657],{},"Once you click the generate button, you'll see the new access token being generated:",[22,54659,54660],{},[4201,54661],{"alt":54662,"src":54663},"59ebf0e-Screenshot_2022-08-11_at_10.40.04_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_workable_api_token_and_subdomain_step_by_step_guide-2.png",[22,54665,54666,54667,54669,54670,4950,54673,54675],{},"This token type does not support ",[36,54668,21673],{}," scope. There are also new scopes like ",[36,54671,54672],{},"w_employees",[36,54674,21660],{}," that are not currently supported by access tokens already used for ATS related endpoints. You need to contact support to enable them for your account tokens.",[3629,54677,54679],{"id":54678},"subdomain","Subdomain",[22,54681,54682],{},"You will also need the account subdomain which you can find in the company profile settings page:",[22,54684,54685],{},[4201,54686],{"alt":54687,"src":54688},"6b1bcd3-Screenshot_2022-08-11_at_12.34.55_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_workable_api_token_and_subdomain_step_by_step_guide-3.png",[3629,54690,54692],{"id":54691},"revoking-the-access-token","Revoking The Access Token",[22,54694,54695],{},"Be aware that you can revoke this access token anytime, but if you decide to proceed, every script or application that accesses the Workable API through this token will stop functioning. To keep things running smoothly after revoking your current token, you will have to generate a new access token and update every script or application bound to the previous one.",[22,54697,54698],{},"You've now retrieved your Workable API Token and Subdomain. That's one system covered, but scaling integrations one by one means repeating this process hundreds of times.",[22,54700,54701],{},"Unified.to handles this for you: 944 integrations out of the box, all with normalized schemas, real-time delivery, and Virtual Webhooks. No polling scripts, no retry logic, no maintenance backlog.",[22,54703,54704,49239],{},[41,54705,41423],{"href":4152,"rel":54706},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":54708},[54709],{"id":54628,"depth":2434,"text":54629,"children":54710},[54711,54712],{"id":54678,"depth":2613,"text":54679},{"id":54691,"depth":2613,"text":54692},{"img":54714,"date":54129,"updated":54715,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_workable_api_token_and_subdomain_step_by_step_guide-icon.png","2026-09-22T18:34:12.023Z","\u002Fguides\u002Fhow_to_get_your_workable_api_token_and_subdomain_step_by_step_guide",{"title":54608,"description":54622},"guides\u002Fhow_to_get_your_workable_api_token_and_subdomain_step_by_step_guide","QQsSBlbEfdWtJM1foqP-JKkd8nNRvdQMfUgejl58zgc",{"id":54721,"title":54722,"body":54723,"description":54737,"extension":2452,"meta":54837,"navigation":2459,"path":54841,"seo":54842,"stem":54843,"__hash__":54844},"guides\u002Fguides\u002Fhow_to_get_your_yotpo_app_key_store_id_and_secret_key_step_by_step_guide.md","How to get your yotpo APP Key \u002F Store ID and Secret Key: Step-by-step guide",{"type":12,"value":54724,"toc":54835},[54725,54728,54730,54735,54738,54740,54746,54751,54756,54778,54783,54789,54794,54799,54819,54824,54827,54829],[15,54726,54722],{"id":54727},"how-to-get-your-yotpo-app-key-store-id-and-secret-key-step-by-step-guide",[19,54729],{},[22,54731,54732],{},[25,54733,54734],{},"April 4, 2025",[22,54736,54737],{},"To access yotpo data or automate workflows through an integration, a APP Key \u002F Store ID and Secret Key are required.",[22,54739,49058],{},[15,54741,54743],{"id":54742},"retrieving-your-app-key",[31,54744,54745],{},"Retrieving your app key",[22,54747,54748],{},[31,54749,54750],{},"Your app key is sometimes referred to as your Store ID.",[22,54752,54753],{},[31,54754,54755],{},"To retrieve your app key:",[2510,54757,54758,54763],{},[2357,54759,54760],{},[31,54761,54762],{},"In Yotpo Reviews, click the Profile icon at the top right corner of the screen.",[2357,54764,54765,8032,54768,54775],{},[31,54766,54767],{},"Select Account Settings >",[41,54769,54772],{"href":54770,"rel":54771},"https:\u002F\u002Fsettings.yotpo.com\u002F#\u002Fgeneral_settings",[45],[31,54773,54774],{},"General Settings",[31,54776,54777],{},". You'll find your App Key at the bottom of the General Settings section.",[22,54779,54780],{},[31,54781,54782],{},"If you need a Secret Key, you'll need to generate it.",[15,54784,54786],{"id":54785},"generating-your-secret-key",[31,54787,54788],{},"Generating your secret key",[22,54790,54791],{},[31,54792,54793],{},"Your secret key is sometimes referred to as your API secret.",[22,54795,54796],{},[31,54797,54798],{},"To generate your secret key:",[2510,54800,54801,54814],{},[2357,54802,54803,8032,54806,54812],{},[31,54804,54805],{},"Follow the steps above to get to your",[41,54807,54809],{"href":54770,"rel":54808},[45],[31,54810,54811],{},"Account Settings",[31,54813,97],{},[2357,54815,54816],{},[31,54817,54818],{},"From your General Settings, click Get secret key. We'll send an email with a verification code to the email address associated with your account.",[22,54820,54821],{},[31,54822,54823],{},"3. Paste the code from the email and click Submit. Your secret key will be revealed on the next screen. Remember, only share your secret key with parties that should have access to your data.",[22,54825,54826],{},"Generating a yotpo APP Key \u002F Store ID and Secret Key is the first step. The harder part is building pipelines that stay reliable as customers add more systems.",[22,54828,48466],{},[22,54830,54831,54834],{},[41,54832,41423],{"href":4152,"rel":54833},[45]," to see how we simplify integration delivery across 506 integrations and 30 categories.",{"title":2433,"searchDepth":2434,"depth":2434,"links":54836},[],{"img":54838,"date":54839,"updated":54840,"tag":48329,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_get_your_yotpo_app_key_store_id_and_secret_key_step_by_step_guide-icon.png","2025-04-04T13:52:00.000Z","2026-06-24T16:01:07.847Z","\u002Fguides\u002Fhow_to_get_your_yotpo_app_key_store_id_and_secret_key_step_by_step_guide",{"title":54722,"description":54737},"guides\u002Fhow_to_get_your_yotpo_app_key_store_id_and_secret_key_step_by_step_guide","eypZcVDjWOUCOAgkIMUBvNWIuuCz2trfx9ZI33FoDEA",{"id":54846,"title":54847,"body":54848,"description":55202,"extension":2452,"meta":55203,"navigation":2459,"path":55207,"seo":55208,"stem":55209,"__hash__":55210},"guides\u002Fguides\u002Fhow_to_handle_attachments_in_invoice_bill_and_credit_memo.md","How to Handle Attachments in Invoice, Bill and Credit Memo",{"type":12,"value":54849,"toc":55192},[54850,54853,54855,54860,54866,54868,54872,54875,54908,54917,54919,54923,54926,54934,54950,54952,54956,54959,54974,54976,54996,54998,55002,55005,55023,55025,55029,55036,55047,55049,55053,55056,55074,55077,55102,55105,55108,55164,55166,55170,55176,55178,55182,55190],[15,54851,54847],{"id":54852},"how-to-handle-attachments-in-invoice-bill-and-credit-memo",[19,54854],{},[22,54856,54857],{},[25,54858,54859],{},"August 5, 2025",[22,54861,54862,54863,39801],{},"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 ",[36,54864,54865],{},"Storage File",[19,54867],{},[3629,54869,54871],{"id":54870},"how-to-check-if-an-integration-supports-attachments","🔍 How to Check If an Integration Supports Attachments",[22,54873,54874],{},"To check if a specific integration supports reading or writing attachments:",[2510,54876,54877,54883,54887,54897],{},[2357,54878,54879,54882],{},[31,54880,54881],{},"Go to the Integration Page"," in the Unified.to dashboard.",[2357,54884,16270,54885,97],{},[31,54886,21863],{},[2357,54888,54889,54890,54893,54894,20056],{},"Select the relevant ",[31,54891,54892],{},"endpoint"," (e.g., ",[36,54895,54896],{},"Accounting → Invoice",[2357,54898,54899,54900,54903,54904,54907],{},"Look under ",[31,54901,54902],{},"Readable Fields"," — if ",[36,54905,54906],{},"attachments"," is listed, the endpoint supports reading attachments.",[22,54909,54910,54911,54913,54914,39801],{},"🛠️ ",[31,54912,44037],{}," You can also check support programmatically using the ",[36,54915,54916],{},"\u002Fstorage",[19,54918],{},[3629,54920,54922],{"id":54921},"how-to-list-all-attachments","📂 How to List All Attachments",[22,54924,54925],{},"To fetch all available attachments across an integration:",[2354,54927,54928],{},[2357,54929,9188,54930,54933],{},[36,54931,54932],{},"GET \u002Fstorage"," (Storage File List) endpoint.",[22,54935,16093,54936,54938,54939,54942,54943,34,54946,54949],{},[31,54937,22779],{}," Most integrations ",[31,54940,54941],{},"do not support"," listing all attachments globally. Unified.to reflects this limitation. However, some integrations like ",[31,54944,54945],{},"Sage",[25,54947,54948],{},"do"," support it.",[19,54951],{},[3629,54953,54955],{"id":54954},"how-to-fetch-attachments-for-a-specific-record-eg-invoice","📌 How to Fetch Attachments for a Specific Record (e.g., Invoice)",[22,54957,54958],{},"To get attachments for a specific entity like an invoice, bill, or candidate:",[2354,54960,54961,54965],{},[2357,54962,9188,54963,39801],{},[36,54964,54932],{},[2357,54966,54967,54968,54893,54971,54973],{},"Pass the corresponding ",[36,54969,54970],{},"parent_id",[36,54972,33977],{},") in the query parameters.",[22,54975,17183],{},[2584,54977,54979],{"className":2649,"code":54978,"language":2651,"meta":2652,"style":2433},"http\nCopyEdit\nGET \u002Fstorage-file?parent_id=inv_1234\n",[36,54980,54981,54986,54991],{"__ignoreMap":2433},[414,54982,54983],{"class":2593,"line":2594},[414,54984,54985],{},"http\n",[414,54987,54988],{"class":2593,"line":2434},[414,54989,54990],{},"CopyEdit\n",[414,54992,54993],{"class":2593,"line":2613},[414,54994,54995],{},"GET \u002Fstorage-file?parent_id=inv_1234\n",[19,54997],{},[3629,54999,55001],{"id":55000},"how-to-get-details-of-a-specific-attachment","🧾 How to Get Details of a Specific Attachment",[22,55003,55004],{},"To retrieve metadata (name, file type, size, etc.) of a particular attachment:",[2354,55006,55007],{},[2357,55008,55009,55010],{},"Use either:\n",[2354,55011,55012,55018],{},[2357,55013,55014,55017],{},[36,55015,55016],{},"GET \u002Fstorage\u002F:id"," — to get a single attachment",[2357,55019,55020,55022],{},[36,55021,54932],{}," — to filter and retrieve multiple files with query params",[19,55024],{},[3629,55026,55028],{"id":55027},"how-to-download-an-attachment","📥 How to Download an Attachment",[22,55030,55031,55032,55035],{},"We return a secure ",[36,55033,55034],{},"download_url"," in the response when you fetch an attachment. You can use this URL to download the file directly.",[22,55037,16093,55038,55040,55041,297,55043,55046],{},[31,55039,22779],{}," The ",[36,55042,55034],{},[31,55044,55045],{},"time-limited"," and expires after a few minutes for security reasons. Always use the URL shortly after fetching.",[19,55048],{},[3629,55050,55052],{"id":55051},"how-to-upload-or-create-an-attachment","📤 How to Upload or Create an Attachment",[22,55054,55055],{},"To upload a new attachment:",[2510,55057,55058,55068],{},[2357,55059,16434,55060,55063,55064,55067],{},[31,55061,55062],{},"Integration Page"," and confirm the ",[36,55065,55066],{},"storage-file"," endpoint is supported under Feature Support.",[2357,55069,9188,55070,55073],{},[36,55071,55072],{},"POST \u002Fstorage-file"," endpoint with required fields.",[22,55075,55076],{},"Key fields:",[2354,55078,55079,55083,55090],{},[2357,55080,55081],{},[36,55082,9043],{},[2357,55084,55085,55087,55088],{},[36,55086,5590],{}," (base64 encoded) | ",[36,55089,55034],{},[2357,55091,55092,54893,55094,319,55096,319,55099,2980],{},[36,55093,54970],{},[36,55095,33977],{},[36,55097,55098],{},"bill_id",[36,55100,55101],{},"employee_id",[22,55103,55104],{},"Unified.to will automatically associate the attachment with the parent entity.",[22,55106,55107],{},"Example payload:",[2584,55109,55111],{"className":7323,"code":55110,"language":7325,"meta":2433,"style":2433},"json\nCopyEdit\n{\n  \"file_name\": \"invoice-august.pdf\",\n  \"file_data\": \"base64-encoded-data\",\n  \"parent_id\": \"inv_1234\"\n}\n",[36,55112,55113,55118,55122,55126,55138,55150,55160],{"__ignoreMap":2433},[414,55114,55115],{"class":2593,"line":2594},[414,55116,55117],{"class":2705},"json\n",[414,55119,55120],{"class":2593,"line":2434},[414,55121,54990],{"class":2705},[414,55123,55124],{"class":2593,"line":2613},[414,55125,8916],{"class":2705},[414,55127,55128,55131,55133,55136],{"class":2593,"line":2625},[414,55129,55130],{"class":2607},"  \"file_name\"",[414,55132,7340],{"class":2705},[414,55134,55135],{"class":2601},"\"invoice-august.pdf\"",[414,55137,2757],{"class":2705},[414,55139,55140,55143,55145,55148],{"class":2593,"line":2677},[414,55141,55142],{"class":2607},"  \"file_data\"",[414,55144,7340],{"class":2705},[414,55146,55147],{"class":2601},"\"base64-encoded-data\"",[414,55149,2757],{"class":2705},[414,55151,55152,55155,55157],{"class":2593,"line":2751},[414,55153,55154],{"class":2607},"  \"parent_id\"",[414,55156,7340],{"class":2705},[414,55158,55159],{"class":2601},"\"inv_1234\"\n",[414,55161,55162],{"class":2593,"line":2760},[414,55163,3035],{"class":2705},[19,55165],{},[3629,55167,55169],{"id":55168},"how-to-associate-an-attachment-with-an-entity","🧷 How to Associate an Attachment with an Entity",[22,55171,55172,55173,55175],{},"When uploading a file, simply set the ",[36,55174,54970],{}," to the ID of the resource (invoice, bill, employee, etc.). Unified.to handles the rest — no extra linking needed.",[19,55177],{},[3629,55179,55181],{"id":55180},"questions-or-requests","💬 Questions or Requests?",[2354,55183,55184,55187],{},[2357,55185,55186],{},"If you're unsure whether an integration supports attachments for a specific resource type, reach out to our support team.",[2357,55188,55189],{},"If a feature isn't currently supported, let us know! We're always looking to expand support where possible.",[4156,55191,37739],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":55193},[55194,55195,55196,55197,55198,55199,55200,55201],{"id":54870,"depth":2613,"text":54871},{"id":54921,"depth":2613,"text":54922},{"id":54954,"depth":2613,"text":54955},{"id":55000,"depth":2613,"text":55001},{"id":55027,"depth":2613,"text":55028},{"id":55051,"depth":2613,"text":55052},{"id":55168,"depth":2613,"text":55169},{"id":55180,"depth":2613,"text":55181},"Unified.to provides a standardized way to read, upload, and manage attachments (e.g., invoices, receipts, contracts) across various integrations like...",{"img":55204,"date":55205,"updated":55206,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_handle_attachments_in_invoice_bill_and_credit_memo-icon.png","2025-08-05T00:00:00.000Z","2026-05-28T13:29:38.983Z","\u002Fguides\u002Fhow_to_handle_attachments_in_invoice_bill_and_credit_memo",{"title":54847,"description":55202},"guides\u002Fhow_to_handle_attachments_in_invoice_bill_and_credit_memo","3IX9miVwKZF9TF3Xa21dREgMH1JRL_UOfBvhrnC7IdE",{"id":55212,"title":53547,"body":55213,"description":56576,"extension":2452,"meta":56577,"navigation":2459,"path":56581,"seo":56582,"stem":56583,"__hash__":56584},"guides\u002Fguides\u002Fhow_to_migrate_or_import_your_integrations_into_unified.md",{"type":12,"value":55214,"toc":56559},[55215,55218,55220,55225,55231,55234,55237,55246,55291,55295,55300,55325,55327,55329,55345,55349,55352,55356,55364,55368,55379,55383,55386,55412,55415,55922,55931,55935,55938,56017,56023,56123,56134,56138,56143,56273,56278,56282,56308,56312,56318,56361,56384,56388,56393,56468,56477,56481,56484,56495,56499,56534,56536,56556],[15,55216,53547],{"id":55217},"how-to-migrate-or-import-your-integrations-into-unifiedto",[19,55219],{},[22,55221,55222],{},[25,55223,55224],{},"October 25, 2024",[22,55226,55227],{},[4201,55228],{"alt":55229,"src":55230},"app.unified.to_connections_import_typedropbox.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_migrate_or_import_your_integrations_into_unified-0.png",[22,55232,55233],{},"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.",[22,55235,55236],{},"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.",[22,55238,55239,55242,55243,2646],{},[31,55240,55241],{},"Vendor-specific guides."," Moving from another unified API? Each guide maps that vendor's authorization, API calls, pagination, webhooks and passthrough to ",[41,55244,123],{"href":121,"rel":55245},[45],[2354,55247,55248,55255,55262,55269,55276,55283],{},[2357,55249,55250],{},[41,55251,55254],{"href":55252,"rel":55253},"https:\u002F\u002Fdocs.unified.to\u002Fmigrate\u002Fmerge",[45],"Merge",[2357,55256,55257],{},[41,55258,55261],{"href":55259,"rel":55260},"https:\u002F\u002Fdocs.unified.to\u002Fmigrate\u002Fapideck",[45],"Apideck",[2357,55263,55264],{},[41,55265,55268],{"href":55266,"rel":55267},"https:\u002F\u002Fdocs.unified.to\u002Fmigrate\u002Fkombo",[45],"Kombo",[2357,55270,55271],{},[41,55272,55275],{"href":55273,"rel":55274},"https:\u002F\u002Fdocs.unified.to\u002Fmigrate\u002Ffinch",[45],"Finch",[2357,55277,55278],{},[41,55279,55282],{"href":55280,"rel":55281},"https:\u002F\u002Fdocs.unified.to\u002Fmigrate\u002Frutter",[45],"Rutter",[2357,55284,55285,55290],{},[41,55286,55289],{"href":55287,"rel":55288},"https:\u002F\u002Fdocs.unified.to\u002Fmigrate\u002Foverview",[45],"Migration overview",", for any other unified API",[55,55292,55294],{"id":55293},"when-to-use-import-vs-unified-oauth","When to use import (vs Unified OAuth)",[22,55296,3370,55297,55299],{},[36,55298,53328],{}," (import) only when you already hold end-user credentials—for example migrating from another platform, or completing OAuth on your own callback (BYO redirect) and then creating the Unified connection.",[2354,55301,55302,55313],{},[2357,55303,55304,55307,55308,10753,55310,55312],{},[31,55305,55306],{},"Do not"," paste your app ",[36,55309,7513],{},[36,55311,21715],{}," into Import Connections. Those are workspace activation credentials (Activate Integration), not per-connection end-user tokens.",[2357,55314,55315,55316,54106,55321,97],{},"For new end-user connects where Unified can host the OAuth callback, prefer ",[41,55317,55320],{"href":55318,"rel":55319},"https:\u002F\u002Fdocs.unified.to\u002Funified\u002Fintegration\u002FAuthorize_new_connection",[45],"Authorize new connection",[41,55322,55324],{"href":21696,"rel":55323},[45],"embedded auth component",[55,55326,4890],{"id":4889},[22,55328,24095],{},[2354,55330,55331,55334,55337],{},[2357,55332,55333],{},"A Unified.to account.",[2357,55335,55336],{},"Existing customer credentials for the integrations you want to import.",[2357,55338,55339,55340,97],{},"Basic understanding of REST APIs, authentication flows, and ",[41,55341,55344],{"href":55342,"rel":55343},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fend_users_integrations_and_connections#end-users-integrations-and-connections",[45],"connections",[55,55346,55348],{"id":55347},"understand-the-authentication-types","Understand the authentication types",[22,55350,55351],{},"Before importing your integrations, you need to determine which authentication type each integration uses. Unified.to supports two main authentication flows:",[3629,55353,55355],{"id":55354},"api-token-authentication","API token authentication",[2354,55357,55358,55361],{},[2357,55359,55360],{},"Simple token: Requires a single token or key.",[2357,55362,55363],{},"Multi-field token: Requires multiple credentials (e.g. API key + domain).",[3629,55365,55367],{"id":55366},"oauth-2-authentication","OAuth 2 authentication",[2354,55369,55370,55373,55376],{},[2357,55371,55372],{},"Requires client credentials (client ID and secret).",[2357,55374,55375],{},"Requires access tokens and optional refresh tokens.",[2357,55377,55378],{},"May include additional user information e.g. emails, names.",[55,55380,55382],{"id":55381},"check-instructions-for-the-integration-you-want-to-import","Check instructions for the integration you want to import",[22,55384,55385],{},"The Unified.to Core API contains information that will help you determine what you need to successfully import your integrations.",[2510,55387,55388,55395],{},[2357,55389,55390,55391,55394],{},"Make a GET request to the ",[36,55392,55393],{},"\u002Funified\u002Fintegration"," endpoint to get information about the integration you want to import, passing in the categories and\u002For names of the integrations you are interested in.",[2357,55396,55397,55398],{},"Check the following fields in the response:\n",[2354,55399,55400,55406],{},[2357,55401,55402,55405],{},[36,55403,55404],{},"token_names",": Lists required credential fields for API token authentication.",[2357,55407,55408,55411],{},[36,55409,55410],{},"token_instructions",": Provides guidance on where to find these credentials.",[22,55413,55414],{},"For example:",[2584,55416,55418],{"className":16485,"code":55417,"language":16487,"meta":2433,"style":2433},"const baseUrl = 'https:\u002F\u002Fapi.unified.to\u002Funified\u002Fintegration';\nconst params = new URLSearchParams({\n  categories: ['ats', 'crm'].join(',')\n});\nconst url = `${baseUrl}?${params}`;\n\n\u002F\u002F Make the request\nfetch(url, {\n  method: 'GET',\n  headers: {\n    'Authorization': `Bearer ${YOUR_API_KEY}`,\n    'Accept': 'application\u002Fjson'\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  \u002F\u002F Loop through each integration and log its auth details\n  integrations.forEach(integration => {\n    console.log(`\\n=== ${integration.name} ===`);\n    \n    \u002F\u002F 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\u002F* 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*\u002F\n",[36,55419,55420,55434,55448,55472,55476,55499,55503,55508,55516,55524,55528,55544,55553,55557,55561,55575,55585,55608,55612,55622,55626,55640,55645,55661,55688,55692,55697,55717,55731,55744,55766,55793,55797,55805,55818,55822,55826,55830,55844,55857,55861,55865,55870,55874,55879,55884,55889,55894,55899,55903,55908,55913,55917],{"__ignoreMap":2433},[414,55421,55422,55424,55427,55429,55432],{"class":2593,"line":2594},[414,55423,2745],{"class":2698},[414,55425,55426],{"class":2607}," baseUrl",[414,55428,2817],{"class":2698},[414,55430,55431],{"class":2601}," 'https:\u002F\u002Fapi.unified.to\u002Funified\u002Fintegration'",[414,55433,2706],{"class":2705},[414,55435,55436,55438,55440,55442,55444,55446],{"class":2593,"line":2434},[414,55437,2745],{"class":2698},[414,55439,38773],{"class":2607},[414,55441,2817],{"class":2698},[414,55443,2820],{"class":2698},[414,55445,28144],{"class":2597},[414,55447,2826],{"class":2705},[414,55449,55450,55453,55456,55458,55461,55464,55466,55468,55470],{"class":2593,"line":2613},[414,55451,55452],{"class":2705},"  categories: [",[414,55454,55455],{"class":2601},"'ats'",[414,55457,319],{"class":2705},[414,55459,55460],{"class":2601},"'crm'",[414,55462,55463],{"class":2705},"].",[414,55465,3148],{"class":2597},[414,55467,2968],{"class":2705},[414,55469,38850],{"class":2601},[414,55471,3141],{"class":2705},[414,55473,55474],{"class":2593,"line":2625},[414,55475,2846],{"class":2705},[414,55477,55478,55480,55483,55485,55487,55490,55493,55495,55497],{"class":2593,"line":2677},[414,55479,2745],{"class":2698},[414,55481,55482],{"class":2607}," url",[414,55484,2817],{"class":2698},[414,55486,3113],{"class":2601},[414,55488,55489],{"class":2705},"baseUrl",[414,55491,55492],{"class":2601},"}?${",[414,55494,38912],{"class":2705},[414,55496,3308],{"class":2601},[414,55498,2706],{"class":2705},[414,55500,55501],{"class":2593,"line":2751},[414,55502,2740],{"emptyLinePlaceholder":2459},[414,55504,55505],{"class":2593,"line":2760},[414,55506,55507],{"class":3527},"\u002F\u002F Make the request\n",[414,55509,55510,55513],{"class":2593,"line":2768},[414,55511,55512],{"class":2597},"fetch",[414,55514,55515],{"class":2705},"(url, {\n",[414,55517,55518,55520,55522],{"class":2593,"line":2776},[414,55519,24497],{"class":2705},[414,55521,24500],{"class":2601},[414,55523,2757],{"class":2705},[414,55525,55526],{"class":2593,"line":2784},[414,55527,24517],{"class":2705},[414,55529,55530,55533,55535,55537,55540,55542],{"class":2593,"line":2792},[414,55531,55532],{"class":2601},"    'Authorization'",[414,55534,7340],{"class":2705},[414,55536,24527],{"class":2601},[414,55538,55539],{"class":2607},"YOUR_API_KEY",[414,55541,3308],{"class":2601},[414,55543,2757],{"class":2705},[414,55545,55546,55549,55551],{"class":2593,"line":2804},[414,55547,55548],{"class":2601},"    'Accept'",[414,55550,7340],{"class":2705},[414,55552,29419],{"class":2601},[414,55554,55555],{"class":2593,"line":2809},[414,55556,4032],{"class":2705},[414,55558,55559],{"class":2593,"line":2829},[414,55560,41939],{"class":2705},[414,55562,55563,55565,55567,55569,55571,55573],{"class":2593,"line":2843},[414,55564,97],{"class":2705},[414,55566,29034],{"class":2597},[414,55568,2968],{"class":2705},[414,55570,28533],{"class":2971},[414,55572,29041],{"class":2698},[414,55574,2748],{"class":2705},[414,55576,55577,55579,55581,55583],{"class":2593,"line":2849},[414,55578,24386],{"class":2698},[414,55580,3970],{"class":2705},[414,55582,2837],{"class":2698},[414,55584,28516],{"class":2705},[414,55586,55587,55589,55591,55593,55595,55598,55600,55602,55604,55606],{"class":2593,"line":2854},[414,55588,28521],{"class":2698},[414,55590,2820],{"class":2698},[414,55592,25895],{"class":2597},[414,55594,2968],{"class":2705},[414,55596,55597],{"class":2601},"`HTTP error! status: ${",[414,55599,28533],{"class":2705},[414,55601,97],{"class":2601},[414,55603,20261],{"class":2705},[414,55605,3308],{"class":2601},[414,55607,3156],{"class":2705},[414,55609,55610],{"class":2593,"line":2880},[414,55611,4032],{"class":2705},[414,55613,55614,55616,55618,55620],{"class":2593,"line":3253},[414,55615,2999],{"class":2698},[414,55617,28557],{"class":2705},[414,55619,7325],{"class":2597},[414,55621,4088],{"class":2705},[414,55623,55624],{"class":2593,"line":3261},[414,55625,41939],{"class":2705},[414,55627,55628,55630,55632,55634,55636,55638],{"class":2593,"line":3279},[414,55629,97],{"class":2705},[414,55631,29034],{"class":2597},[414,55633,2968],{"class":2705},[414,55635,4432],{"class":2971},[414,55637,29041],{"class":2698},[414,55639,2748],{"class":2705},[414,55641,55642],{"class":2593,"line":3313},[414,55643,55644],{"class":3527},"  \u002F\u002F Loop through each integration and log its auth details\n",[414,55646,55647,55650,55653,55655,55657,55659],{"class":2593,"line":3326},[414,55648,55649],{"class":2705},"  integrations.",[414,55651,55652],{"class":2597},"forEach",[414,55654,2968],{"class":2705},[414,55656,24269],{"class":2971},[414,55658,29041],{"class":2698},[414,55660,2748],{"class":2705},[414,55662,55663,55665,55667,55669,55672,55674,55677,55679,55681,55683,55686],{"class":2593,"line":3339},[414,55664,28184],{"class":2705},[414,55666,4064],{"class":2597},[414,55668,2968],{"class":2705},[414,55670,55671],{"class":2601},"`",[414,55673,3352],{"class":2607},[414,55675,55676],{"class":2601},"=== ${",[414,55678,24269],{"class":2705},[414,55680,97],{"class":2601},[414,55682,9043],{"class":2705},[414,55684,55685],{"class":2601},"} ===`",[414,55687,3156],{"class":2705},[414,55689,55690],{"class":2593,"line":3359},[414,55691,29053],{"class":2705},[414,55693,55694],{"class":2593,"line":6453},[414,55695,55696],{"class":3527},"    \u002F\u002F Log token information if it exists\n",[414,55698,55699,55701,55704,55706,55709,55711,55713,55715],{"class":2593,"line":6459},[414,55700,25828],{"class":2698},[414,55702,55703],{"class":2705}," (integration.token_names ",[414,55705,25072],{"class":2698},[414,55707,55708],{"class":2705}," integration.token_names.",[414,55710,25098],{"class":2607},[414,55712,38823],{"class":2698},[414,55714,24954],{"class":2607},[414,55716,3826],{"class":2705},[414,55718,55719,55721,55723,55725,55728],{"class":2593,"line":6465},[414,55720,30963],{"class":2705},[414,55722,4064],{"class":2597},[414,55724,2968],{"class":2705},[414,55726,55727],{"class":2601},"'Required credentials:'",[414,55729,55730],{"class":2705},", integration.token_names);\n",[414,55732,55733,55735,55737,55739,55742],{"class":2593,"line":6471},[414,55734,30963],{"class":2705},[414,55736,4064],{"class":2597},[414,55738,2968],{"class":2705},[414,55740,55741],{"class":2601},"'How to find credentials:'",[414,55743,3156],{"class":2705},[414,55745,55746,55749,55751,55753,55756,55758,55760,55762,55764],{"class":2593,"line":6477},[414,55747,55748],{"class":2705},"      integration.token_instructions?.",[414,55750,55652],{"class":2597},[414,55752,3096],{"class":2705},[414,55754,55755],{"class":2971},"instruction",[414,55757,319],{"class":2705},[414,55759,2893],{"class":2971},[414,55761,3107],{"class":2705},[414,55763,3110],{"class":2698},[414,55765,2748],{"class":2705},[414,55767,55768,55771,55773,55775,55777,55779,55781,55784,55787,55789,55791],{"class":2593,"line":6483},[414,55769,55770],{"class":2705},"        console.",[414,55772,4064],{"class":2597},[414,55774,2968],{"class":2705},[414,55776,40200],{"class":2601},[414,55778,2893],{"class":2705},[414,55780,18276],{"class":2698},[414,55782,55783],{"class":2607}," 1",[414,55785,55786],{"class":2601},"}. ${",[414,55788,55755],{"class":2705},[414,55790,3308],{"class":2601},[414,55792,3156],{"class":2705},[414,55794,55795],{"class":2593,"line":6489},[414,55796,30901],{"class":2705},[414,55798,55799,55801,55803],{"class":2593,"line":6495},[414,55800,30195],{"class":2705},[414,55802,25123],{"class":2698},[414,55804,2748],{"class":2705},[414,55806,55807,55809,55811,55813,55816],{"class":2593,"line":6501},[414,55808,30963],{"class":2705},[414,55810,4064],{"class":2597},[414,55812,2968],{"class":2705},[414,55814,55815],{"class":2601},"'No token credentials required (likely uses OAuth)'",[414,55817,3156],{"class":2705},[414,55819,55820],{"class":2593,"line":6507},[414,55821,10535],{"class":2705},[414,55823,55824],{"class":2593,"line":6513},[414,55825,3030],{"class":2705},[414,55827,55828],{"class":2593,"line":6519},[414,55829,41939],{"class":2705},[414,55831,55832,55834,55836,55838,55840,55842],{"class":2593,"line":6525},[414,55833,97],{"class":2705},[414,55835,30955],{"class":2597},[414,55837,2968],{"class":2705},[414,55839,30966],{"class":2971},[414,55841,29041],{"class":2698},[414,55843,2748],{"class":2705},[414,55845,55846,55848,55850,55852,55855],{"class":2593,"line":6531},[414,55847,4061],{"class":2705},[414,55849,30966],{"class":2597},[414,55851,2968],{"class":2705},[414,55853,55854],{"class":2601},"'Error fetching integrations:'",[414,55856,30974],{"class":2705},[414,55858,55859],{"class":2593,"line":6537},[414,55860,2846],{"class":2705},[414,55862,55863],{"class":2593,"line":6543},[414,55864,2740],{"emptyLinePlaceholder":2459},[414,55866,55867],{"class":2593,"line":6549},[414,55868,55869],{"class":3527},"\u002F* Example output:\n",[414,55871,55872],{"class":2593,"line":6555},[414,55873,2740],{"emptyLinePlaceholder":2459},[414,55875,55876],{"class":2593,"line":6561},[414,55877,55878],{"class":3527},"=== ActiveCampaign ===\n",[414,55880,55881],{"class":2593,"line":6567},[414,55882,55883],{"class":3527},"Required credentials: [\"API Key\", \"Domain\"]\n",[414,55885,55886],{"class":2593,"line":6573},[414,55887,55888],{"class":3527},"How to find credentials:\n",[414,55890,55891],{"class":2593,"line":6579},[414,55892,55893],{"class":3527},"1. Your API key can be found in your account on the Settings page under the \"Developer\" tab...\n",[414,55895,55896],{"class":2593,"line":6585},[414,55897,55898],{"class":3527},"2. Your API URL can be found in your account on the My Settings page under the \"Developer\" tab...\n",[414,55900,55901],{"class":2593,"line":6591},[414,55902,2740],{"emptyLinePlaceholder":2459},[414,55904,55905],{"class":2593,"line":6597},[414,55906,55907],{"class":3527},"=== HubSpot ===\n",[414,55909,55910],{"class":2593,"line":6603},[414,55911,55912],{"class":3527},"No token credentials required (likely uses OAuth)\n",[414,55914,55915],{"class":2593,"line":6609},[414,55916,2740],{"emptyLinePlaceholder":2459},[414,55918,55919],{"class":2593,"line":6615},[414,55920,55921],{"class":3527},"*\u002F\n",[22,55923,55924,34,55926,97],{},[31,55925,28958],{},[41,55927,55930],{"href":55928,"rel":55929},"https:\u002F\u002Fdocs.unified.to\u002Funified\u002Fintegration\u002FReturns_all_integrations",[45],"Get all integrations",[55,55932,55934],{"id":55933},"import-an-api-token-integration","Import an API token integration",[22,55936,55937],{},"For single-token integrations, construct your connection object:",[2584,55939,55941],{"className":7323,"code":55940,"language":7325,"meta":2433,"style":2433},"{\n  \"integration_type\": NAME_OF_INTEGRATION,\n  \"permissions\": [PERMISSIONS],\n  \"categories\": [CATEGORIES],\n  \"environment\": \"Production\", \u002F\u002F or any other non-sandbox environment\n  \"auth\": {\n    \"token\": \"your_customer_token\"\n  }\n}\n",[36,55942,55943,55947,55958,55969,55980,55993,55999,56009,56013],{"__ignoreMap":2433},[414,55944,55945],{"class":2593,"line":2594},[414,55946,8916],{"class":2705},[414,55948,55949,55951,55953,55956],{"class":2593,"line":2434},[414,55950,53394],{"class":2607},[414,55952,7340],{"class":2705},[414,55954,55955],{"class":7401},"NAME_OF_INTEGRATION",[414,55957,2757],{"class":2705},[414,55959,55960,55962,55964,55967],{"class":2593,"line":2613},[414,55961,53418],{"class":2607},[414,55963,10492],{"class":2705},[414,55965,55966],{"class":7401},"PERMISSIONS",[414,55968,10497],{"class":2705},[414,55970,55971,55973,55975,55978],{"class":2593,"line":2625},[414,55972,53406],{"class":2607},[414,55974,10492],{"class":2705},[414,55976,55977],{"class":7401},"CATEGORIES",[414,55979,10497],{"class":2705},[414,55981,55982,55984,55986,55988,55990],{"class":2593,"line":2677},[414,55983,53455],{"class":2607},[414,55985,7340],{"class":2705},[414,55987,53460],{"class":2601},[414,55989,319],{"class":2705},[414,55991,55992],{"class":3527},"\u002F\u002F or any other non-sandbox environment\n",[414,55994,55995,55997],{"class":2593,"line":2751},[414,55996,53479],{"class":2607},[414,55998,10477],{"class":2705},[414,56000,56001,56004,56006],{"class":2593,"line":2760},[414,56002,56003],{"class":2607},"    \"token\"",[414,56005,7340],{"class":2705},[414,56007,56008],{"class":2601},"\"your_customer_token\"\n",[414,56010,56011],{"class":2593,"line":2768},[414,56012,4032],{"class":2705},[414,56014,56015],{"class":2593,"line":2776},[414,56016,3035],{"class":2705},[22,56018,56019,56020,56022],{},"For multi-field token integrations, use the ",[36,56021,53346],{}," array:",[2584,56024,56026],{"className":7323,"code":56025,"language":7325,"meta":2433,"style":2433},"{\n  \"integration_type\": NAME_OF_INTEGRATION,\n  \"permissions\": [PERMISSIONS],\n  \"categories\": [CATEGORIES],\n  \"environment\": \"Production\", \u002F\u002F  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",[36,56027,56028,56032,56042,56052,56062,56075,56081,56089,56098,56105,56110,56115,56119],{"__ignoreMap":2433},[414,56029,56030],{"class":2593,"line":2594},[414,56031,8916],{"class":2705},[414,56033,56034,56036,56038,56040],{"class":2593,"line":2434},[414,56035,53394],{"class":2607},[414,56037,7340],{"class":2705},[414,56039,55955],{"class":7401},[414,56041,2757],{"class":2705},[414,56043,56044,56046,56048,56050],{"class":2593,"line":2613},[414,56045,53418],{"class":2607},[414,56047,10492],{"class":2705},[414,56049,55966],{"class":7401},[414,56051,10497],{"class":2705},[414,56053,56054,56056,56058,56060],{"class":2593,"line":2625},[414,56055,53406],{"class":2607},[414,56057,10492],{"class":2705},[414,56059,55977],{"class":7401},[414,56061,10497],{"class":2705},[414,56063,56064,56066,56068,56070,56072],{"class":2593,"line":2677},[414,56065,53455],{"class":2607},[414,56067,7340],{"class":2705},[414,56069,53460],{"class":2601},[414,56071,319],{"class":2705},[414,56073,56074],{"class":3527},"\u002F\u002F  or any other non-sandbox environment\n",[414,56076,56077,56079],{"class":2593,"line":2751},[414,56078,53479],{"class":2607},[414,56080,10477],{"class":2705},[414,56082,56083,56085,56087],{"class":2593,"line":2760},[414,56084,56003],{"class":2607},[414,56086,7340],{"class":2705},[414,56088,56008],{"class":2601},[414,56090,56091,56094,56096],{"class":2593,"line":2768},[414,56092,56093],{"class":2601},"    \"other_auth_info\"",[414,56095,2646],{"class":7401},[414,56097,3258],{"class":2705},[414,56099,56100,56103],{"class":2593,"line":2776},[414,56101,56102],{"class":2601},"      \"first_credential\"",[414,56104,2757],{"class":2705},[414,56106,56107],{"class":2593,"line":2784},[414,56108,56109],{"class":2601},"      \"second_credential\"\n",[414,56111,56112],{"class":2593,"line":2792},[414,56113,56114],{"class":2705},"    ]\n",[414,56116,56117],{"class":2593,"line":2804},[414,56118,4032],{"class":2705},[414,56120,56121],{"class":2593,"line":2809},[414,56122,3035],{"class":2705},[22,56124,56125,56127,56128,56130,56131,56133],{},[31,56126,5164],{},": The order of credentials in ",[36,56129,53346],{}," must match the order of the ",[36,56132,55404],{}," from the integration instructions (see above).",[55,56135,56137],{"id":56136},"import-an-oauth-20-integration","Import an OAuth 2.0 integration",[2510,56139,56140],{},[2357,56141,56142],{},"Construct your connection object with the OAuth credentials:",[2584,56144,56146],{"className":7323,"code":56145,"language":7325,"meta":2433,"style":2433},"{\n  \"integration_type\": \"NAME_OF_INTEGRATION\",\n  \"permissions\": [\"PERMISSIONS\"],\n  \"categories\": [\"CATEGORIES\"],\n  \"environment\": \"Production\",\n  \"auth\": {\n    \"access_token\": \"customer_access_token\",\n    \"refresh_token\": \"customer_refresh_token\",\n    \"expires_in\": 3599,\n    \"api_url\": \"https:\u002F\u002Fcompany.example.com\",\n    \"emails\": [\"user@example.com\"],\n    \"name\": \"User Name\"\n  }\n}\n",[36,56147,56148,56152,56163,56174,56185,56195,56201,56212,56223,56233,56244,56256,56265,56269],{"__ignoreMap":2433},[414,56149,56150],{"class":2593,"line":2594},[414,56151,8916],{"class":2705},[414,56153,56154,56156,56158,56161],{"class":2593,"line":2434},[414,56155,53394],{"class":2607},[414,56157,7340],{"class":2705},[414,56159,56160],{"class":2601},"\"NAME_OF_INTEGRATION\"",[414,56162,2757],{"class":2705},[414,56164,56165,56167,56169,56172],{"class":2593,"line":2613},[414,56166,53418],{"class":2607},[414,56168,10492],{"class":2705},[414,56170,56171],{"class":2601},"\"PERMISSIONS\"",[414,56173,10497],{"class":2705},[414,56175,56176,56178,56180,56183],{"class":2593,"line":2625},[414,56177,53406],{"class":2607},[414,56179,10492],{"class":2705},[414,56181,56182],{"class":2601},"\"CATEGORIES\"",[414,56184,10497],{"class":2705},[414,56186,56187,56189,56191,56193],{"class":2593,"line":2677},[414,56188,53455],{"class":2607},[414,56190,7340],{"class":2705},[414,56192,53460],{"class":2601},[414,56194,2757],{"class":2705},[414,56196,56197,56199],{"class":2593,"line":2751},[414,56198,53479],{"class":2607},[414,56200,10477],{"class":2705},[414,56202,56203,56205,56207,56210],{"class":2593,"line":2760},[414,56204,53486],{"class":2607},[414,56206,7340],{"class":2705},[414,56208,56209],{"class":2601},"\"customer_access_token\"",[414,56211,2757],{"class":2705},[414,56213,56214,56216,56218,56221],{"class":2593,"line":2768},[414,56215,53498],{"class":2607},[414,56217,7340],{"class":2705},[414,56219,56220],{"class":2601},"\"customer_refresh_token\"",[414,56222,2757],{"class":2705},[414,56224,56225,56227,56229,56231],{"class":2593,"line":2776},[414,56226,53509],{"class":2607},[414,56228,7340],{"class":2705},[414,56230,53514],{"class":2607},[414,56232,2757],{"class":2705},[414,56234,56235,56237,56239,56242],{"class":2593,"line":2784},[414,56236,53521],{"class":2607},[414,56238,7340],{"class":2705},[414,56240,56241],{"class":2601},"\"https:\u002F\u002Fcompany.example.com\"",[414,56243,2757],{"class":2705},[414,56245,56246,56249,56251,56254],{"class":2593,"line":2792},[414,56247,56248],{"class":2607},"    \"emails\"",[414,56250,10492],{"class":2705},[414,56252,56253],{"class":2601},"\"user@example.com\"",[414,56255,10497],{"class":2705},[414,56257,56258,56260,56262],{"class":2593,"line":2804},[414,56259,38476],{"class":2607},[414,56261,7340],{"class":2705},[414,56263,56264],{"class":2601},"\"User Name\"\n",[414,56266,56267],{"class":2593,"line":2809},[414,56268,4032],{"class":2705},[414,56270,56271],{"class":2593,"line":2829},[414,56272,3035],{"class":2705},[2510,56274,56275],{},[2357,56276,56277],{},"Choose the redirect \u002F callback model that matches your product:",[22,56279,56280,2646],{},[31,56281,8570],{},[2354,56283,56284,56290,56293,56300],{},[2357,56285,37296,56286,56289],{},[36,56287,56288],{},"expiry_date"," to the token's expiration date (if known) or today's date.",[2357,56291,56292],{},"Include the authenticating user's email and name if available.",[2357,56294,56295,56297,56298,97],{},[31,56296,53192],{}," set the provider redirect URI to ",[36,56299,21741],{},[2357,56301,56302,56305,56306,97],{},[31,56303,56304],{},"BYO \u002F Marketplace callback:"," keep your own callback URL when the provider requires your app to own install (and often uninstall) on a single URL. Exchange the code on your server, then import the resulting tokens into Unified. Handle uninstall on your callback and call ",[36,56307,53361],{},[3629,56309,56311],{"id":56310},"dual-auth-integrations-and-company-hosts","Dual-auth integrations and company hosts",[22,56313,56314,56315,56317],{},"Some integrations support both OAuth and API-token auth, and\u002For return a per-tenant API host in the token response (commonly copied onto ",[36,56316,53332],{},"). For OAuth imports:",[2354,56319,56320,56331,56344,56355],{},[2357,56321,56322,56323,10753,56325,56327,56328,56330],{},"Include ",[36,56324,53316],{},[36,56326,53319],{}," (and ",[36,56329,53572],{}," when known).",[2357,56332,56333,56334,56336,56337,56340,56341,56343],{},"If the token response includes a company\u002Finstance URL, set ",[36,56335,53332],{}," to that value. Only send fields on the Unified connection ",[36,56338,56339],{},"auth"," schema (e.g. ",[36,56342,53373],{},") — vendor-only field names may be rejected by validation.",[2357,56345,56346,56347,56349,56350,10753,56352,56354],{},"Activate the integration in Unified with the ",[31,56348,24574],{}," OAuth app ",[36,56351,7513],{},[36,56353,21715],{}," that issued the tokens, so refresh works.",[2357,56356,56357,56358,56360],{},"Omit ",[36,56359,53346],{}," on OAuth imports (see warning below).",[4937,56362,56363],{},[22,56364,16093,56365,56368,56369,56371,56372,56374,56375,56377,56378,56380,56381,56383],{},[31,56366,56367],{},"Dual-auth integrations"," (integrations that support both OAuth and API-token auth): do ",[31,56370,8239],{}," include ",[36,56373,53346],{}," on an OAuth import. If ",[36,56376,53346],{}," is present, Unified uses API-token mode instead of Bearer, which can return 401 even when your OAuth tokens are valid. Use ",[36,56379,53346],{}," only for API-token imports (values in ",[36,56382,55404],{}," order).",[55,56385,56387],{"id":56386},"create-the-connection","Create the connection",[22,56389,56390,56391,2646],{},"Make a POST request to create the connection. Example using ",[36,56392,18073],{},[2584,56394,56396],{"className":17934,"code":56395,"language":17936,"meta":2433,"style":2433},"curl -X POST \"\u003Chttps:\u002F\u002Fapi.unified.to\u002Funified\u002Fconnection>\" \\\\\n  -H \"Authorization: Bearer YOUR_API_KEY\" \\\\\n  -H \"Content-Type: application\u002Fjson\" \\\\\n  -d '{\n    \"integration_type\": \"your_integration_type\",\n    \"permissions\": [\"required_permissions\"],\n    \"categories\": [\"integration_category\"],\n    \"auth\": {\n      \u002F\u002F Your auth object here\n    }\n  }'\n",[36,56397,56398,56412,56421,56429,56435,56440,56445,56450,56455,56460,56464],{"__ignoreMap":2433},[414,56399,56400,56402,56404,56406,56409],{"class":2593,"line":2594},[414,56401,18073],{"class":2597},[414,56403,18076],{"class":2607},[414,56405,18079],{"class":2601},[414,56407,56408],{"class":2601}," \"\u003Chttps:\u002F\u002Fapi.unified.to\u002Funified\u002Fconnection>\"",[414,56410,56411],{"class":2607}," \\\\\n",[414,56413,56414,56416,56419],{"class":2593,"line":2434},[414,56415,18090],{"class":2607},[414,56417,56418],{"class":2601}," \"Authorization: Bearer YOUR_API_KEY\"",[414,56420,56411],{"class":2607},[414,56422,56423,56425,56427],{"class":2593,"line":2613},[414,56424,18090],{"class":2607},[414,56426,18107],{"class":2601},[414,56428,56411],{"class":2607},[414,56430,56431,56433],{"class":2593,"line":2625},[414,56432,18114],{"class":2607},[414,56434,18117],{"class":2601},[414,56436,56437],{"class":2593,"line":2677},[414,56438,56439],{"class":2601},"    \"integration_type\": \"your_integration_type\",\n",[414,56441,56442],{"class":2593,"line":2751},[414,56443,56444],{"class":2601},"    \"permissions\": [\"required_permissions\"],\n",[414,56446,56447],{"class":2593,"line":2760},[414,56448,56449],{"class":2601},"    \"categories\": [\"integration_category\"],\n",[414,56451,56452],{"class":2593,"line":2768},[414,56453,56454],{"class":2601},"    \"auth\": {\n",[414,56456,56457],{"class":2593,"line":2776},[414,56458,56459],{"class":2601},"      \u002F\u002F Your auth object here\n",[414,56461,56462],{"class":2593,"line":2784},[414,56463,10535],{"class":2601},[414,56465,56466],{"class":2593,"line":2792},[414,56467,5047],{"class":2601},[22,56469,56470,7340,56472],{},[31,56471,28763],{},[41,56473,56476],{"href":56474,"rel":56475},"https:\u002F\u002Fdocs.unified.to\u002Funified\u002Fconnection\u002FCreate_connection",[45],"Create a connection",[55,56478,56480],{"id":56479},"test-the-imported-connection","Test the imported connection",[22,56482,56483],{},"After creating the connection:",[2510,56485,56486,56489,56492],{},[2357,56487,56488],{},"Note the connection ID from the response.",[2357,56490,56491],{},"Make a test API call using the new connection ID to verify it works.",[2357,56493,56494],{},"If the call fails, check the error message and verify your auth credentials.",[55,56496,56498],{"id":56497},"best-practices-when-importing-a-connection","Best practices when importing a connection",[2354,56500,56501,56507,56513,56516,56522,56528],{},[2357,56502,56503,56504,56506],{},"Always include relevant ",[36,56505,38588],{}," for the minimum set of data access you require.",[2357,56508,56509,56510,97],{},"Use a non-sandbox ",[36,56511,56512],{},"environment",[2357,56514,56515],{},"Store the connection ID securely for future API calls.",[2357,56517,56518,56519,56521],{},"Consider adding ",[36,56520,24431],{}," to link the connection to your customer's ID.",[2357,56523,56524,56525,56527],{},"Never mix OAuth tokens with ",[36,56526,53346],{}," on the same connection for dual-auth integrations.",[2357,56529,56530,56531,56533],{},"If the provider returns a company\u002Finstance URL in the token response, include it as ",[36,56532,53373],{}," on import.",[55,56535,37023],{"id":37022},[2354,56537,56538,56545,56551],{},[2357,56539,56540],{},[41,56541,56544],{"href":56542,"rel":56543},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_associate_a_connection_id_with_your_end_user#how-to-associate-a-connection-id-with-your-end-user",[45],"How to associate a connection ID with your end-user",[2357,56546,56547],{},[41,56548,16751],{"href":56549,"rel":56550},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_troubleshoot_unhealthy_connections#how-to-troubleshoot-unhealthy-connections",[45],[2357,56552,56553],{},[41,56554,5733],{"href":5731,"rel":56555},[45],[4156,56557,56558],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sgQC_, html code.shiki .sgQC_{--shiki-default:#FDAEB7;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic;--shiki-light:#B31D28;--shiki-light-font-style:italic}",{"title":2433,"searchDepth":2434,"depth":2434,"links":56560},[56561,56562,56563,56567,56568,56569,56572,56573,56574,56575],{"id":55293,"depth":2434,"text":55294},{"id":4889,"depth":2434,"text":4890},{"id":55347,"depth":2434,"text":55348,"children":56564},[56565,56566],{"id":55354,"depth":2613,"text":55355},{"id":55366,"depth":2613,"text":55367},{"id":55381,"depth":2434,"text":55382},{"id":55933,"depth":2434,"text":55934},{"id":56136,"depth":2434,"text":56137,"children":56570},[56571],{"id":56310,"depth":2613,"text":56311},{"id":56386,"depth":2434,"text":56387},{"id":56479,"depth":2434,"text":56480},{"id":56497,"depth":2434,"text":56498},{"id":37022,"depth":2434,"text":37023},"This guide explains how to import your existing integrations into Unified.to, effectively creating new connections using your existing customer credentials. A...",{"img":56578,"date":56579,"updated":56580,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_migrate_or_import_your_integrations_into_unified-icon.webp","2024-10-25T00:00:00.000Z","2026-10-09T13:36:14.640Z","\u002Fguides\u002Fhow_to_migrate_or_import_your_integrations_into_unified",{"title":53547,"description":56576},"guides\u002Fhow_to_migrate_or_import_your_integrations_into_unified","e1DVtSrR8xTPCtETR0QbQPkV6z3XA5hQyDIexeYBv1Y",{"id":56586,"title":56587,"body":56588,"description":56670,"extension":2452,"meta":56671,"navigation":2459,"path":56675,"seo":56676,"stem":56677,"__hash__":56678},"guides\u002Fguides\u002Fhow_to_obtain_your_github_oauth2_credentials.md","How to obtain your GitHub OAuth2 credentials",{"type":12,"value":56589,"toc":56668},[56590,56593,56595,56599,56607,56612,56621,56628,56633,56640,56645,56656,56661],[15,56591,56587],{"id":56592},"how-to-obtain-your-github-oauth2-credentials",[19,56594],{},[22,56596,56597],{},[25,56598,52234],{},[22,56600,56601,56602,2646],{},"In order to set up OAuth2 for Github, you need to create a new OAuth application in your ",[41,56603,56606],{"href":56604,"rel":56605},"https:\u002F\u002Fgithub.com\u002Fsettings\u002Fapplications\u002Fnew",[45],"GitHub developer settings",[22,56608,56609],{},[4201,56610],{"alt":20627,"src":56611},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_obtain_your_github_oauth2_credentials-0.png",[22,56613,56614,56615,97],{},"Make sure to fill in the appropriate details, but more importantly the Authorization Callback URL, set to ",[41,56616,56619],{"href":56617,"rel":56618},"https:\u002F\u002Flocalhost:8080\u002F_renarde\u002Fsecurity\u002Fgithub-success",[45],[36,56620,21741],{},[22,56622,56623,56624,56627],{},"Now click on ",[36,56625,56626],{},"Register application"," and you'll be shown your application page:",[22,56629,56630],{},[4201,56631],{"alt":20627,"src":56632},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_obtain_your_github_oauth2_credentials-1.png",[22,56634,56635,56636,56639],{},"You need to click on ",[36,56637,56638],{},"Generate a new client secret",", 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):",[22,56641,56642],{},[4201,56643],{"alt":20627,"src":56644},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_obtain_your_github_oauth2_credentials-2.png",[22,56646,56647,56648,56651,56652],{},"Take your GitHub clientID and clientSecret and add them to the ",[41,56649,123],{"href":121,"rel":56650},[45]," integration settings for Github at ",[41,56653,56654],{"href":56654,"rel":56655},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fgithub",[45],[22,56657,56658],{},[4201,56659],{"alt":20627,"src":56660},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_obtain_your_github_oauth2_credentials-3.png",[22,56662,56663,56664,56667],{},"You will now be ready to use GitHub on ",[41,56665,123],{"href":121,"rel":56666},[45]," realtime unified API.",{"title":2433,"searchDepth":2434,"depth":2434,"links":56669},[],"In order to set up OAuth2 for Github, you need to create a new OAuth application in your GitHub developer settings,",{"img":56672,"date":52433,"updated":56673,"tag":2457,"integrations":56674},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_obtain_your_github_oauth2_credentials-icon.png","2026-08-23T14:54:00.602Z","github","\u002Fguides\u002Fhow_to_obtain_your_github_oauth2_credentials",{"title":56587,"description":56670},"guides\u002Fhow_to_obtain_your_github_oauth2_credentials","R68p0R09PD-rgxcNoV20DWVKj6FuPLP0q7gjAPSbcjo",{"id":56680,"title":56681,"body":56682,"description":56886,"extension":2452,"meta":56887,"navigation":2459,"path":56891,"seo":56892,"stem":56893,"__hash__":56894},"guides\u002Fguides\u002Fhow_to_power_claude_with_live_customer_data_using_unified_mcp.md","How to Power Claude with Live Customer Data Using Unified MCP",{"type":12,"value":56683,"toc":56879},[56684,56687,56689,56694,56700,56708,56711,56714,56718,56721,56724,56735,56739,56742,56747,56750,56755,56758,56762,56765,56768,56781,56784,56787,56791,56794,56808,56811,56815,56818,56823,56826,56843,56846,56849,56869],[15,56685,56681],{"id":56686},"how-to-power-claude-with-live-customer-data-using-unified-mcp",[19,56688],{},[22,56690,56691],{},[25,56692,56693],{},"May 28, 2025",[22,56695,56696],{},[4201,56697],{"alt":56698,"src":56699},"MCPSERVER.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_power_claude_with_live_customer_data_using_unified_mcp-0.png",[22,56701,56702,56703,56707],{},"If you're building your software application with Anthropic's LLM API ",[41,56704,41],{"href":56705,"rel":56706},"https:\u002F\u002Fclaude.ai\u002F",[45],"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.",[22,56709,56710],{},"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 MCP server and launch even faster.",[22,56712,56713],{},"We'll break down when to use Unified's MCP server, and when to reach for the API instead.",[55,56715,56717],{"id":56716},"how-unifieds-mcp-server-works","How Unified's MCP Server Works",[22,56719,56720],{},"Unified's MCP Server exposes real, user-authorized SaaS integrations to any LLM that supports Model Context Protocol.",[22,56722,56723],{},"Anthropic's API, Claude or Cursor can:",[2354,56725,56726,56729,56732],{},[2357,56727,56728],{},"Discover tools based on a given Unified connection",[2357,56730,56731],{},"Call those tools directly through our MCP endpoint",[2357,56733,56734],{},"Use the result in its next generation step",[55,56736,56738],{"id":56737},"two-paths-api-vs-mcp","Two Paths: API vs MCP",[22,56740,56741],{},"Unified supports two integration interfaces:",[22,56743,56744],{},[31,56745,56746],{},"1. Unified API (Backend Integration)",[22,56748,56749],{},"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.",[22,56751,56752],{},[31,56753,56754],{},"2. Unified MCP Server (Direct-to-LLM)",[22,56756,56757],{},"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.",[55,56759,56761],{"id":56760},"why-claude-mcp-is-the-best-fit","Why Claude + MCP Is the Best Fit",[22,56763,56764],{},"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.",[22,56766,56767],{},"With MCP, you now have two ways to access your customer's data:",[2510,56769,56770,56775],{},[2357,56771,9188,56772,56774],{},[31,56773,8712],{}," and call it from your backend",[2357,56776,36421,56777,56780],{},[31,56778,56779],{},"Anthropic API"," at Unified's MCP Server and let it fetch tools on its own",[22,56782,56783],{},"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.",[22,56785,56786],{},"That's always been the promise of a Unified API: do less glue work and ship faster. MCP just makes that even more direct.",[55,56788,56790],{"id":56789},"what-to-do-if-youre-building-for-scale","What to Do if You're Building for Scale",[22,56792,56793],{},"If your product is heading toward scale, especially if it requires logging, observability, or context-aware data access, the better path is:",[2510,56795,56796,56799,56802,56805],{},[2357,56797,56798],{},"Use the Unified API to fetch and normalize data",[2357,56800,56801],{},"Store and filter what matters",[2357,56803,56804],{},"Embed it into a vector database",[2357,56806,56807],{},"Let your LLM consume it through whatever interface makes sense",[22,56809,56810],{},"MCP is a fast path to working demos. The API is your infrastructure.",[55,56812,56814],{"id":56813},"example-flow","Example Flow",[22,56816,56817],{},"Claude gets this prompt:",[4937,56819,56820],{},[22,56821,56822],{},"'Post a message to #sales about the new signed deal.'",[22,56824,56825],{},"It:",[2510,56827,56828,56834,56837,56840],{},[2357,56829,56830,56831,2980],{},"Identifies a tool call (e.g. ",[36,56832,56833],{},"send-slack-message",[2357,56835,56836],{},"Sends the tool and parameters to Unified's MCP Server",[2357,56838,56839],{},"Unified makes the call to Slack using the user's connection",[2357,56841,56842],{},"Claude receives the result and continues the conversation",[22,56844,56845],{},"No servers, no APIs, no code in between.",[22,56847,56848],{},"Unified's MCP Server runs in production over Streamable HTTP, with one host per region (US, EU and AU). It supports any authenticated connection, works with Claude or Cursor, and helps you wire up AI features fast without touching infrastructure.",[22,56850,56851,56852,26856,56855,56860,56861,56864,56865,56868],{},"Building the integration itself with a coding agent? ",[41,56853,123],{"href":121,"rel":56854},[45],[41,56856,56859],{"href":56857,"rel":56858},"https:\u002F\u002Fdocs.unified.to\u002Fskills\u002Finstall",[45],"Agent Skills"," give coding agents such as Claude Code, Codex and Cursor a ",[36,56862,56863],{},"SKILL.md"," for each ",[41,56866,123],{"href":121,"rel":56867},[45]," API, and the Claude Code plugin adds the Core MCP server in the same install.",[22,56870,56871,4149,56875,97],{},[41,56872,56874],{"href":41463,"rel":56873},[45],"Read the MCP docs",[41,56876,56878],{"href":21420,"rel":56877},[45],"start your 30-day free trial",{"title":2433,"searchDepth":2434,"depth":2434,"links":56880},[56881,56882,56883,56884,56885],{"id":56716,"depth":2434,"text":56717},{"id":56737,"depth":2434,"text":56738},{"id":56760,"depth":2434,"text":56761},{"id":56789,"depth":2434,"text":56790},{"id":56813,"depth":2434,"text":56814},"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...",{"img":56888,"date":56889,"updated":56890,"tag":2457,"integrations":39207},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_power_claude_with_live_customer_data_using_unified_mcp-icon.webp","2025-05-28T00:00:00.000Z","2026-10-09T13:37:08.395Z","\u002Fguides\u002Fhow_to_power_claude_with_live_customer_data_using_unified_mcp",{"title":56681,"description":56886},"guides\u002Fhow_to_power_claude_with_live_customer_data_using_unified_mcp","S8fpYpFA8IoVKzMLrgf28pxEwHA7gUeLexLAkBd83Hk",{"id":56896,"title":56897,"body":56898,"description":57200,"extension":2452,"meta":57201,"navigation":2459,"path":57206,"seo":57207,"stem":57208,"__hash__":57209},"guides\u002Fguides\u002Fhow_to_register_a_google_developer_app_and_get_oauth_2_credentials.md","How to register a Google developer app and get OAuth 2 credentials",{"type":12,"value":56899,"toc":57198},[56900,56903,56905,56910,56932,57157,57162,57179,57184,57193],[15,56901,56897],{"id":56902},"how-to-register-a-google-developer-app-and-get-oauth-2-credentials",[19,56904],{},[22,56906,56907],{},[25,56908,56909],{},"May 29, 2025",[4937,56911,56912],{},[22,56913,56914,56915,56917,56918,4149,56921,56924,56925,56927,56928,97],{},"💡 ",[31,56916,4943],{}," that if you use ",[36,56919,56920],{},"Restricted",[36,56922,56923],{},"Sensitive"," Scopes you need to contact Unified's Support to setup a CNAME for the API URL (US and EU regions) in order to get your App approved by Google",[5888,56926],{},"\nCheck ",[41,56929,56930],{"href":56930,"rel":56931},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_set_up_a_custom_api_url",[45],[2510,56933,56934,56954,57004,57035,57109],{},[2357,56935,56936,56939],{},[31,56937,56938],{},"Create a Google Cloud Platform project:",[2354,56940,56941,56948,56951],{},[2357,56942,56943,56944,56947],{},"Go to the Google Cloud Console (",[41,56945,7097],{"href":7097,"rel":56946},[45],") and sign in.",[2357,56949,56950],{},"If you don't have a project, click the \"Select a project\" dropdown and choose \"New Project\".",[2357,56952,56953],{},"Give your project a name and click \"Create\".",[2357,56955,56956,56959],{},[31,56957,56958],{},"Enable the Necessary APIs",[2354,56960,56961,56964,56981,56995,56998],{},[2357,56962,56963],{},"In the Google Cloud Console, make sure your newly created or existing project is selected.",[2357,56965,16270,56966,56973,56976],{},[41,56967,56970],{"href":56968,"rel":56969},"https:\u002F\u002Fconsole.cloud.google.com\u002Fapis\u002Flibrary",[45],[31,56971,56972],{},"APIs & Services",[41,56974,45999],{"href":56968,"rel":56975},[45],[41,56977,56979],{"href":56968,"rel":56978},[45],[31,56980,52514],{},[2357,56982,56983,56984],{},"Search for the specific API you want to use (e.g., \"Gmail API\", \"Google Drive API\", 'Google Calendar API').\n",[2354,56985,56986],{},[2357,56987,56988,56989,56994],{},"For Google Directory, make sure that you have the",[41,56990,56993],{"href":56991,"rel":56992},"https:\u002F\u002Fconsole.cloud.google.com\u002Fapis\u002Flibrary\u002Fadmin.googleapis.com",[45]," Admin SDK API ","enabled.",[2357,56996,56997],{},"Click on the API from the search results.",[2357,56999,57000,57001,57003],{},"Click the \"",[31,57002,7129],{},"\" button. Repeat this for all Google APIs your application will need to access",[2357,57005,57006,57009],{},[31,57007,57008],{},"Configure the OAuth Consent Screen",[2354,57010,57011,57019,57024,57027],{},[2357,57012,57013,57014],{},"In the Google Cloud Console, go to ",[41,57015,57018],{"href":57016,"rel":57017},"https:\u002F\u002Fconsole.cloud.google.com\u002Fauth\u002Foverview",[45],"Google Auth Platform",[2357,57020,57021,57022],{},"Fill in what is asked and click ",[31,57023,21975],{},[2357,57025,57026],{},"Click 'Create'",[2357,57028,21005,57029,57034],{},[41,57030,57033],{"href":57031,"rel":57032},"https:\u002F\u002Fconsole.cloud.google.com\u002Fauth\u002Fbranding",[45],"Auth Branding"," and fill in the required Information",[2357,57036,57037,57039,57040],{},[31,57038,36554],{},": 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",[2354,57041,57042,57049,57069,57093,57102],{},[2357,57043,21005,57044],{},[41,57045,57048],{"href":57046,"rel":57047},"https:\u002F\u002Fconsole.cloud.google.com\u002Fauth\u002Fscopes",[45],"Auth Data Access",[2357,57050,57051,57052,319,57054,319,57057,319,57060,741,57063,4149,57066,97],{},"You will at least need ",[36,57053,52949],{},[36,57055,57056],{},"userinfo.email",[36,57058,57059],{},"userinfo.profile",[36,57061,57062],{},"admin.directory.group.readonly",[36,57064,57065],{},"admin.directory.user",[36,57067,57068],{},"admin.directory.user.readonly",[2357,57070,57071,57072],{},"The scopes needed by other Google integrations can be found in the Unified App, for example:\n",[2354,57073,57074,57080,57087],{},[2357,57075,57076],{},[41,57077,7216],{"href":57078,"rel":57079},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fgooglecontacts?tab=oauth2",[45],[2357,57081,57082],{},[41,57083,57086],{"href":57084,"rel":57085},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fgoogledirectory?tab=oauth2",[45],"Google Directory",[2357,57088,57089],{},[41,57090,7160],{"href":57091,"rel":57092},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fgooglemail?tab=oauth2",[45],[2357,57094,57095,56917,57097,4149,57099,57101],{},[31,57096,4943],{},[36,57098,56920],{},[36,57100,56923],{}," Scopes you need to contact Unified's Support to setup a CNAME for the redirect URL (US and EU regions) in order to get your App approved by Google",[2357,57103,57104,57105,57108],{},"Review the information and click \"",[31,57106,57107],{},"Save and Continue","\" 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.",[2357,57110,57111,57112],{},"Create OAuth 2.0 Credentials\n",[2354,57113,57114,57122,57129,57136,57139],{},[2357,57115,21005,57116,57121],{},[41,57117,57120],{"href":57118,"rel":57119},"https:\u002F\u002Fconsole.cloud.google.com\u002Fauth\u002Fclients",[45],"Auth Clients"," in the Google Cloud Console.",[2357,57123,57124,57125,57128],{},"Click on \"",[31,57126,57127],{},"+ Create Client","\" at the top of the page, Follow the steps",[2357,57130,57131,57132],{},"Configure the authorized redirect URIs.  Get the correct value from the Integration, for example ",[41,57133,7152],{"href":57134,"rel":57135},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fgoogledrive?tab=oauth2",[45],[2357,57137,57138],{},"Copy your Client ID and Secret",[2357,57140,57141,57142],{},"Enter these values in your Integrations, for example:\n",[2354,57143,57144,57151],{},[2357,57145,57146],{},[41,57147,57150],{"href":57148,"rel":57149},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fgoogle",[45],"Google",[2357,57152,57153],{},[41,57154,7160],{"href":57155,"rel":57156},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fgooglemail?tab=auth",[45],[22,57158,57159],{},[4201,57160],{"alt":5892,"src":57161},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_google_developer_app_and_get_oauth_2_credentials-0.png",[2510,57163,57164],{},[2357,57165,57166,57167],{},"Publish your Application\n",[2354,57168,57169,57176],{},[2357,57170,21005,57171],{},[41,57172,57175],{"href":57173,"rel":57174},"https:\u002F\u002Fconsole.cloud.google.com\u002Fauth\u002Faudience",[45],"Auth Audience",[2357,57177,57178],{},"Click on Publish app",[22,57180,57181],{},[4201,57182],{"alt":5892,"src":57183},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_google_developer_app_and_get_oauth_2_credentials-1.png",[2510,57185,57186],{},[2357,57187,57188,57189,57192],{},"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 '",[41,57190,47781],{"href":121,"rel":57191},[45],"' name, which is inferred from the redirect URL.",[22,57194,57195],{},[4201,57196],{"alt":20627,"src":57197},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_google_developer_app_and_get_oauth_2_credentials-2.png",{"title":2433,"searchDepth":2434,"depth":2434,"links":57199},[],"> 💡 Note that if you use `Restricted` or `Sensitive` Scopes you need to contact Unified's Support to setup a CNAME for the API URL (US and EU regions) in...",{"img":57202,"date":57203,"updated":57204,"tag":2457,"integrations":57205},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_google_developer_app_and_get_oauth_2_credentials-icon.png","2025-05-29T00:00:00.000Z","2026-10-09T18:43:21.390Z","google","\u002Fguides\u002Fhow_to_register_a_google_developer_app_and_get_oauth_2_credentials",{"title":56897,"description":57200},"guides\u002Fhow_to_register_a_google_developer_app_and_get_oauth_2_credentials","6zThDtTcuPng9dsntKGfOkzqYYa7G1c_jLTPP7pySks",{"id":57211,"title":57212,"body":57213,"description":57516,"extension":2452,"meta":57517,"navigation":2459,"path":57521,"seo":57522,"stem":57523,"__hash__":57524},"guides\u002Fguides\u002Fhow_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials.md","How to register a Salesforce developer app and get OAuth 2 credentials",{"type":12,"value":57214,"toc":57508},[57215,57218,57220,57224,57231,57234,57238,57241,57244,57258,57262,57270,57418,57422,57425,57431,57443,57475,57478,57482],[15,57216,57212],{"id":57217},"how-to-register-a-salesforce-developer-app-and-get-oauth-2-credentials",[19,57219],{},[22,57221,57222],{},[25,57223,51044],{},[22,57225,57226,57227,57230],{},"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 your product. Whether you're planning to build a custom-code integration or using a Unified API solution like ",[41,57228,123],{"href":121,"rel":57229},[45],", retrieving your OAuth 2 credentials is the first step in the process of integrating with Salesforce.",[22,57232,57233],{},"We'll also added directional for existing Unified.to users that are leveraging our Unified CRM API for a faster integration development process.",[55,57235,57237],{"id":57236},"what-is-a-salesforce-developer-app","What is a Salesforce Developer App?",[22,57239,57240],{},"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.",[22,57242,57243],{},"A connected app defines the following information:",[2354,57245,57246,57249,57252,57255],{},[2357,57247,57248],{},"The name and logo of the app",[2357,57250,57251],{},"The OAuth settings for the app, such as the callback URL, the scopes, and the refresh token policy",[2357,57253,57254],{},"The API version and the endpoints for the app",[2357,57256,57257],{},"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",[55,57259,57261],{"id":57260},"step-1-register-a-salesforce-developer-app","Step 1: Register a Salesforce developer app",[22,57263,57264,57265,57269],{},"To register a Salesforce developer app, you'll need a Salesforce developer account. If you don't have one, sign up for free at ",[41,57266,57267],{"href":57267,"rel":57268},"https:\u002F\u002Fdeveloper.salesforce.com\u002Fsignup",[45],".\nOnce you have a developer account, follow these steps to register a developer app:",[2510,57271,57272,57283,57290,57296,57299,57307,57314,57327,57354,57371,57379,57383,57397,57407],{},[2357,57273,57274,57275,57278,57280],{},"Log in to your Salesforce developer account and go to ",[31,57276,57277],{},"Setup",[5888,57279],{},[4201,57281],{"alt":5892,"src":57282},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials-0.png",[2357,57284,57285,57286,57289],{},"In the Quick Find box, search for ",[31,57287,57288],{},"App Manager"," and click on it",[2357,57291,28015,57292,57295],{},[31,57293,57294],{},"New External Client App"," button",[2357,57297,57298],{},"Fill in the basic information for your app, such as the name, contact email, and logo URL",[2357,57300,21834,57301,21581,57304],{},[36,57302,57303],{},"Packaged",[31,57305,57306],{},"Distribution State",[2357,57308,57309,57310,57313],{},"In the API (Enable OAuth Settings) section, check the ",[31,57311,57312],{},"Enable OAuth Settings"," checkbox",[2357,57315,57316,57317,57320,57321,319,57323,4149,57325,97],{},"Enter the callback URL for your app (this is the URL that Salesforce will redirect the user to after they authorize your app). For ",[41,57318,123],{"href":121,"rel":57319},[45]," users, the callback URL needs to be ",[36,57322,21741],{},[36,57324,21747],{},[36,57326,21753],{},[2357,57328,57329,57330,57333,57334,741,57337,57340,57341,11464,57343,11464,57346,57348,57349,57351],{},"Select the OAuth scopes for your app (these are the permissions that your app will request from the user). To set up ",[41,57331,123],{"href":121,"rel":57332},[45]," successfully you'll need to add these OAuth Scopes: ",[36,57335,57336],{},"Manage user data via APIs (api)",[36,57338,57339],{},"Platform requests at any time (refresh_token, offline_access)",".  If you are also going to use Salesforce to sign-in your users into your application, then also set the ",[36,57342,52949],{},[36,57344,57345],{},"profile",[36,57347,7282],{},"scopes.",[5888,57350],{},[4201,57352],{"alt":5892,"src":57353},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials-1.png",[2357,57355,57356,57357],{},"Next, enable the following options for you app:",[2510,57358,57359,57362,57365,57368],{},[2357,57360,57361],{},"Enable Authorization Code and Credentials Flow",[2357,57363,57364],{},"Require user credentials in the POST body for Authorization Code and Credentials Flow",[2357,57366,57367],{},"Require Secret for Web Server Flow",[2357,57369,57370],{},"Require Secret for Refresh Token Flow",[2357,57372,57373,57374,57376],{},"Do NOT enable CODE CHALLENGE (Require Proof Key for Code Exchange (PKCE) Extension for Supported Authorization Flows)",[5888,57375],{},[4201,57377],{"alt":5892,"src":57378},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials-2.png",[2357,57380,16292,57381],{},[31,57382,21975],{},[2357,57384,57385,57386,49662,57388,57391,57392,57394],{},"Next click ",[31,57387,50369],{},[31,57389,57390],{},"Policies"," tab",[5888,57393],{},[4201,57395],{"alt":5892,"src":57396},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials-3.png",[2357,57398,57399,57400,57402,57404],{},"Set 'Refresh token is valid until revoked' and click ",[31,57401,46022],{},[5888,57403],{},[4201,57405],{"alt":5892,"src":57406},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials-4.png",[2357,57408,57409,57410,97,57413,57415],{},"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 ",[41,57411,123],{"href":121,"rel":57412},[45],[5888,57414],{},[4201,57416],{"alt":5892,"src":57417},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials-5.png",[55,57419,57421],{"id":57420},"step-2-use-unifiedto-to-simplify-integration-development","Step 2: Use Unified.to to Simplify Integration Development",[22,57423,57424],{},"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.",[22,57426,57427,57430],{},[41,57428,123],{"href":121,"rel":57429},[45]," simplifies this entire process, providing SaaS developers with a unified set of APIs, data models, and webhooks for 219 CRM integrations. Add all the CRM integrations on your roadmap in a matter of hours.",[55,57432,57434,57435,57438,57439,57442],{"id":57433},"step-3-activate-salesforce-in-unifiedto-for-unifiedto-users","Step 3: Activate Salesforce in ",[41,57436,123],{"href":121,"rel":57437},[45]," (for ",[41,57440,123],{"href":121,"rel":57441},[45]," users)",[2510,57444,57445,57458,57467,57472],{},[2357,57446,57447,57451,57452],{},[41,57448,57450],{"href":21420,"rel":57449},[45],"Log in"," and navigate to ",[41,57453,57455],{"href":16276,"rel":57454},[45],[31,57456,57457],{},"Active Integrations",[2357,57459,57460,57461,57463,57464],{},"Use the search bar or click the ",[31,57462,23529],{}," tab to select ",[31,57465,57466],{},"Salesforce",[2357,57468,16292,57469,57471],{},[31,57470,16295],{}," on Salesforce",[2357,57473,57474],{},"Enter the information from the previous step (client ID, client secret)",[22,57476,57477],{},"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.",[55,57479,57481],{"id":57480},"one-api-to-integrate-them-all","One API to integrate them all",[22,57483,57484,57485,57490,57491,57498,57499,57506],{},"You're reading this article on the ",[41,57486,57488],{"href":121,"rel":57487},[45],[31,57489,123],{}," 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 ",[41,57492,57495],{"href":57493,"rel":57494},"https:\u002F\u002Fapp.unified.to\u002Flogin?utm_source=blog&utm_medium=blog_signup_salesforce&utm_campaign=blog_signup&utm_id=blog_signup",[45],[31,57496,57497],{},"signing up for a free account"," or ",[41,57500,57503],{"href":57501,"rel":57502},"https:\u002F\u002Fcalendly.com\u002Fmichelle-unified\u002Fdiscovery-via-blog",[45],[31,57504,57505],{},"meet with an integrations expert",[31,57507,97],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":57509},[57510,57511,57512,57513,57515],{"id":57236,"depth":2434,"text":57237},{"id":57260,"depth":2434,"text":57261},{"id":57420,"depth":2434,"text":57421},{"id":57433,"depth":2434,"text":57514},"Step 3: Activate Salesforce in Unified.to (for Unified.to users)",{"id":57480,"depth":2434,"text":57481},"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...",{"img":57518,"date":51311,"updated":57519,"tag":2457,"integrations":57520},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials-icon.png","2026-10-08T21:57:40.387Z","salesforce","\u002Fguides\u002Fhow_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials",{"title":57212,"description":57516},"guides\u002Fhow_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials","a0WubA8HAmpnjGTgbZX93UIb6PbWCHDqpsXVonPlsLE",{"id":57526,"title":57527,"body":57528,"description":57542,"extension":2452,"meta":57821,"navigation":2459,"path":57825,"seo":57826,"stem":57827,"__hash__":57828},"guides\u002Fguides\u002Fhow_to_register_a_slack_developer_account_and_get_oauth_2_credentials.md","How to register a Slack developer account and get OAuth 2 credentials",{"type":12,"value":57529,"toc":57815},[57530,57533,57535,57540,57543,57545,57547,57555,57559,57594,57597,57603,57608,57612,57615,57689,57693,57712,57716,57796,57810,57813],[15,57531,57527],{"id":57532},"how-to-register-a-slack-developer-account-and-get-oauth-2-credentials",[19,57534],{},[22,57536,57537],{},[25,57538,57539],{},"January 3, 2025",[22,57541,57542],{},"This guide walks you through how to register a Slack developer account, obtain OAuth 2 credentials, and configure scopes for your application.",[55,57544,4890],{"id":4889},[22,57546,27888],{},[2354,57548,57549,57552],{},[2357,57550,57551],{},"A Slack account",[2357,57553,57554],{},"Admin access to a Slack workspace where you can test your app",[55,57556,57558],{"id":57557},"create-a-slack-app","Create a Slack app",[2510,57560,57561,57569,57573,57578,57581,57584],{},[2357,57562,16434,57563,57568],{},[41,57564,57567],{"href":57565,"rel":57566},"https:\u002F\u002Fapi.slack.com\u002Fapps",[45],"Slack API website"," and sign into your Slack account",[2357,57570,16292,57571],{},[31,57572,45531],{},[2357,57574,21834,57575],{},[31,57576,57577],{},"From scratch",[2357,57579,57580],{},"Enter your app's name",[2357,57582,57583],{},"Select the workspace where you want to install and test out your app",[2357,57585,16292,57586,57588,57590],{},[31,57587,45215],{},[5888,57589],{},[4201,57591],{"alt":57592,"src":57593},"Screenshot_2025-01-03_at_11.13.30_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_slack_developer_account_and_get_oauth_2_credentials-0.png",[22,57595,57596],{},"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.",[22,57598,57599],{},[4201,57600],{"alt":57601,"src":57602},"Screenshot_2025-01-03_at_11.15.20_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_slack_developer_account_and_get_oauth_2_credentials-1.png",[22,57604,57605],{},[25,57606,57607],{},"Note: Store these values securely - never commit them to version control!",[55,57609,57611],{"id":57610},"configure-oauth-2-settings","Configure OAuth 2 settings",[22,57613,57614],{},"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.",[2510,57616,57617,57623,57632,57643,57657],{},[2357,57618,57619,57620],{},"From your app's settings page, navigate to ",[31,57621,57622],{},"OAuth & Permissions",[2357,57624,20156,57625,51147,57627],{},[31,57626,51146],{},[41,57628,57630],{"href":21741,"rel":57629},[45],[36,57631,21741],{},[2357,57633,16292,57634,57637,57639],{},[31,57635,57636],{},"Save URLs",[5888,57638],{},[4201,57640],{"alt":57641,"src":57642},"Screenshot_2025-01-03_at_11.18.11_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_slack_developer_account_and_get_oauth_2_credentials-2.png",[2357,57644,57645,57646,57649,57650,57653,57654],{},"If you are using the SlackBot integration, use ",[31,57647,57648],{},"Bot Token Scopes.","  If not, then use ",[31,57651,57652],{},"User Token Scopes.","  click ",[31,57655,57656],{},"Add an OAuth Scope",[2357,57658,57659,57660,57665,57666],{},"Search for and add the scopes you need for your application - refer to ",[41,57661,57664],{"href":57662,"rel":57663},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fslack?tab=oauth2",[45],"this page ","to see the scopes that are supported by Unified.",[2510,57667,57668],{},[2357,57669,57670,57671],{},"For example, if you want to read messages, then you should choose the scopes that map to :\n",[2510,57672,57673,57681],{},[2357,57674,57675,7340,57678],{},[31,57676,57677],{},"messaging_channel_read",[36,57679,57680],{},"im:read, mpim:read, channels:read, groups:read",[2357,57682,57683,7340,57686],{},[31,57684,57685],{},"messaging_message_read",[36,57687,57688],{},"im:read, im:history, mpim:read, mpim:history, channels:history, channels:read, groups:read, groups:history",[55,57690,57692],{"id":57691},"activate-the-slack-integration-with-your-credentials","Activate the Slack integration with your credentials",[2510,57694,57695,57706,57709],{},[2357,57696,7257,57697,57701,57702],{},[41,57698,57699],{"href":57699,"rel":57700},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fslack?tab=auth",[45]," or  ",[41,57703,57705],{"href":57699,"rel":57704},[45],"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fslackbot?tab=auth",[2357,57707,57708],{},"Enter your Client ID and Client secret from the steps above",[2357,57710,57711],{},"Save your changes",[15,57713,57715],{"id":57714},"for-a-slack-bot-follow-these-additional-instructions","For a Slack Bot, follow these additional instructions",[2510,57717,57718,57724,57735,57745,57752,57759,57766,57772,57786,57791],{},[2357,57719,57720,57721],{},"In the left sidebar, go to ",[31,57722,57723],{},"\"App Home\"",[2357,57725,6235,57726,52344,57729,57498,57732],{},[31,57727,57728],{},"\"Your App's Presence in Slack\"",[31,57730,57731],{},"\"Add\"",[31,57733,57734],{},"\"Edit\"",[2357,57736,57737,57738,4950,57741,57744],{},"Set a ",[31,57739,57740],{},"Display Name",[31,57742,57743],{},"Default Username"," for your bot",[2357,57746,57747,57748,57751],{},"Toggle on ",[31,57749,57750],{},"\"Always Show My Bot as Online\""," (optional)",[2357,57753,57754,57755,57758],{},"Go to ",[31,57756,57757],{},"\"Event Subscriptions\""," in sidebar",[2357,57760,57761,57762,57765],{},"Toggle ",[31,57763,57764],{},"\"Enable Events\""," to On",[2357,57767,57768,57769],{},"Enter the Unified webhook URL ",[36,57770,57771],{},"https:\u002F\u002Fapi.unified.to\u002Fwebhook\u002Fworkspace\u002Fslackbot?workspace_id={ID}",[2357,57773,57774,57775],{},"Subscribe to most bot events like:\n",[2354,57776,57777,57780,57783],{},[2357,57778,57779],{},"message.channels",[2357,57781,57782],{},"app_mention",[2357,57784,57785],{},"message.im",[2357,57787,7257,57788],{},[31,57789,57790],{},"\"Interactivity & Shortcuts\" to enable receiving information about button events",[2357,57792,57793,57794],{},"Toggle On and enter in ",[36,57795,57771],{},[22,57797,57798,57799,57802,57803,57806,57807,46583],{},"When a user authorizes your ",[36,57800,57801],{},"slackbot"," integration, their user ID will be stored in ",[36,57804,57805],{},"connection.auth.user_id"," and the bot ID will be stored in ",[36,57808,57809],{},"connection.auth.app_id",[22,57811,57812],{},"Congratulations, you're now ready to use the Slack integration in your application.",[22,57814,31288],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":57816},[57817,57818,57819,57820],{"id":4889,"depth":2434,"text":4890},{"id":57557,"depth":2434,"text":57558},{"id":57610,"depth":2434,"text":57611},{"id":57691,"depth":2434,"text":57692},{"img":57822,"date":57823,"updated":57824,"tag":2457,"integrations":47638},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_slack_developer_account_and_get_oauth_2_credentials-icon.png","2025-01-03T00:00:00.000Z","2026-08-23T14:53:50.922Z","\u002Fguides\u002Fhow_to_register_a_slack_developer_account_and_get_oauth_2_credentials",{"title":57527,"description":57542},"guides\u002Fhow_to_register_a_slack_developer_account_and_get_oauth_2_credentials","mkN-0utI3jMdL8OHPLbkkyhOwukfdhuzxC81hesnYsM",{"id":57830,"title":57831,"body":57832,"description":57954,"extension":2452,"meta":57955,"navigation":2459,"path":57960,"seo":57961,"stem":57962,"__hash__":57963},"guides\u002Fguides\u002Fhow_to_register_a_workday_developer_app_and_get_oauth2_credentials.md","How to Register a Workday Developer App and Get OAUTH2 Credentials",{"type":12,"value":57833,"toc":57948},[57834,57837,57839,57844,57847,57850,57854,57911,57918,57921,57928,57932],[15,57835,57831],{"id":57836},"how-to-register-a-workday-developer-app-and-get-oauth2-credentials",[19,57838],{},[22,57840,57841],{},[25,57842,57843],{},"March 13, 2023",[22,57845,57846],{},"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.",[22,57848,57849],{},"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.",[55,57851,57853],{"id":57852},"register-a-new-api-client-in-workday","Register a new API Client in Workday",[2510,57855,57856,57859,57862,57886,57894,57897,57900,57908],{},[2357,57857,57858],{},"Sign-in to the Workday tenant",[2357,57860,57861],{},"Search for 'Register API Client for Integration' using the search bar",[2357,57863,57864,57865,57881,57883],{},"Fill out the requested inputs with the following example details:",[2510,57866,57867,57872,57875,57878],{},[2357,57868,57869,57870],{},"Client Name; ",[16348,57871],{"application":2433,"name":2433},[2357,57873,57874],{},"Refresh Token Timeout; 0 days (ie. never)",[2357,57876,57877],{},"Non-Expiring Refresh Token: Checked",[2357,57879,57880],{},"Scope: Choose all of the permission scopes for the use-case.  Minimum should be 'Staffing' (for employee\u002Fworker access), 'Leave of Absence' (for timeoff).  Always include 'Tenant Non-Configurable' and 'Integration' as well.",[5888,57882],{},[4201,57884],{"alt":5892,"src":57885},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_workday_developer_app_and_get_oauth2_credentials-0.png",[2357,57887,57888,57889,57891],{},"Once the API client has been registered, go to 'Related Actions' icon ⇒ 'API Client' ⇒ 'Manage Refresh Tokens for Integrations'",[5888,57890],{},[4201,57892],{"alt":5892,"src":57893},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_workday_developer_app_and_get_oauth2_credentials-1.png",[2357,57895,57896],{},"Remember the Client ID and Client Secret",[2357,57898,57899],{},"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.",[2357,57901,57902,57903,57905],{},"Check the \"Regenerate New Refresh Token\" box and click OK.",[5888,57904],{},[4201,57906],{"alt":5892,"src":57907},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_workday_developer_app_and_get_oauth2_credentials-2.png",[2357,57909,57910],{},"A new refresh token will be generated.  Remember that Refresh Token.",[55,57912,3370,57914,57917],{"id":57913},"use-unifiedto-to-simplify-your-integrations-development",[41,57915,123],{"href":121,"rel":57916},[45]," to Simplify your Integrations Development",[22,57919,57920],{},"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.",[22,57922,57923,57924,57927],{},"A simpler and faster alternative is to use ",[41,57925,123],{"href":121,"rel":57926},[45]," APIs for HRIS and ATS integrations. It provides a unified set of APIs, data-models, and webhooks for most of the HRIS and ATS integrations.",[55,57929,57931],{"id":57930},"activate-workday-in-unifiedto","Activate Workday in Unified.to",[2510,57933,57934,57939,57942,57945],{},[2357,57935,16270,57936],{},[41,57937,57457],{"href":16276,"rel":57938},[45],[2357,57940,57941],{},"Search for Workday",[2357,57943,57944],{},"Click on Activate on Workday",[2357,57946,57947],{},"Enter in the information from the previous step (client ID, secret, endpoints\u002FURLs)",{"title":2433,"searchDepth":2434,"depth":2434,"links":57949},[57950,57951,57953],{"id":57852,"depth":2434,"text":57853},{"id":57913,"depth":2434,"text":57952},"Use Unified.to to Simplify your Integrations Development",{"id":57930,"depth":2434,"text":57931},"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...",{"img":57956,"date":57957,"updated":57958,"tag":2457,"integrations":57959},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_workday_developer_app_and_get_oauth2_credentials-icon.png","2023-03-13T00:00:00.000Z","2026-08-23T14:54:10.671Z","workday","\u002Fguides\u002Fhow_to_register_a_workday_developer_app_and_get_oauth2_credentials",{"title":57831,"description":57954},"guides\u002Fhow_to_register_a_workday_developer_app_and_get_oauth2_credentials","b33HNc86y72g15v0ZLrW7iJ2YmCV3jLE49THZj2zMFo",{"id":57965,"title":57966,"body":57967,"description":58192,"extension":2452,"meta":58193,"navigation":2459,"path":58198,"seo":58199,"stem":58200,"__hash__":58201},"guides\u002Fguides\u002Fhow_to_register_a_workday_developer_app_and_get_oauth2_soap_credentials.md","How to Register a Workday Developer App and Get OAUTH2\u002F SOAP Credentials",{"type":12,"value":57968,"toc":58183},[57969,57972,57974,57979,57986,57989,58000,58003,58009,58013,58048,58051,58056,58059,58065,58076,58083,58089,58093,58119,58123,58149,58153],[15,57970,57966],{"id":57971},"how-to-register-a-workday-developer-app-and-get-oauth2-soap-credentials",[19,57973],{},[22,57975,57976],{},[25,57977,57978],{},"November 10, 2025",[15,57980,57982,57983],{"id":57981},"how-to-register-and-get-oauth2-credentials-for-workday","How to Register and Get OAUTH2 ",[31,57984,57985],{},"Credentials for Workday:",[22,57987,57988],{},"You will need 3 endpoints (URLs):",[2354,57990,57991,57994,57997],{},[2357,57992,57993],{},"REST API Endpoint",[2357,57995,57996],{},"Token Endpoint",[2357,57998,57999],{},"Authorization Endpoint",[22,58001,58002],{},"You will also need:",[2354,58004,58005,58007],{},[2357,58006,4491],{},[2357,58008,4494],{},[3629,58010,58012],{"id":58011},"how-to-setup-client-id","How to setup Client ID",[2510,58014,58015,58020,58023,58026,58028,58031,58034,58039,58042,58045],{},[2357,58016,58017],{},[31,58018,58019],{},"Log in to the Workday application",[2357,58021,58022],{},"Register API Client: Navigate to the \"Register API Client\" section",[2357,58024,58025],{},"Select the Register API Client form",[2357,58027,58025],{},[2357,58029,58030],{},"For the grant type, select \"Authorization Code Grant'",[2357,58032,58033],{},"For the access token type, select \"Bearer'",[2357,58035,58036,58037],{},"In the Redirection URI field, enter ",[36,58038,21741],{},[2357,58040,58041],{},"In the Scope section, add Staffing and\u002For Recruiting, depending on your application's needs",[2357,58043,58044],{},"Select \"Non-expiring Refresh Tokens'",[2357,58046,58047],{},"Select the Include Workday Owned Scope checkbox.",[22,58049,58050],{},"Click OK to save the app.",[22,58052,58053],{},[4201,58054],{"alt":5892,"src":58055},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_workday_developer_app_and_get_oauth2_soap_credentials-0.png",[22,58057,58058],{},"Once you create your application, Workday will display the information that you entered plus additional information.",[3629,58060,58062],{"id":58061},"retrieve-endpoints",[31,58063,58064],{},"Retrieve Endpoints",[2510,58066,58067,58070,58073],{},[2357,58068,58069],{},"Access \"View API Clients\"",[2357,58071,58072],{},"Use the Workday search bar to navigate to \"View API clients\"",[2357,58074,58075],{},"Retrieve REST API Endpoint, Token Endpoint, Authorization Endpoint",[15,58077,57982,58079,58082],{"id":58078},"how-to-register-and-get-oauth2-credentials-for-workday-legacy",[31,58080,58081],{},"Credentials for Workday Legacy",":-",[55,58084,58086],{"id":58085},"integration-system-userisu",[31,58087,58088],{},"Integration System User(ISU)",[3629,58090,58092],{"id":58091},"create-user","Create User",[2510,58094,58095,58098,58101,58104,58107,58110,58113,58116],{},[2357,58096,58097],{},"Log in to the Workday tenant",[2357,58099,58100],{},"search 'Create Integration System User'.",[2357,58102,58103],{},"Goto 'Create Integration System User'",[2357,58105,58106],{},"In the \"Create Integration System User\" page, go to the \"Account Information\" section.",[2357,58108,58109],{},"Provide Username & Password",[2357,58111,58112],{},"Require New Password  should remain unchecked",[2357,58114,58115],{},"Type 0 (zero) for Session Timeout Minutes to prevent session expiration",[2357,58117,58118],{},"Click \"OK\" to save.",[3629,58120,58122],{"id":58121},"provide-permissions-to-isu","Provide permissions to ISU",[2510,58124,58125,58128,58131,58134,58137,58140,58143,58146],{},[2357,58126,58127],{},"Search field, type \"Create Security Group'",[2357,58129,58130],{},"Select \"Integration System Security Group\" from the \"Type of Tenanted Security Group\" drop-down menu.",[2357,58132,58133],{},"In the \"Name\" field, enter a name for the security group.",[2357,58135,58136],{},"Integration System Security Group on Workday select 'Maintain Permissions for Security Group''",[2357,58138,58139],{},"Configure the Permissions and select \"Maintain' Operation",[2357,58141,58142],{},"\"Source Security Group\" name matches your created security group.",[2357,58144,58145],{},"Now add Domain Security Policy Permissions",[2357,58147,58148],{},"Search 'Activate Pending Security Policy Changes'",[3629,58150,58152],{"id":58151},"wsdl-url","WSDL URL",[2510,58154,58155,58158,58163,58166,58169,58172],{},[2357,58156,58157],{},"Go to Workday, search 'Public Web Services'.",[2357,58159,16292,58160,3349],{},[31,58161,58162],{},"\"Public Web Services Report",[2357,58164,58165],{},"Hover over the \"Human Resources\" section.",[2357,58167,58168],{},"Click the three dots to open the menu.",[2357,58170,58171],{},"Select \"Web Services\" and then click \"View WSDL'",[2357,58173,58174,58175,58181],{},"Goto bottom of the page and get host URL. That looks like following:- ",[41,58176,58179],{"href":58177,"rel":58178},"https:\u002F\u002Fwd5-services1.myworkday.com\u002Fccx",[45],[31,58180,58177],{},[31,58182,97],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":58184},[58185,58186,58187],{"id":58011,"depth":2613,"text":58012},{"id":58061,"depth":2613,"text":58064},{"id":58085,"depth":2434,"text":58088,"children":58188},[58189,58190,58191],{"id":58091,"depth":2613,"text":58092},{"id":58121,"depth":2613,"text":58122},{"id":58151,"depth":2613,"text":58152},"2. Register API Client, Navigate to the \"Register API Client\" section",{"img":58194,"date":58195,"updated":58196,"tag":2457,"integrations":58197},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_workday_developer_app_and_get_oauth2_soap_credentials-icon.png","2025-11-10T19:03:00.000Z","2026-10-01T15:28:42.360Z","workday, workday_legacy","\u002Fguides\u002Fhow_to_register_a_workday_developer_app_and_get_oauth2_soap_credentials",{"title":57966,"description":58192},"guides\u002Fhow_to_register_a_workday_developer_app_and_get_oauth2_soap_credentials","nBZ8vIIp-V8CPGjs_Y3bliBMDCPv2aOK8mDBQRhD_78",{"id":58203,"title":58204,"body":58205,"description":58334,"extension":2452,"meta":58335,"navigation":2459,"path":58339,"seo":58340,"stem":58341,"__hash__":58342},"guides\u002Fguides\u002Fhow_to_register_a_zendesksell_developer_app_and_get_oauth2_credentials.md","How to Register a ZendeskSell Developer App and Get OAUTH2 Credentials",{"type":12,"value":58206,"toc":58326},[58207,58210,58212,58216,58219,58222,58226,58234,58237,58241,58244,58249,58252,58263,58266,58269,58273,58276,58279,58287,58290,58297,58300,58306,58310],[15,58208,58204],{"id":58209},"how-to-register-a-zendesksell-developer-app-and-get-oauth2-credentials",[19,58211],{},[22,58213,58214],{},[25,58215,51044],{},[22,58217,58218],{},"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.",[22,58220,58221],{},"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.",[55,58223,58225],{"id":58224},"step-1-create-a-zendesksell-account","Step 1: Create a ZendeskSell account",[22,58227,58228,58229],{},"If you don't have a ZendeskSell account yet, you need to create one first. You can sign up for a free trial here: ",[41,58230,58233],{"href":58231,"rel":58232},"https:\u002F\u002Fwww.zendesk.com\u002Fregister\u002F",[45],"https:\u002F\u002Fwww.zendesk.com\u002Fregister\u002F?source=zendesk_sell",[22,58235,58236],{},"Once you have created your account, you can log in to your ZendeskSell dashboard and access the settings menu.",[55,58238,58240],{"id":58239},"step-2-register-a-developer-app","Step 2: Register a developer app",[22,58242,58243],{},"To register a developer app, you need to go to the Admin Settings and click on \"APIs > Zendesk APIs\" and then on 'Oauth Clients'. Then, you need to click on the \"Add OAUTH2 Client\" button and fill in the required information.",[22,58245,58246,58247],{},"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 ",[36,58248,21741],{},[22,58250,58251],{},"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:",[2354,58253,58254,58257,58260],{},[2357,58255,58256],{},"read: Allows your app to read data from ZendeskSell",[2357,58258,58259],{},"write: Allows your app to write data to ZendeskSell",[2357,58261,58262],{},"delete: Allows your app to delete data from ZendeskSell",[22,58264,58265],{},"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.",[22,58267,58268],{},"After you fill in the information, you can click on the \"Register App\" button and your app will be created.",[55,58270,58272],{"id":58271},"step-3-get-credentials","Step 3: Get credentials",[22,58274,58275],{},"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.",[22,58277,58278],{},"The credentials are:",[2354,58280,58281,58284],{},[2357,58282,58283],{},"Client ID: A unique identifier for your app",[2357,58285,58286],{},"Client Secret: A secret key that you should keep confidential and never share with anyone",[22,58288,58289],{},"You should copy and save these credentials somewhere safe, as you will need them later in your code.",[55,58291,58293,58294,57917],{"id":58292},"step-4-use-unifiedto-to-simplify-your-integrations-development","Step 4: Use ",[41,58295,123],{"href":121,"rel":58296},[45],[22,58298,58299],{},"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.",[22,58301,57923,58302,58305],{},[41,58303,123],{"href":121,"rel":58304},[45]," APIs for CRM integration. It provides a unified set of APIs, data-models, and webhooks for 219 CRM integrations.",[55,58307,58309],{"id":58308},"step-5-activate-workday-in-unifiedto","Step 5: Activate Workday in Unified.to",[2510,58311,58312,58317,58320,58323],{},[2357,58313,16270,58314],{},[41,58315,57457],{"href":16276,"rel":58316},[45],[2357,58318,58319],{},"Search for ZendeskSell",[2357,58321,58322],{},"Click on Activate on ZendeskSell",[2357,58324,58325],{},"Enter in the information from the previous step (client ID, secret)",{"title":2433,"searchDepth":2434,"depth":2434,"links":58327},[58328,58329,58330,58331,58333],{"id":58224,"depth":2434,"text":58225},{"id":58239,"depth":2434,"text":58240},{"id":58271,"depth":2434,"text":58272},{"id":58292,"depth":2434,"text":58332},"Step 4: Use Unified.to to Simplify your Integrations Development",{"id":58308,"depth":2434,"text":58309},"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...",{"img":58336,"date":51311,"updated":58337,"tag":2457,"integrations":58338},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_zendesksell_developer_app_and_get_oauth2_credentials-icon.svg","2026-10-08T21:57:39.262Z","zendesksell","\u002Fguides\u002Fhow_to_register_a_zendesksell_developer_app_and_get_oauth2_credentials",{"title":58204,"description":58334},"guides\u002Fhow_to_register_a_zendesksell_developer_app_and_get_oauth2_credentials","ElVBXc7mR3SzQkO7RFMPU06gM-9X9u7uvy6xdmhMeHY",{"id":58344,"title":58345,"body":58346,"description":58448,"extension":2452,"meta":58449,"navigation":2459,"path":58454,"seo":58455,"stem":58456,"__hash__":58457},"guides\u002Fguides\u002Fhow_to_register_a_zoho_developer_app_and_get_oauth2_credentials.md","How to Register a Zoho Developer App and Get OAUTH2 Credentials",{"type":12,"value":58347,"toc":58442},[58348,58351,58353,58358,58361,58364,58368,58375,58378,58382,58385,58414,58417,58424],[15,58349,58345],{"id":58350},"how-to-register-a-zoho-developer-app-and-get-oauth2-credentials",[19,58352],{},[22,58354,58355],{},[25,58356,58357],{},"August 23, 2024",[22,58359,58360],{},"Zoho has many applications that we integrate with, including 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.",[22,58362,58363],{},"In this article, I will show you how to do that in a few simple steps.",[55,58365,58367],{"id":58366},"step-1-create-a-zoho-developer-account","Step 1: Create a Zoho Developer Account",[22,58369,58370,58371,97],{},"The first step is to create a Zoho Developer account, if you don't have one already. You can sign up for free at ",[41,58372,58373],{"href":58373,"rel":58374},"https:\u002F\u002Fdeveloper.zoho.com\u002Fsignup",[45],[22,58376,58377],{},"Once you have created your account, you will be able to access the Zoho Developer Console, where you can manage your apps and credentials.",[55,58379,58381],{"id":58380},"step-2-register-a-zoho-developer-app","Step 2: Register a Zoho Developer App",[22,58383,58384],{},"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:",[2354,58386,58387,58395,58398,58401,58408,58411],{},[2357,58388,7094,58389,58394],{},[41,58390,58393],{"href":58391,"rel":58392},"https:\u002F\u002Fapi-console.zoho.com\u002F",[45],"Zoho Developer Console"," and click on the \"Add App\" button.",[2357,58396,58397],{},"Choose \"Server-Based\" as the Client Type and click on \"Create\".",[2357,58399,58400],{},"Enter a name and a homepage for your app",[2357,58402,58403,58404,4149,58406],{},"For your Authorized redirect URI, enter in ",[36,58405,21741],{},[36,58407,21747],{},[2357,58409,58410],{},"Click on \"Create\".",[2357,58412,58413],{},"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.",[22,58415,58416],{},"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.",[55,58418,58420,58421],{"id":58419},"step-3-activate-your-zoho-apps-in-unifiedto","Step 3: Activate your Zoho Apps in ",[41,58422,123],{"href":121,"rel":58423},[45],[2510,58425,58426,58431,58434,58437,58439],{},[2357,58427,16270,58428],{},[41,58429,57457],{"href":16276,"rel":58430},[45],[2357,58432,58433],{},"Search for your Zoho app, such as ZohoCRM, ZohoBooks, ZohoPeople, or ZohoRecruit",[2357,58435,58436],{},"Click on the integration",[2357,58438,58325],{},[2357,58440,58441],{},"Click on Activate",{"title":2433,"searchDepth":2434,"depth":2434,"links":58443},[58444,58445,58446],{"id":58366,"depth":2434,"text":58367},{"id":58380,"depth":2434,"text":58381},{"id":58419,"depth":2434,"text":58447},"Step 3: Activate your Zoho Apps in Unified.to","Zoho has many applications that we integrate with, including ZohoCRM, ZohoBooks, ZohoPeople, and ZohoRecruit. If you are a developer who wants to build data...",{"img":58450,"date":58451,"updated":58452,"tag":2457,"integrations":58453},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_a_zoho_developer_app_and_get_oauth2_credentials-icon.png","2024-08-23T00:00:00.000Z","2026-10-08T22:42:02.170Z","zohocrm, zohobooks, zohopeople, zohorecruit","\u002Fguides\u002Fhow_to_register_a_zoho_developer_app_and_get_oauth2_credentials",{"title":58345,"description":58448},"guides\u002Fhow_to_register_a_zoho_developer_app_and_get_oauth2_credentials","jVPl1CPwayuUV_BUFzKHJIHwoGDuOPIJFIHfYz9ZgqM",{"id":58459,"title":58460,"body":58461,"description":58589,"extension":2452,"meta":58590,"navigation":2459,"path":58595,"seo":58596,"stem":58597,"__hash__":58598},"guides\u002Fguides\u002Fhow_to_register_an_adp_developer_app_and_get_oauth2_credentials.md","How to Register an ADP Developer App and Get OAUTH2 Credentials",{"type":12,"value":58462,"toc":58582},[58463,58466,58468,58473,58476,58482,58490,58495,58498,58518,58524,58527,58550,58554,58557,58560,58563,58567],[15,58464,58460],{"id":58465},"how-to-register-an-adp-developer-app-and-get-oauth2-credentials",[19,58467],{},[22,58469,58470],{},[25,58471,58472],{},"April 30, 2023",[22,58474,58475],{},"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.",[55,58477,58479],{"id":58478},"step-1-create-an-adp-developer-account",[31,58480,58481],{},"Step 1: Create an ADP Developer Account",[22,58483,58484,58485,97],{},"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 ",[41,58486,58489],{"href":58487,"rel":58488},"https:\u002F\u002Fdevelopers.adp.com\u002F",[45],"ADP Developer Portal",[55,58491,58492],{"id":58239},[31,58493,58494],{},"Step 2: Register a Developer App",[22,58496,58497],{},"Once you have an ADP Developer account, you can register a new developer app. Here are the steps to do so:",[2510,58499,58500,58503,58506,58509,58512,58515],{},[2357,58501,58502],{},"Log in to your ADP Developer account.",[2357,58504,58505],{},"Navigate to the \"Apps\" section of the Developer Portal.",[2357,58507,58508],{},"Click on the \"Register App\" button.",[2357,58510,58511],{},"Fill in the required information for your app, such as its name, description, and callback URL.",[2357,58513,58514],{},"Agree to the ADP Developer Terms of Service and Privacy Policy.",[2357,58516,58517],{},"Click the \"Submit\" button to complete the app registration process.",[55,58519,58521],{"id":58520},"step-3-get-your-app-credentials",[31,58522,58523],{},"Step 3: Get Your App Credentials",[22,58525,58526],{},"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.",[2510,58528,58529,58531,58534,58537],{},[2357,58530,58505],{},[2357,58532,58533],{},"Click on the name of the app you just registered.",[2357,58535,58536],{},"Click on the \"Credentials\" tab to view your app's Client ID and Client Secret.",[2357,58538,58539,58540,58545,58546,58549],{},"Make sure that your redirect_uri is ",[41,58541,58543],{"href":21741,"rel":58542},[45],[36,58544,21741],{}," if you are going to use ",[41,58547,123],{"href":121,"rel":58548},[45]," with these credentials",[55,58551,58553],{"id":58552},"step-4-using-unifiedto","Step 4: Using Unified.to",[22,58555,58556],{},"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.",[22,58558,58559],{},"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.",[22,58561,58562],{},"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.",[55,58564,58566],{"id":58565},"step-5-activate-adp-in-unifiedto","Step 5: Activate ADP in Unified.to",[2510,58568,58569,58574,58577,58580],{},[2357,58570,16270,58571],{},[41,58572,57457],{"href":16276,"rel":58573},[45],[2357,58575,58576],{},"Search for ADP",[2357,58578,58579],{},"Click on Activate on ADP",[2357,58581,58325],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":58583},[58584,58585,58586,58587,58588],{"id":58478,"depth":2434,"text":58481},{"id":58239,"depth":2434,"text":58494},{"id":58520,"depth":2434,"text":58523},{"id":58552,"depth":2434,"text":58553},{"id":58565,"depth":2434,"text":58566},"Developers who are looking to build data integrations for their SaaS software will need to register an ADP Developer application and obtain OAUTH2 credentials....",{"img":58591,"date":58592,"updated":58593,"tag":2457,"integrations":58594},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_an_adp_developer_app_and_get_oauth2_credentials-icon.png","2023-04-30T00:00:00.000Z","2026-08-23T14:54:12.139Z","adp","\u002Fguides\u002Fhow_to_register_an_adp_developer_app_and_get_oauth2_credentials",{"title":58460,"description":58589},"guides\u002Fhow_to_register_an_adp_developer_app_and_get_oauth2_credentials","8UkHX7Fb37Eawn7eLqDMW3SeYt1ICTPpjhqitR0O_fo",{"id":58600,"title":58601,"body":58602,"description":58720,"extension":2452,"meta":58721,"navigation":2459,"path":58725,"seo":58726,"stem":58727,"__hash__":58728},"guides\u002Fguides\u002Fhow_to_register_an_atlassian_developer_app_and_get_oauth2_credentials.md","How to Register an Atlassian Developer App and Get OAUTH2 Credentials",{"type":12,"value":58603,"toc":58712},[58604,58607,58609,58613,58616,58623,58626,58652,58659,58662,58681,58685,58688,58691,58693,58697],[15,58605,58601],{"id":58606},"how-to-register-an-atlassian-developer-app-and-get-oauth2-credentials",[19,58608],{},[22,58610,58611],{},[25,58612,51044],{},[22,58614,58615],{},"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.",[55,58617,58619,58620],{"id":58618},"step-1-registering-an-atlassian-developer-app","Step 1: ",[31,58621,58622],{},"Registering an Atlassian Developer App",[22,58624,58625],{},"To register an Atlassian Developer app, you need to follow the steps below:",[2510,58627,58628,58637,58640,58643,58646,58649],{},[2357,58629,16434,58630,97],{},[41,58631,58634],{"href":58632,"rel":58633},"https:\u002F\u002Fdeveloper.atlassian.com\u002Fconsole\u002Fmyapps\u002F",[45],[31,58635,58636],{},"Atlassian Developer site",[2357,58638,58639],{},"Click on \"Get started\" and create an Atlassian account if you don't have one already.",[2357,58641,58642],{},"Navigate to the \"My Atlassian\" page and click on \"Create a new app.\"",[2357,58644,58645],{},"Fill out the required information for your app, including the app name, description, and contact information.",[2357,58647,58648],{},"Once you have completed the form, click on \"Create app.\"",[2357,58650,58651],{},"You will be redirected to the app's overview page, where you can see the app key and client ID.",[55,58653,58655,58656],{"id":58654},"step-2-obtaining-credentials","Step 2: ",[31,58657,58658],{},"Obtaining Credentials",[22,58660,58661],{},"To obtain the necessary credentials for your salesforce integration, you need to do the following:",[2510,58663,58664,58667,58670,58675,58678],{},[2357,58665,58666],{},"Go to the app's overview page and click on \"Add credentials.\"",[2357,58668,58669],{},"Select \"OAuth\" as the authentication method.",[2357,58671,58672,58673],{},"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 ",[36,58674,21741],{},[2357,58676,58677],{},"Once you have completed the form, click on \"Create credentials.\"",[2357,58679,58680],{},"You will be redirected to the credentials page, where you can see the client secret.",[55,58682,58684],{"id":58683},"step-3-using-unifiedto","Step 3: Using Unified.to",[22,58686,58687],{},"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.",[22,58689,58690],{},"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.",[22,58692,58562],{},[55,58694,58696],{"id":58695},"step-4-activate-atlassian-in-unifiedto","Step 4: Activate Atlassian in Unified.to",[2510,58698,58699,58704,58707,58710],{},[2357,58700,16270,58701],{},[41,58702,57457],{"href":16276,"rel":58703},[45],[2357,58705,58706],{},"Search for Atlassian",[2357,58708,58709],{},"Click on Activate on Atlassian",[2357,58711,58325],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":58713},[58714,58716,58718,58719],{"id":58618,"depth":2434,"text":58715},"Step 1: Registering an Atlassian Developer App",{"id":58654,"depth":2434,"text":58717},"Step 2: Obtaining Credentials",{"id":58683,"depth":2434,"text":58684},{"id":58695,"depth":2434,"text":58696},"Developers who are looking to build data integrations for their SaaS software with Atlassian services will need to register an Atlassian Developer application...",{"img":58722,"date":51311,"updated":58723,"tag":2457,"integrations":58724},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_an_atlassian_developer_app_and_get_oauth2_credentials-icon.png","2026-08-23T14:54:11.545Z","atlassianconfluence, atlassianjira, atlassianservicedesk","\u002Fguides\u002Fhow_to_register_an_atlassian_developer_app_and_get_oauth2_credentials",{"title":58601,"description":58720},"guides\u002Fhow_to_register_an_atlassian_developer_app_and_get_oauth2_credentials","R2q_qQSaqTthMsMjriyMqUlBZOc4XHDm19dJkBppVIQ",{"id":58730,"title":58731,"body":58732,"description":58991,"extension":2452,"meta":58992,"navigation":2459,"path":58995,"seo":58996,"stem":58997,"__hash__":58998},"guides\u002Fguides\u002Fhow_to_register_your_facebook_oauth2_application.md","How to Register your Facebook OAuth2 Application",{"type":12,"value":58733,"toc":58989},[58734,58737,58739,58744,58778,58781,58798,58835,58862,58869,58900,58907,58970,58980,58983],[15,58735,58731],{"id":58736},"how-to-register-your-facebook-oauth2-application",[19,58738],{},[22,58740,58741],{},[25,58742,58743],{},"August 28, 2026",[2510,58745,58746,58759],{},[2357,58747,58748,58749],{},"Create a Meta Developer account\n",[2354,58750,58751],{},[2357,58752,7257,58753],{},[41,58754,58757],{"href":58755,"rel":58756},"https:\u002F\u002Fdevelopers.facebook.com\u002F",[45],[31,58758,58755],{},[2357,58760,58761,58762],{},"Create an application\n",[2354,58763,58764],{},[2357,58765,7257,58766,58772,58774],{},[41,58767,58770],{"href":58768,"rel":58769},"https:\u002F\u002Fdevelopers.facebook.com\u002Fapps\u002Fcreation\u002F",[45],[31,58771,58768],{},[5888,58773],{},[4201,58775],{"alt":58776,"src":58777},"how_to_register_your_metaads_oauth2_application-0.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_your_facebook_oauth2_application-0.png",[22,58779,58780],{},"Enter the following details:",[2354,58782,58783,58787],{},[2357,58784,58785],{},[31,58786,45225],{},[2357,58788,58789,58792,58794],{},[31,58790,58791],{},"App Contact Email",[5888,58793],{},[4201,58795],{"alt":58796,"src":58797},"Screenshot_2026-08-28_at_11.38.19_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_your_facebook_oauth2_application-1.png",[2510,58799,58800,58809,58818,58832],{},[2357,58801,58802,58803,58805],{},"Add the use case",[5888,58804],{},[4201,58806],{"alt":58807,"src":58808},"Screenshot_2026-08-28_at_11.39.22_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_your_facebook_oauth2_application-2.png",[2357,58810,58811,58812,58814],{},"Connect your app to a business portfolio",[5888,58813],{},[4201,58815],{"alt":58816,"src":58817},"Screenshot_2026-08-28_at_11.40.44_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_your_facebook_oauth2_application-3.png",[2357,58819,58820,58821,58825,58826,58828],{},"Once you create the app, select it from the ",[41,58822,58823],{"href":58823,"rel":58824},"https:\u002F\u002Fdevelopers.facebook.com\u002Fapps\u002F",[45]," page. From the app dashboard, select 'Customize the Manage everything on your Page use case'",[5888,58827],{},[4201,58829],{"alt":58830,"src":58831},"Screenshot_2026-08-28_at_11.44.55_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_your_facebook_oauth2_application-4.png",[2357,58833,58834],{},"Now add the permissions",[2354,58836,58837,58840,58842,58845,58848,58851,58853],{},[2357,58838,58839],{},"pages_show_list",[2357,58841,20756],{},[2357,58843,58844],{},"pages_read_user_content",[2357,58846,58847],{},"read_insights",[2357,58849,58850],{},"pages_manage_posts",[2357,58852,7282],{},[2357,58854,58855,58856,58858],{},"public_profile",[5888,58857],{},[4201,58859],{"alt":58860,"src":58861},"Screenshot_2026-08-28_at_11.49.07_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_your_facebook_oauth2_application-5.png",[2510,58863,58864],{},[2357,58865,58866],{},[31,58867,58868],{},"Configure Facebook Login for Business",[2354,58870,58871,58874,58883],{},[2357,58872,58873],{},"In the left sidebar, open (1, 2): Facebook Login for Business → Settings",[2357,58875,58876,58877,58882],{},"Specify the ",[41,58878,58880],{"href":121,"rel":58879},[45],[31,58881,123],{}," OAuth2 redirect URLs (3)",[2357,58884,6184,58885,58888,58890,58894,58896],{},[31,58886,58887],{},"Save Changes (4)",[5888,58889],{},[4201,58891],{"alt":58892,"src":58893},"how_to_register_your_metaads_oauth2_application-7.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_your_facebook_oauth2_application-6.png",[5888,58895],{},[4201,58897],{"alt":58898,"src":58899},"how_to_register_your_metaads_oauth2_application-8.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_your_facebook_oauth2_application-7.png",[2510,58901,58902],{},[2357,58903,58904],{},[31,58905,58906],{},"Configure App Domains",[2354,58908,58909,58912,58961],{},[2357,58910,58911],{},"Go to App Settings → Basic",[2357,58913,58914,58915,58918,58919,58924,58930,58935,58941,58948,58954],{},"Add the following ",[31,58916,58917],{},"App Domains","(3): ",[41,58920,58922],{"href":121,"rel":58921},[45],[31,58923,47781],{},[41,58925,58928],{"href":58926,"rel":58927},"https:\u002F\u002Fapi.unified.to\u002F",[45],[31,58929,37266],{},[41,58931,58933],{"href":4146,"rel":58932},[45],[31,58934,21814],{},[41,58936,58939],{"href":58937,"rel":58938},"https:\u002F\u002Fapi-eu.unified.to\u002F",[45],[31,58940,18740],{},[41,58942,58945],{"href":58943,"rel":58944},"https:\u002F\u002Fapp-eu.unified.to\u002F",[45],[31,58946,58947],{},"app-eu.unified.to",[41,58949,58952],{"href":58950,"rel":58951},"https:\u002F\u002Fapi-au.unified.to\u002F",[45],[31,58953,18743],{},[41,58955,58958],{"href":58956,"rel":58957},"https:\u002F\u002Fapp-au.unified.to\u002F",[45],[31,58959,58960],{},"app-au.unified.to",[2357,58962,58963,58964,58966],{},"Scroll down and save the settings (4)",[5888,58965],{},[4201,58967],{"alt":58968,"src":58969},"how_to_register_your_metaads_oauth2_application-9.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_your_facebook_oauth2_application-8.png",[2510,58971,58972],{},[2357,58973,58974,58975,58979],{},"In Unified ",[41,58976,58977],{"href":58977,"rel":58978},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Ffacebook",[45],", 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.",[22,58981,58982],{},"You are now all set to authorize a Facebook connection. Users should see this screen at time of Oauth.",[22,58984,58985],{},[4201,58986],{"alt":58987,"src":58988},"dialog_box_updated.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_your_facebook_oauth2_application-9.png",{"title":2433,"searchDepth":2434,"depth":2434,"links":58990},[],"Go to https,\u002F\u002Fdevelopers.facebook.com\u002Fapps\u002Fcreation\u002F...",{"img":7949,"date":58993,"updated":58994,"tag":2457,"integrations":3},"2026-08-28T15:35:00.000Z","2026-08-29T19:54:15.310Z","\u002Fguides\u002Fhow_to_register_your_facebook_oauth2_application",{"title":58731,"description":58991},"guides\u002Fhow_to_register_your_facebook_oauth2_application","Wm59tMG_b-0eJ0jBiOSNa7J83yOi1OONJ-TdA5z7aNI",{"id":59000,"title":59001,"body":59002,"description":59305,"extension":2452,"meta":59306,"navigation":2459,"path":59311,"seo":59312,"stem":59313,"__hash__":59314},"guides\u002Fguides\u002Fhow_to_register_your_google_ads_oauth2_application.md","How to Register your Google Ads OAuth2 Application",{"type":12,"value":59003,"toc":59302},[59004,59007,59009,59014,59019,59299],[15,59005,59001],{"id":59006},"how-to-register-your-google-ads-oauth2-application",[19,59008],{},[22,59010,59011],{},[25,59012,59013],{},"March 21, 2026",[55,59015,59017],{"id":59016},"how-to-register-your-google-ads-oauth2-application-1",[31,59018,59001],{},[2510,59020,59021,59056,59083,59144,59166,59221,59267],{},[2357,59022,59023,59024],{},"Create a Google Cloud project\n",[2354,59025,59026,59033,59042,59052],{},[2357,59027,7257,59028],{},[41,59029,59031],{"href":7097,"rel":59030},[45],[31,59032,7097],{},[2357,59034,6184,59035,59038,59039],{},[31,59036,59037],{},"Select a project"," at the top of the page, then click ",[31,59040,59041],{},"New Project",[2357,59043,45348,59044],{},[2354,59045,59046,59049],{},[2357,59047,59048],{},"Project Name",[2357,59050,59051],{},"Organization (if applicable)",[2357,59053,6184,59054],{},[31,59055,21975],{},[2357,59057,59058,59059],{},"Enable the Google Ads API\n",[2354,59060,59061,59068,59074,59079],{},[2357,59062,7257,59063],{},[41,59064,59066],{"href":56968,"rel":59065},[45],[31,59067,56968],{},[2357,59069,59070,59071],{},"Search for ",[31,59072,59073],{},"Google Ads API",[2357,59075,48544,59076,59078],{},[31,59077,59073],{}," in the results",[2357,59080,6184,59081],{},[31,59082,7129],{},[2357,59084,59085,59086],{},"Configure the OAuth Consent Screen\n",[2354,59087,59088,59096,59103,59115,59119,59133,59137,59140],{},[2357,59089,7257,59090],{},[41,59091,59094],{"href":59092,"rel":59093},"https:\u002F\u002Fconsole.cloud.google.com\u002Fapis\u002Fcredentials\u002Fconsent",[45],[31,59095,59092],{},[2357,59097,5187,59098,59100,59101],{},[31,59099,52555],{}," as the user type, then click ",[31,59102,21975],{},[2357,59104,45348,59105],{},[2354,59106,59107,59109,59112],{},[2357,59108,45225],{},[2357,59110,59111],{},"User Support Email",[2357,59113,59114],{},"Developer Contact Email",[2357,59116,6184,59117],{},[31,59118,57107],{},[2357,59120,59121,59122,59125,59126],{},"On the Scopes step, click ",[31,59123,59124],{},"Add or Remove Scopes"," and add the following scope:\n",[2354,59127,59128],{},[2357,59129,59130],{},[36,59131,59132],{},"https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fadwords",[2357,59134,6184,59135],{},[31,59136,57107],{},[2357,59138,59139],{},"On the Test Users step, add any Google accounts you want to test with",[2357,59141,6184,59142],{},[31,59143,57107],{},[2357,59145,59146,59147],{},"Publish the OAuth Consent Screen\n",[2354,59148,59149,59157,59163],{},[2357,59150,59151,59152],{},"Go back to ",[41,59153,59155],{"href":59092,"rel":59154},[45],[31,59156,59092],{},[2357,59158,6184,59159,59162],{},[31,59160,59161],{},"Publish App"," to move from Testing to Production status",[2357,59164,59165],{},"This allows any Google user to authorize your application, not just the test users you added",[2357,59167,59168,59169],{},"Create OAuth2 Credentials\n",[2354,59170,59171,59179,59185,59190,59193,59210,59214],{},[2357,59172,7257,59173],{},[41,59174,59177],{"href":59175,"rel":59176},"https:\u002F\u002Fconsole.cloud.google.com\u002Fapis\u002Fcredentials",[45],[31,59178,59175],{},[2357,59180,6184,59181,43563,59183],{},[31,59182,52579],{},[31,59184,36221],{},[2357,59186,5187,59187,59189],{},[31,59188,52586],{}," as the Application Type",[2357,59191,59192],{},"Enter a name for the OAuth client",[2357,59194,6235,59195,59197,59198,59200,59201],{},[31,59196,52592],{},", add the following ",[31,59199,123],{}," OAuth2 redirect URL:\n",[2354,59202,59203],{},[2357,59204,59205],{},[41,59206,59208],{"href":21741,"rel":59207},[45],[31,59209,21741],{},[2357,59211,6184,59212],{},[31,59213,21975],{},[2357,59215,22748,59216,4950,59218,59220],{},[31,59217,4491],{},[31,59219,4494],{}," from the dialog that appears",[2357,59222,59223,59224],{},"Request Basic Access for the Google Ads Developer Token\n",[2354,59225,59226,59245,59251,59261,59264],{},[2357,59227,7257,59228,59234],{},[41,59229,59232],{"href":59230,"rel":59231},"https:\u002F\u002Fads.google.com\u002Faw\u002Fapicenter",[45],[31,59233,59230],{},[2354,59235,59236],{},[2357,59237,59238,59239],{},"Note: You must be logged into a Google Ads Manager account. If you do not have one, create one at ",[41,59240,59243],{"href":59241,"rel":59242},"https:\u002F\u002Fads.google.com\u002Fintl\u002Fen\u002Fhome\u002Ftools\u002Fmanager-accounts\u002F",[45],[31,59244,59241],{},[2357,59246,59247,59248],{},"In the API Center, you will see your ",[31,59249,59250],{},"Developer Token",[2357,59252,59253,59254,59257,59258],{},"Your token will initially have ",[31,59255,59256],{},"Test Account"," access. To use it with production accounts, click ",[31,59259,59260],{},"Apply for Basic Access",[2357,59262,59263],{},"Fill out the application form with details about how you will use the API",[2357,59265,59266],{},"Google typically reviews and approves Basic Access applications within a few business days",[2357,59268,59269,59270],{},"Configure Unified.to\n",[2354,59271,59272],{},[2357,59273,59274,59275,59281,59282],{},"In Unified ",[41,59276,59279],{"href":59277,"rel":59278},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fgoogleads",[45],[31,59280,59277],{},", add the following:\n",[2354,59283,59284,59289,59293],{},[2357,59285,59286,59287],{},"The OAuth client's ",[31,59288,4491],{},[2357,59290,59286,59291],{},[31,59292,4494],{},[2357,59294,59295,59296,59298],{},"Your ",[31,59297,59250],{}," from the API Center",[22,59300,59301],{},"You are now all set to authorize a Google Ads connection",{"title":2433,"searchDepth":2434,"depth":2434,"links":59303},[59304],{"id":59016,"depth":2434,"text":59001},"Click Select a project at the top of the page, then click New Project...",{"img":59307,"date":59308,"updated":59309,"tag":2457,"integrations":59310},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_your_google_ads_oauth2_application-icon.png","2026-03-21T02:49:00.000Z","2026-08-23T14:53:24.752Z","googleads","\u002Fguides\u002Fhow_to_register_your_google_ads_oauth2_application",{"title":59001,"description":59305},"guides\u002Fhow_to_register_your_google_ads_oauth2_application","tT6WSUH0O1utR_AVB1fp3uUG0ALYW5AkKiKcctCOKds",{"id":59316,"title":59317,"body":59318,"description":59548,"extension":2452,"meta":59549,"navigation":2459,"path":59554,"seo":59555,"stem":59556,"__hash__":59557},"guides\u002Fguides\u002Fhow_to_register_your_metaads_oauth2_application.md","How to Register your MetaAds OAuth2 application",{"type":12,"value":59319,"toc":59546},[59320,59323,59325,59330,59460,59465,59492,59497,59543],[15,59321,59317],{"id":59322},"how-to-register-your-metaads-oauth2-application",[19,59324],{},[22,59326,59327],{},[25,59328,59329],{},"March 4, 2026",[2510,59331,59332,59342],{},[2357,59333,59334,59335],{},"Create a Meta Developer account",[2354,59336,59337],{},[2357,59338,21005,59339],{},[41,59340,58755],{"href":58755,"rel":59341},[45],[2357,59343,49483,59344,59388,59390,59393,59451,59453,59454,59456],{},[2354,59345,59346,59357,59380],{},[2357,59347,21005,59348,59351,59353],{},[41,59349,58768],{"href":58768,"rel":59350},[45],[5888,59352],{},[4201,59354],{"alt":59355,"src":59356},"03cc19ca-b1b5-43fa-b858-37a6aeb9ab77.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_your_metaads_oauth2_application-0.png",[2357,59358,58780,59359,59369,59371,59374,59376],{},[2354,59360,59361,59365],{},[2357,59362,59363],{},[31,59364,45225],{},[2357,59366,59367],{},[31,59368,58791],{},[5888,59370],{},[4201,59372],{"alt":5892,"src":59373},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_your_metaads_oauth2_application-1.png",[5888,59375],{},[4201,59377],{"alt":59378,"src":59379},"Screenshot_2026-03-05_at_09.37.16.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_your_metaads_oauth2_application-2.png",[2357,59381,59382,59383,59385],{},"Add the following use-cases; 'Manage ads using Marketing API' and 'Measure ad performance'",[5888,59384],{},[4201,59386],{"alt":5892,"src":59387},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_your_metaads_oauth2_application-3.png",[5888,59389],{},[31,59391,59392],{},"3. Configure Permissions for the Marketing API",[2354,59394,59395,59403,59406,59425,59441],{},[2357,59396,59397,59398,59400],{},"Enable all permissions in the 'Create & Manage Ads' and 'Measure ad performance' use-cases",[5888,59399],{},[4201,59401],{"alt":5892,"src":59402},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_your_metaads_oauth2_application-4.png",[2357,59404,59405],{},"or -",[2357,59407,59408,59409,59419,59421],{},"After the application is created:",[2354,59410,59411,59416],{},[2357,59412,59413,59414,97],{},"Open the ",[31,59415,45203],{},[2357,59417,59418],{},"Navigate to:\nUse Cases → Customize → Create & Manage Ads",[5888,59420],{},[4201,59422],{"alt":59423,"src":59424},"Screenshot_2026-03-05_at_09.42.12.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_your_metaads_oauth2_application-5.png",[2357,59426,59427,59428],{},"Enable the following permissions:",[2354,59429,59430,59433,59436,59439],{},[2357,59431,59432],{},"ads_management",[2357,59434,59435],{},"ads_read",[2357,59437,59438],{},"business_management",[2357,59440,7282],{},[2357,59442,59443,59444],{},"Additional permissions such as:",[2354,59445,59446,59449],{},[2357,59447,59448],{},"pages_manage_ads",[2357,59450,20756],{},[5888,59452],{},"This may also be enabled depending on your integration requirements.",[5888,59455],{},[4201,59457],{"alt":59458,"src":59459},"Screenshot_2026-03-05_at_09.44.57.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_your_metaads_oauth2_application-6.png",[22,59461,59462],{},[31,59463,59464],{},"4. Configure Facebook Login for Business",[2354,59466,59467,59476,59488],{},[2357,59468,59469,59470,59472],{},"In the left sidebar, open (1, 2):\nFacebook Login for Business → Settings",[5888,59471],{},[4201,59473],{"alt":59474,"src":59475},"Screenshot_2026-03-05_at_09.49.45.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_your_metaads_oauth2_application-7.png",[2357,59477,59478,59479,59482,59483,59485],{},"Specify the ",[41,59480,123],{"href":121,"rel":59481},[45]," OAuth2 redirect URLs (3)",[5888,59484],{},[4201,59486],{"alt":5892,"src":59487},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_your_metaads_oauth2_application-8.png",[2357,59489,6184,59490,97],{},[31,59491,58887],{},[22,59493,59494],{},[31,59495,59496],{},"5. Configure App Domains",[2354,59498,59499,59501,59527],{},[2357,59500,58911],{},[2357,59502,58914,59503,59505,59506,59509,59512,59515,59518,59521,59524],{},[31,59504,58917],{},"(3):\n",[41,59507,47781],{"href":121,"rel":59508},[45],[41,59510,37266],{"href":58926,"rel":59511},[45],[41,59513,21814],{"href":4146,"rel":59514},[45],[41,59516,18740],{"href":58937,"rel":59517},[45],[41,59519,58947],{"href":58943,"rel":59520},[45],[41,59522,18743],{"href":58950,"rel":59523},[45],[41,59525,58960],{"href":58956,"rel":59526},[45],[2357,59528,59529,59530,59532,59536,58974,59538,59542],{},"Scroll down and save the settings (4).",[5888,59531],{},[4201,59533],{"alt":59534,"src":59535},"Screenshot_2026-03-05_at_10.05.24.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_your_metaads_oauth2_application-9.png",[5888,59537],{},[41,59539,59540],{"href":59540,"rel":59541},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fmetaads",[45],", 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.",[22,59544,59545],{},"You are now all set to authorize a MetaAds connection",{"title":2433,"searchDepth":2434,"depth":2434,"links":59547},[],"Go to https,\u002F\u002Fdevelopers.facebook.com\u002Fapps\u002Fcreation\u002F...",{"img":59550,"date":59551,"updated":59552,"tag":2457,"integrations":59553},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_register_your_metaads_oauth2_application-icon.png","2026-03-04T16:22:00.000Z","2026-08-23T14:53:26.779Z","metaads","\u002Fguides\u002Fhow_to_register_your_metaads_oauth2_application",{"title":59317,"description":59548},"guides\u002Fhow_to_register_your_metaads_oauth2_application","EoGb6bP0VsaeMIKIv7RWkFZ8Gj4Zklzkuk7tubZXH7s",{"id":59559,"title":59560,"body":59561,"description":59767,"extension":2452,"meta":59768,"navigation":2459,"path":59772,"seo":59773,"stem":59774,"__hash__":59775},"guides\u002Fguides\u002Fhow_to_request_and_write_raw_integration_data.md","How To Request & Write Raw Integration Data",{"type":12,"value":59562,"toc":59762},[59563,59566,59568,59573,59577,59584,59591,59624,59630,59634,59639,59716,59722,59726,59729,59735,59738,59747,59750,59759],[15,59564,59560],{"id":59565},"how-to-request-write-raw-integration-data",[19,59567],{},[22,59569,59570],{},[25,59571,59572],{},"February 6, 2024",[3629,59574,59576],{"id":59575},"reading-data","Reading data",[22,59578,59579,59580,59583],{},"While ",[41,59581,123],{"href":121,"rel":59582},[45]," abstracts all of the integration's objects into common objects, you can still request that the original object.",[22,59585,59586,59587,59590],{},"Simply include a ",[36,59588,59589],{},"fields=raw"," parameter in your request.",[2584,59592,59594],{"className":16485,"code":59593,"language":16487,"meta":2433,"style":2433},"GET \u002Fcrm\u002F123456789\u002Fcontacts?fields=raw\n",[36,59595,59596],{"__ignoreMap":2433},[414,59597,59598,59600,59602,59605,59607,59610,59612,59615,59617,59619,59621],{"class":2593,"line":2594},[414,59599,9294],{"class":2607},[414,59601,11295],{"class":2698},[414,59603,59604],{"class":2705},"crm",[414,59606,23303],{"class":2698},[414,59608,59609],{"class":2607},"123456789",[414,59611,23303],{"class":2698},[414,59613,59614],{"class":2705},"contacts",[414,59616,3610],{"class":2698},[414,59618,27449],{"class":2705},[414,59620,2798],{"class":2698},[414,59622,59623],{"class":2705},"raw\n",[22,59625,59626,59627,59629],{},"The result will also include a field named ",[36,59628,96],{}," 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.",[3629,59631,59633],{"id":59632},"writing-data","Writing data",[22,59635,59586,59636,59638],{},[36,59637,96],{}," field in the payload with the integration's specific fields.",[2584,59640,59642],{"className":16485,"code":59641,"language":16487,"meta":2433,"style":2433},"POST \u002Fcrm\u002F123456789\u002Fcontacts\n\n{\n    \"name\": \"Joe Smith\",\n    \"raw\": {\n        \"customfield1\":\"Blue\",\n        \"customfield2\":\"Bananas\"\n    }\n}\n",[36,59643,59644,59661,59665,59669,59680,59687,59698,59708,59712],{"__ignoreMap":2433},[414,59645,59646,59648,59650,59652,59654,59656,59658],{"class":2593,"line":2594},[414,59647,45857],{"class":2607},[414,59649,11295],{"class":2698},[414,59651,59604],{"class":2705},[414,59653,23303],{"class":2698},[414,59655,59609],{"class":2607},[414,59657,23303],{"class":2698},[414,59659,59660],{"class":2705},"contacts\n",[414,59662,59663],{"class":2593,"line":2434},[414,59664,2740],{"emptyLinePlaceholder":2459},[414,59666,59667],{"class":2593,"line":2613},[414,59668,8916],{"class":2705},[414,59670,59671,59673,59675,59678],{"class":2593,"line":2625},[414,59672,38476],{"class":2601},[414,59674,7340],{"class":2705},[414,59676,59677],{"class":2601},"\"Joe Smith\"",[414,59679,2757],{"class":2705},[414,59681,59682,59685],{"class":2593,"line":2677},[414,59683,59684],{"class":2601},"    \"raw\"",[414,59686,10477],{"class":2705},[414,59688,59689,59692,59694,59696],{"class":2593,"line":2751},[414,59690,59691],{"class":2601},"        \"customfield1\"",[414,59693,2646],{"class":2705},[414,59695,16023],{"class":2601},[414,59697,2757],{"class":2705},[414,59699,59700,59703,59705],{"class":2593,"line":2760},[414,59701,59702],{"class":2601},"        \"customfield2\"",[414,59704,2646],{"class":2705},[414,59706,59707],{"class":2601},"\"Bananas\"\n",[414,59709,59710],{"class":2593,"line":2768},[414,59711,10535],{"class":2705},[414,59713,59714],{"class":2593,"line":2776},[414,59715,3035],{"class":2705},[22,59717,59718,59719,59721],{},"Those fields in the ",[36,59720,96],{},"  object can also overwrite any mapped unified fields.",[3629,59723,59725],{"id":59724},"passing-raw-parameters","Passing Raw Parameters",[22,59727,59728],{},"Some providers support extra filters or options that Unified doesn't standardize.",[22,59730,59731,59732,59734],{},"You can pass them using the ",[36,59733,96],{}," query parameter.",[22,59736,59737],{},"Take normal query params like:",[2584,59739,59741],{"className":2649,"code":59740,"language":2651,"meta":2652,"style":2433},"status=active&limit=10\n",[36,59742,59743],{"__ignoreMap":2433},[414,59744,59745],{"class":2593,"line":2594},[414,59746,59740],{},[22,59748,59749],{},"Encode them into:",[2584,59751,59753],{"className":2649,"code":59752,"language":2651,"meta":2652,"style":2433},"GET \u002Fcrm\u002F123456789\u002Fcontact?raw=status%3Dactive%26limit%3D10\n",[36,59754,59755],{"__ignoreMap":2433},[414,59756,59757],{"class":2593,"line":2594},[414,59758,59752],{},[4156,59760,59761],{},"html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}",{"title":2433,"searchDepth":2434,"depth":2434,"links":59763},[59764,59765,59766],{"id":59575,"depth":2613,"text":59576},{"id":59632,"depth":2613,"text":59633},{"id":59724,"depth":2613,"text":59725},"While Unified.to abstracts all of the integration's objects into common objects, you can still request that the original object.",{"img":59769,"date":59770,"updated":59771,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_request_and_write_raw_integration_data-icon.png","2024-02-06T00:00:00.000Z","2026-05-28T13:35:55.368Z","\u002Fguides\u002Fhow_to_request_and_write_raw_integration_data",{"title":59560,"description":59767},"guides\u002Fhow_to_request_and_write_raw_integration_data","Iz0eEiEB2VJ_whrPoAfI3_TdQNx0gr9-weY8uG8t4pg",{"id":59777,"title":59778,"body":59779,"description":60062,"extension":2452,"meta":60063,"navigation":2459,"path":60068,"seo":60069,"stem":60070,"__hash__":60071},"guides\u002Fguides\u002Fhow_to_retrieve_microsoft_dynamics_365_business_central_credentials.md","How to Retrieve Microsoft Dynamics 365 Business Central Credentials",{"type":12,"value":59780,"toc":60054},[59781,59784,59786,59791,59798,59800,59804,59809,59840,59842,59846,59880,59882,59886,59891,59928,59930,59934,59939,59967,59970,59972,59976,59981,59987,60023,60029,60031,60035,60038,60049,60052],[15,59782,59778],{"id":59783},"how-to-retrieve-microsoft-dynamics-365-business-central-credentials",[19,59785],{},[22,59787,59788],{},[25,59789,59790],{},"January 21, 2026",[22,59792,59793,59794,59797],{},"This guide walks you through creating an Azure App Registration, granting the correct permissions, and collecting the credentials required to integrate with ",[31,59795,59796],{},"Microsoft Dynamics 365 Business Central"," using Unified.",[19,59799],{},[55,59801,59803],{"id":59802},"_1-create-or-select-an-app-registration","1. Create or Select an App Registration",[22,59805,59806],{},[4201,59807],{"alt":5892,"src":59808},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_retrieve_microsoft_dynamics_365_business_central_credentials-0.png",[2510,59810,59811,59821,59825],{},[2357,59812,59813,59814,59816,59817],{},"Go to the Azure Portal:",[5888,59815],{},"👉 ",[41,59818,59819],{"href":59819,"rel":59820},"https:\u002F\u002Fportal.azure.com\u002F#view\u002FMicrosoft_AAD_RegisteredApps\u002FApplicationsListBlade",[45],[2357,59822,16270,59823],{},[31,59824,51972],{},[2357,59826,59827,59828],{},"Either:",[2354,59829,59830,59835],{},[2357,59831,59832,59833],{},"Select an existing app, ",[31,59834,39677],{},[2357,59836,16292,59837,59839],{},[31,59838,51976],{}," to create a new one",[19,59841],{},[55,59843,59845],{"id":59844},"_2-configure-redirect-uri","2. Configure Redirect URI",[2510,59847,59848,59853,59876],{},[2357,59849,59850,59851],{},"Inside your App Registration, go to ",[31,59852,37791],{},[2357,59854,20156,59855,2646,59858],{},[31,59856,59857],{},"Redirect URI (optional)",[2354,59859,59860,59864],{},[2357,59861,21834,59862],{},[31,59863,52835],{},[2357,59865,59866,59867],{},"Enter the redirect URL provided by Unified",[2584,59868,59870],{"className":2649,"code":59869,"language":2651,"meta":2652,"style":2433},"https:\u002F\u002Fapi.unified.to\u002Foauth\u002Fcode\n",[36,59871,59872],{"__ignoreMap":2433},[414,59873,59874],{"class":2593,"line":2594},[414,59875,59869],{},[2357,59877,16292,59878],{},[31,59879,46022],{},[19,59881],{},[55,59883,59885],{"id":59884},"_3-grant-business-central-api-permissions","3. Grant Business Central API Permissions",[22,59887,59888],{},[4201,59889],{"alt":5892,"src":59890},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_retrieve_microsoft_dynamics_365_business_central_credentials-1.png",[2510,59892,59893,59898,59902,59907,59912,59916,59919,59923],{},[2357,59894,59895,59896],{},"In the App Registration, go to ",[31,59897,52083],{},[2357,59899,16292,59900],{},[31,59901,22581],{},[2357,59903,21834,59904],{},[31,59905,59906],{},"APIs my organization uses",[2357,59908,59909,59910],{},"Search for and select ",[31,59911,59796],{},[2357,59913,53006,59914],{},[31,59915,22589],{},[2357,59917,59918],{},"Select the required permissions (typically default access)",[2357,59920,16292,59921],{},[31,59922,44480],{},[2357,59924,59925,59926],{},"If required, click ",[31,59927,52181],{},[19,59929],{},[55,59931,59933],{"id":59932},"_4-get-client-id-and-client-secret","4. Get Client ID and Client Secret",[22,59935,59936],{},[4201,59937],{"alt":5892,"src":59938},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_retrieve_microsoft_dynamics_365_business_central_credentials-2.png",[2510,59940,59941,59945],{},[2357,59942,59895,59943],{},[31,59944,52888],{},[2357,59946,59947,59948],{},"Copy the following:\n",[2354,59949,59950,59955],{},[2357,59951,59952,59954],{},[31,59953,4491],{}," (from the app Overview page)",[2357,59956,59957,59959],{},[31,59958,4494],{},[2354,59960,59961,59964],{},[2357,59962,59963],{},"Create a new client secret if one does not exist",[2357,59965,59966],{},"Copy it immediately (it will not be shown again)",[22,59968,59969],{},"⚠️ Store the client secret securely.",[19,59971],{},[55,59973,59975],{"id":59974},"_5-retrieve-business-central-company-name","5. Retrieve Business Central Company Name",[22,59977,59978],{},[4201,59979],{"alt":5892,"src":59980},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_retrieve_microsoft_dynamics_365_business_central_credentials-3.png",[22,59982,59983,59984,97],{},"Unified also requires the ",[31,59985,59986],{},"Business Central company name",[2510,59988,59989,59997,60000],{},[2357,59990,6161,59991,59816,59993],{},[5888,59992],{},[41,59994,59995],{"href":59995,"rel":59996},"https:\u002F\u002Fbusinesscentral.dynamics.com\u002F",[45],[2357,59998,59999],{},"Sign in to your Business Central account",[2357,60001,60002,60003,60006,60007],{},"Locate the ",[31,60004,60005],{},"company name"," using either method:",[2354,60008,60009,60017],{},[2357,60010,60011,60012,319,60015],{},"The company name shown in the ",[31,60013,60014],{},"top-left corner",[31,60016,39677],{},[2357,60018,46260,60019,60022],{},[31,60020,60021],{},"building (company) icon"," in the navigation bar and copy the desired company name",[22,60024,3370,60025,60028],{},[31,60026,60027],{},"exactly"," the company name as shown.",[19,60030],{},[55,60032,60034],{"id":60033},"_6-information-you-will-need-for-unified","6. Information You Will Need for Unified",[22,60036,60037],{},"After completing the steps above, you should have:",[2354,60039,60040,60043,60046],{},[2357,60041,60042],{},"✅ Client ID",[2357,60044,60045],{},"✅ Client Secret",[2357,60047,60048],{},"✅ Business Central Company Name",[22,60050,60051],{},"These values are required to complete the Business Central connection in Unified.",[4156,60053,5736],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":60055},[60056,60057,60058,60059,60060,60061],{"id":59802,"depth":2434,"text":59803},{"id":59844,"depth":2434,"text":59845},{"id":59884,"depth":2434,"text":59885},{"id":59932,"depth":2434,"text":59933},{"id":59974,"depth":2434,"text":59975},{"id":60033,"depth":2434,"text":60034},"This guide walks you through creating an Azure App Registration, granting the correct permissions, and collecting the credentials required to integrate with...",{"img":60064,"date":60065,"updated":60066,"tag":2457,"integrations":60067},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_retrieve_microsoft_dynamics_365_business_central_credentials-icon.png","2026-01-21T22:21:00.000Z","2026-08-23T14:53:29.689Z","microsoftdynamicsbusinesscentral","\u002Fguides\u002Fhow_to_retrieve_microsoft_dynamics_365_business_central_credentials",{"title":59778,"description":60062},"guides\u002Fhow_to_retrieve_microsoft_dynamics_365_business_central_credentials","ZQeieehVK8PRofDSRtsjqxw98-C4g4slq_ihQWiNakY",{"id":60073,"title":60074,"body":60075,"description":60487,"extension":2452,"meta":60488,"navigation":2459,"path":60492,"seo":60493,"stem":60494,"__hash__":60495},"guides\u002Fguides\u002Fhow_to_set_up_a_custom_api_url_with_a_cname.md","How to set up a custom API URL with a CNAME",{"type":12,"value":60076,"toc":60471},[60077,60080,60082,60087,60093,60098,60100,60114,60118,60121,60138,60142,60205,60211,60215,60229,60233,60241,60244,60253,60256,60264,60268,60299,60306,60311,60316,60320,60331,60333,60337,60356,60360,60368,60371,60379,60381,60423,60426,60432,60457,60463,60469],[15,60078,60074],{"id":60079},"how-to-set-up-a-custom-api-url-with-a-cname",[19,60081],{},[22,60083,60084],{},[25,60085,60086],{},"September 5, 2025",[22,60088,60089,60090,60092],{},"This guide walks you through setting up a custom subdomain (CNAME) for your Unified API workspace, so you can use your own domain instead of ",[36,60091,37266],{}," for API calls and OAuth flows.",[4937,60094,60095],{},[22,60096,60097],{},"💡 This is mandatory when using Sensitive scopes in any of the Google integrations. It allows the Google verification to pass.",[55,60099,2542],{"id":2541},[2354,60101,60102,60105,60108,60111],{},[2357,60103,60104],{},"A Pro or Scale plan (custom domains are not available on Grow)",[2357,60106,60107],{},"A workspace in the US or EU region (custom domains are not yet available in the AU region)",[2357,60109,60110],{},"Access to your domain's DNS management console",[2357,60112,60113],{},"Admin access to your Unified workspace",[55,60115,60117],{"id":60116},"step-1-choose-your-custom-subdomain","Step 1: Choose your custom subdomain",[22,60119,60120],{},"Pick the subdomain you want to use, for example:",[2354,60122,60123,60128,60133],{},[2357,60124,60125],{},[36,60126,60127],{},"api.yourcompany.com",[2357,60129,60130],{},[36,60131,60132],{},"unified-api.yourcompany.com",[2357,60134,60135],{},[36,60136,60137],{},"integrations.yourcompany.com",[55,60139,60141],{"id":60140},"step-2-create-the-cname-record","Step 2: Create the CNAME record",[2510,60143,60144,60147,60150,60202],{},[2357,60145,60146],{},"Log in to your DNS provider (e.g. Cloudflare, GoDaddy, Namecheap, AWS Route 53).",[2357,60148,60149],{},"Go to DNS management for your domain.",[2357,60151,60152,60153],{},"Add a CNAME record:\n",[2354,60154,60155,60160,60170,60190,60196],{},[2357,60156,60157,60159],{},[31,60158,9015],{},": CNAME",[2357,60161,60162,60164,60165,4149,60167,2980],{},[31,60163,51982],{},": your subdomain (e.g. ",[36,60166,34178],{},[36,60168,60169],{},"unified-api",[2357,60171,60172,60175,60176],{},[31,60173,60174],{},"Value\u002FTarget",", for your workspace's region:\n",[2354,60177,60178,60184],{},[2357,60179,60180,60181],{},"US: ",[36,60182,60183],{},"unified-domains-us-7d67c6f04efebb36.elb.us-east-1.amazonaws.com",[2357,60185,60186,60187],{},"EU: ",[36,60188,60189],{},"unified-domains-eu-a0f8a17b303a3c06.elb.eu-central-1.amazonaws.com",[2357,60191,60192,60195],{},[31,60193,60194],{},"TTL",": 3600 (or default)",[2357,60197,60198,60201],{},[31,60199,60200],{},"Proxy status",": DNS only \u002F disabled (if using Cloudflare). A proxied record hides the CNAME, so it can't be verified, and it blocks the TLS certificate from being issued.",[2357,60203,60204],{},"Save the record.",[22,60206,60207,60208,2431],{},"The target is also shown in your workspace settings, in the help text of the ",[31,60209,60210],{},"Custom API domain",[55,60212,60214],{"id":60213},"step-3-wait-for-dns-propagation","Step 3: Wait for DNS propagation",[22,60216,60217,60218,4149,60223,60228],{},"DNS changes can take from a few minutes to 48 hours to propagate. You can check with ",[41,60219,60222],{"href":60220,"rel":60221},"https:\u002F\u002Fwhatsmydns.net\u002F",[45],"whatsmydns.net",[41,60224,60227],{"href":60225,"rel":60226},"https:\u002F\u002Fdnschecker.org\u002F",[45],"dnschecker.org",": the CNAME for your subdomain should show the target above.",[55,60230,60232],{"id":60231},"step-4-update-your-oauth-applications","Step 4: Update your OAuth applications",[22,60234,60235,60237,60238,60240],{},[31,60236,5164],{},": as soon as your domain is saved in Step 5, OAuth flows redirect to it. To avoid failed authorizations, add the new redirect URI to every OAuth application you use with Unified ",[25,60239,44079],{}," Step 5 (most providers allow several), then remove the old one once everything works.",[22,60242,60243],{},"Add:",[2584,60245,60247],{"className":2649,"code":60246,"language":2651,"meta":2652,"style":2433},"https:\u002F\u002Fapi.yourcompany.com\u002Foauth\u002Fcode\n",[36,60248,60249],{"__ignoreMap":2433},[414,60250,60251],{"class":2593,"line":2594},[414,60252,60246],{},[22,60254,60255],{},"alongside:",[2584,60257,60258],{"className":2649,"code":59869,"language":2651,"meta":2652,"style":2433},[36,60259,60260],{"__ignoreMap":2433},[414,60261,60262],{"class":2593,"line":2594},[414,60263,59869],{},[55,60265,60267],{"id":60266},"step-5-add-the-domain-to-your-workspace","Step 5: Add the domain to your workspace",[2510,60269,60270,60281,60292],{},[2357,60271,21005,60272,10316,60276,60280],{},[41,60273,60275],{"href":16643,"rel":60274},[45],"Settings → Workspace",[41,60277,58947],{"href":60278,"rel":60279},"https:\u002F\u002Fapp-eu.unified.to\u002Fsettings\u002Fworkspace",[45]," for EU workspaces).",[2357,60282,60283,60284,60286,60287,60289,60290,20056],{},"Enter your subdomain in ",[31,60285,60210],{},", without ",[36,60288,5640],{}," (e.g. ",[36,60291,60127],{},[2357,60293,16292,60294,10279,60297,20056],{},[31,60295,60296],{},"Verify",[31,60298,6845],{},[22,60300,60301,60302,60305],{},"Unified checks that the CNAME points to your region's target. If it does, the domain shows as ",[31,60303,60304],{},"Verified"," and Unified adds it to its load balancer. A TLS certificate is issued automatically, usually within a few minutes.",[22,60307,60308,60309,52978],{},"If the CNAME isn't in place yet, you'll see an error explaining what's missing. Wait for DNS to propagate and click ",[31,60310,60296],{},[22,60312,60313,60314,97],{},"To stop using a custom domain, clear the field and click ",[31,60315,6845],{},[55,60317,60319],{"id":60318},"step-6-check-the-setup","Step 6: Check the setup",[2510,60321,60322,60328],{},[2357,60323,20149,60324,60327],{},[36,60325,60326],{},"https:\u002F\u002Fapi.yourcompany.com\u002Fswagger.json",". It should load over HTTPS. If you get a certificate error, wait a few minutes for the certificate to be issued.",[2357,60329,60330],{},"Authorize a test connection to an OAuth integration and confirm the redirect works.",[55,60332,51497],{"id":8197},[3629,60334,60336],{"id":60335},"oauth-verification","OAuth verification",[2354,60338,60339,60350],{},[2357,60340,60341,60344,60345,20056],{},[31,60342,60343],{},"Google OAuth",": after changing the redirect URI, you may need to complete app verification again, since Google sees it as a new domain (",[41,60346,60349],{"href":60347,"rel":60348},"https:\u002F\u002Fsupport.google.com\u002Fcloud\u002Fanswer\u002F13461325",[45],"Google's verification guide",[2357,60351,60352,60355],{},[31,60353,60354],{},"Other providers"," may require similar verification.",[3629,60357,60359],{"id":60358},"api-usage","API usage",[2354,60361,60362,60365],{},[2357,60363,60364],{},"Your API calls can use your custom domain. API functionality is identical.",[2357,60366,60367],{},"API keys and authentication don't change.",[3629,60369,52169],{"id":60370},"security",[2354,60372,60373,60376],{},[2357,60374,60375],{},"Protect access to your DNS provider and consider enabling DNSSEC.",[2357,60377,60378],{},"Monitor for unauthorized DNS changes.",[55,60380,5622],{"id":5621},[2510,60382,60383,60393,60403,60413],{},[2357,60384,60385,60388],{},[31,60386,60387],{},"\"does not have a CNAME record pointing to …\"",[2354,60389,60390],{},[2357,60391,60392],{},"DNS hasn't propagated yet, or the record points somewhere else. Make sure the target matches your workspace's region exactly and that Cloudflare proxying is off.",[2357,60394,60395,60398],{},[31,60396,60397],{},"\"is already used by another workspace\"",[2354,60399,60400],{},[2357,60401,60402],{},"Each custom domain can belong to one workspace. Contact Unified Support if you need to move it.",[2357,60404,60405,60408],{},[31,60406,60407],{},"Certificate error on your domain",[2354,60409,60410],{},[2357,60411,60412],{},"The certificate is issued a few minutes after verification. If it still fails after an hour, contact Unified Support.",[2357,60414,60415,60418],{},[31,60416,60417],{},"OAuth errors after the change",[2354,60419,60420],{},[2357,60421,60422],{},"Make sure redirect URIs are updated in all OAuth applications, and complete app verification if the provider requires it.",[55,60424,17799],{"id":60425},"example",[22,60427,60428,60429,60431],{},"For ",[36,60430,60127],{}," in the US region:",[2584,60433,60435],{"className":2649,"code":60434,"language":2651,"meta":2652,"style":2433},"Type: CNAME\nName: api\nValue: unified-domains-us-7d67c6f04efebb36.elb.us-east-1.amazonaws.com\nTTL: 3600\n",[36,60436,60437,60442,60447,60452],{"__ignoreMap":2433},[414,60438,60439],{"class":2593,"line":2594},[414,60440,60441],{},"Type: CNAME\n",[414,60443,60444],{"class":2593,"line":2434},[414,60445,60446],{},"Name: api\n",[414,60448,60449],{"class":2593,"line":2613},[414,60450,60451],{},"Value: unified-domains-us-7d67c6f04efebb36.elb.us-east-1.amazonaws.com\n",[414,60453,60454],{"class":2593,"line":2625},[414,60455,60456],{},"TTL: 3600\n",[22,60458,60459,60460],{},"OAuth redirect URI: ",[36,60461,60462],{},"https:\u002F\u002Fapi.yourcompany.com\u002Foauth\u002Fcode",[22,60464,60465,60466],{},"API endpoint: ",[36,60467,60468],{},"https:\u002F\u002Fapi.yourcompany.com\u002Fcrm\u002F{connection_id}\u002Fcontact",[4156,60470,5736],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":60472},[60473,60474,60475,60476,60477,60478,60479,60480,60485,60486],{"id":2541,"depth":2434,"text":2542},{"id":60116,"depth":2434,"text":60117},{"id":60140,"depth":2434,"text":60141},{"id":60213,"depth":2434,"text":60214},{"id":60231,"depth":2434,"text":60232},{"id":60266,"depth":2434,"text":60267},{"id":60318,"depth":2434,"text":60319},{"id":8197,"depth":2434,"text":51497,"children":60481},[60482,60483,60484],{"id":60335,"depth":2613,"text":60336},{"id":60358,"depth":2613,"text":60359},{"id":60370,"depth":2613,"text":52169},{"id":5621,"depth":2434,"text":5622},{"id":60425,"depth":2434,"text":17799},"This guide walks you through setting up a custom subdomain (CNAME) for your Unified API workspace, so you can use your own domain instead of `api.unified.to`...",{"img":60489,"date":60490,"updated":60491,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_a_custom_api_url_with_a_cname-icon.webp","2025-09-05T00:00:00.000Z","2026-10-22T14:12:26.560Z","\u002Fguides\u002Fhow_to_set_up_a_custom_api_url_with_a_cname",{"title":60074,"description":60487},"guides\u002Fhow_to_set_up_a_custom_api_url_with_a_cname","TFOIbf9xiKEESTS5gb9x2n7qIhuDfiBwPC6dJbB1CCY",{"id":60497,"title":60498,"body":60499,"description":60746,"extension":2452,"meta":60747,"navigation":2459,"path":60750,"seo":60751,"stem":60752,"__hash__":60753},"guides\u002Fguides\u002Fhow_to_set_up_a_hibob_marketplace_install.md","How to set up a HiBob marketplace install",{"type":12,"value":60500,"toc":60736},[60501,60504,60506,60511,60514,60517,60519,60521,60538,60540,60544,60555,60557,60561,60564,60573,60576,60584,60587,60609,60611,60620,60623,60626,60628,60632,60649,60652,60661,60663,60667,60670,60673,60675,60679,60686,60688,60692,60695,60697,60701,60721,60734],[15,60502,60498],{"id":60503},"how-to-set-up-a-hibob-marketplace-install",[19,60505],{},[22,60507,60508],{},[25,60509,60510],{},"October 16, 2026",[22,60512,60513],{},"Use this when a HiBob customer installs your app from Bob Marketplace. Bob sends the browser to a fixed callback with only a code. Unified exchanges that code and creates the connection.",[22,60515,60516],{},"The embedded sign-in flow, where the user starts in Unified and returns to your app, is a different setup. A HiBob app has only one Redirect URI, so see \"One Redirect URI per HiBob app\" below before you choose.",[19,60518],{},[55,60520,17893],{"id":17892},[2354,60522,60523,60526,60535],{},[2357,60524,60525],{},"A Unified workspace in the region where the connection should live",[2357,60527,60528,60529,60534],{},"A HiBob app in the ",[41,60530,60533],{"href":60531,"rel":60532},"https:\u002F\u002Fdevelopers.hibob.com\u002F",[45],"HiBob Developer Portal",", with its Client ID and Client Secret. HiBob OAuth is only available to approved Marketplace and technology partners.",[2357,60536,60537],{},"The scopes your app needs, set on the HiBob app",[19,60539],{},[55,60541,60543],{"id":60542},"_1-save-the-hibob-credentials-in-unified","1. Save the HiBob credentials in Unified",[2510,60545,60546,60549,60552],{},[2357,60547,60548],{},"In Unified, open Integrations and activate HiBob for the environment you are using (Production or Sandbox).",[2357,60550,60551],{},"Enter the Client ID and Client Secret from the HiBob app. HiBob issues separate Development and Production credentials. Use the set that matches the installs you expect, because tokens issued with one set cannot be refreshed with the other.",[2357,60553,60554],{},"Save the integration. The marketplace callback reads these credentials. It does not take a workspace API key, and it does not use the App ID field. Unified only uses the App ID when the install starts in Unified.",[19,60556],{},[55,60558,60560],{"id":60559},"_2-register-the-redirect-uri-on-the-hibob-app","2. Register the Redirect URI on the HiBob app",[22,60562,60563],{},"In the HiBob Developer Portal, open your app and, under OAuth, set the Redirect URI to the callback for this workspace and environment. Use the API host for the workspace region.",[2584,60565,60567],{"className":2649,"code":60566,"language":2651,"meta":2652,"style":2433},"https:\u002F\u002Fapi.unified.to\u002Fhb\u002F{workspace_id}\u002F{environment}\u002Fconnection\n",[36,60568,60569],{"__ignoreMap":2433},[414,60570,60571],{"class":2593,"line":2594},[414,60572,60566],{},[22,60574,60575],{},"Replace the placeholders:",[2354,60577,60578,60581],{},[2357,60579,60580],{},"workspace_id is the Unified workspace ID.",[2357,60582,60583],{},"environment is Production or Sandbox, matching the integration you activated.",[22,60585,60586],{},"Regional hosts:",[2354,60588,60589,60595,60602],{},[2357,60590,60591,60592],{},"United States: ",[41,60593,18395],{"href":18395,"rel":60594},[45],[2357,60596,60597,60598],{},"Europe: ",[41,60599,60600],{"href":60600,"rel":60601},"https:\u002F\u002Fapi-eu.unified.to",[45],[2357,60603,60604,60605],{},"Australia: ",[41,60606,60607],{"href":60607,"rel":60608},"https:\u002F\u002Fapi-au.unified.to",[45],[22,60610,17183],{},[2584,60612,60614],{"className":2649,"code":60613,"language":2651,"meta":2652,"style":2433},"https:\u002F\u002Fapi.unified.to\u002Fhb\u002F5f9c2a1b8e4d3c0011223344\u002FProduction\u002Fconnection\n",[36,60615,60616],{"__ignoreMap":2433},[414,60617,60618],{"class":2593,"line":2594},[414,60619,60613],{},[22,60621,60622],{},"The URI must match exactly. Do not add a query string, a trailing slash, or a success or failure URL. HiBob only sends the authorization code to this address, and Unified sends the same address back to HiBob when it exchanges the code.",[22,60624,60625],{},"When you save the Redirect URI, HiBob regenerates the App Installation URL. If you test with the \"App installation URL for testing\", copy it again after this change.",[19,60627],{},[55,60629,60631],{"id":60630},"_3-install-from-bob-marketplace","3. Install from Bob Marketplace",[2510,60633,60634,60637,60640,60643,60646],{},[2357,60635,60636],{},"In Bob, an admin opens your app in Bob Marketplace and clicks Install.",[2357,60638,60639],{},"Bob shows the consent screen. The admin approves the scopes and chooses the People data access for the app.",[2357,60641,60642],{},"Bob redirects the browser to the URL above with ?code=. The code expires after 5 minutes.",[2357,60644,60645],{},"Unified creates the connection. The HiBob company ID (the companyId claim in the access token) is stored on the connection as the external reference.",[2357,60647,60648],{},"Unified shows a short page saying the install finished and the tab can be closed. Unlike HighLevel, the browser is not sent back to Bob, because the page it came from is the consent screen.",[22,60650,60651],{},"If your workspace listens for new connections, that webhook includes the new connection and its external reference.",[22,60653,60654,60655,60660],{},"To test before your listing is live, follow ",[41,60656,60659],{"href":60657,"rel":60658},"https:\u002F\u002Fapidocs.hibob.com\u002Fdocs\u002Ftest-apps-in-bob-marketplace",[45],"Test apps in Bob Marketplace"," and use your Development credentials in Unified.",[19,60662],{},[55,60664,60666],{"id":60665},"each-hibob-company-is-its-own-connection","Each HiBob company is its own connection",[22,60668,60669],{},"Each company that installs the app creates a separate Unified connection, identified by its HiBob company ID.",[22,60671,60672],{},"Reinstalling the app creates a new connection. It does not update the existing one, and the old connection stops working at its next token refresh.",[19,60674],{},[55,60676,60678],{"id":60677},"one-redirect-uri-per-hibob-app","One Redirect URI per HiBob app",[22,60680,60681,60682,60685],{},"A HiBob app has a single Redirect URI, and HiBob requires every request to use it. An app set up with the URL above is for marketplace installs. Installs that start in Unified's embedded flow use ",[41,60683,21741],{"href":21741,"rel":60684},[45]," as the redirect address, which does not match that app.",[19,60687],{},[55,60689,60691],{"id":60690},"uninstalls","Uninstalls",[22,60693,60694],{},"Customers uninstall the app from Bob Marketplace. HiBob does not send a notification when this happens. The connection stops working at its next token refresh, when HiBob rejects the refresh token.",[19,60696],{},[55,60698,60700],{"id":60699},"if-the-install-fails","If the install fails",[2354,60702,60703,60706,60709,60712,60715,60718],{},[2357,60704,60705],{},"Redirect URI does not match. Compare the HiBob app Redirect URI with the workspace ID, environment, and regional API host.",[2357,60707,60708],{},"HiBob integration is missing, or the Client ID and Client Secret are not saved for that environment.",[2357,60710,60711],{},"Development and Production credentials are mixed up. The credentials saved in Unified must belong to the same set as the install.",[2357,60713,60714],{},"The authorization code expired. Codes last 5 minutes, so start the install again.",[2357,60716,60717],{},"The admin declined the install. Unified shows the error HiBob returned.",[2357,60719,60720],{},"The HiBob app does not include the scopes you need. Scopes are configured on the HiBob app, not on the Redirect URI.",[22,60722,60723,60724,741,60729,97],{},"HiBob reference: ",[41,60725,60728],{"href":60726,"rel":60727},"https:\u002F\u002Fapidocs.hibob.com\u002Fdocs\u002Fadd-and-submit-an-app",[45],"Add and submit an app",[41,60730,60733],{"href":60731,"rel":60732},"https:\u002F\u002Fapidocs.hibob.com\u002Freference\u002Foauth-20",[45],"OAuth 2.0",[4156,60735,5736],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":60737},[60738,60739,60740,60741,60742,60743,60744,60745],{"id":17892,"depth":2434,"text":17893},{"id":60542,"depth":2434,"text":60543},{"id":60559,"depth":2434,"text":60560},{"id":60630,"depth":2434,"text":60631},{"id":60665,"depth":2434,"text":60666},{"id":60677,"depth":2434,"text":60678},{"id":60690,"depth":2434,"text":60691},{"id":60699,"depth":2434,"text":60700},"Use this when a HiBob customer installs your app from Bob Marketplace. Bob sends the browser to a fixed callback with only a code. Unified exchanges that code...",{"img":7949,"date":60748,"updated":60749,"tag":2457,"integrations":23013},"2026-10-16T00:00:00.000Z","2026-10-19T17:30:39.504Z","\u002Fguides\u002Fhow_to_set_up_a_hibob_marketplace_install",{"title":60498,"description":60746},"guides\u002Fhow_to_set_up_a_hibob_marketplace_install","fRU3q3j8tXQfP_zKKpnwa5giSPnQdSf9bytvMxzpHZ4",{"id":60755,"title":22654,"body":60756,"description":60772,"extension":2452,"meta":61416,"navigation":2459,"path":61420,"seo":61421,"stem":61422,"__hash__":61423},"guides\u002Fguides\u002Fhow_to_set_up_a_microsoft_teams_bot_with_unified.md",{"type":12,"value":60757,"toc":61394},[60758,60761,60763,60768,60770,60773,60779,60782,60793,60796,60798,60802,60816,60822,60828,60831,60836,60838,60842,60845,60871,60873,60877,60882,60895,60897,60901,60904,60907,60913,60916,60930,60932,60936,60942,60973,60975,60987,60989,60993,61144,61146,61150,61171,61173,61177,61179,61207,61212,61215,61217,61221,61224,61227,61241,61246,61249,61251,61255,61257,61271,61275,61311,61314,61316,61320,61331,61334,61336,61338,61342,61350,61352,61356,61372,61374,61378,61392],[15,60759,22654],{"id":60760},"how-to-set-up-a-microsoft-teams-bot-with-unified",[19,60762],{},[22,60764,60765],{},[25,60766,60767],{},"April 20, 2026",[55,60769,4426],{"id":4425},[22,60771,60772],{},"If your Microsoft Teams bot connection is created successfully in Unified but later API calls fail with",[22,60774,60775,60778],{},[36,60776,60777],{},"No authorization information present on the request",", the issue is usually not OAuth.",[22,60780,60781],{},"OAuth connects Microsoft 365 to Unified, but your bot still needs to be:",[2354,60783,60784,60787,60790],{},[2357,60785,60786],{},"packaged correctly",[2357,60788,60789],{},"uploaded to Teams",[2357,60791,60792],{},"installed in the correct Team, channel, or chat",[22,60794,60795],{},"Without this, API calls will fail due to missing context.",[19,60797],{},[55,60799,60801],{"id":60800},"️-important-clarification-common-issue","⚠️ Important Clarification (Common Issue)",[2354,60803,60804,60810],{},[2357,60805,60806,60807],{},"The manifest downloaded from ",[31,60808,60809],{},"Microsoft Entra app registration is NOT a valid Teams manifest",[2357,60811,60812,60813],{},"The Microsoft 365 schema is also ",[31,60814,60815],{},"not the correct reference",[22,60817,60818,60819,2646],{},"You must use the ",[31,60820,60821],{},"Microsoft Teams manifest schema",[22,60823,60824],{},[41,60825,60826],{"href":60826,"rel":60827},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fmicrosoftteams\u002Fplatform\u002Fresources\u002Fschema\u002Fmanifest-schema",[45],[22,60829,60830],{},"Using the wrong manifest will result in errors like:",[22,60832,60833],{},[36,60834,60835],{},"Manifest parsing error message unavailable",[19,60837],{},[55,60839,60841],{"id":60840},"what-youll-need","What You'll Need",[22,60843,60844],{},"Before starting:",[2354,60846,60847,60853,60856,60862,60865],{},[2357,60848,60849,60850],{},"Guide: ",[41,60851,22566],{"href":22566,"rel":60852},[45],[2357,60854,60855],{},"A Microsoft Entra app \u002F bot registration",[2357,60857,60858,60859,2980],{},"A Microsoft Teams app package (",[36,60860,60861],{},".zip",[2357,60863,60864],{},"Permission to upload custom apps in Teams",[2357,60866,60867,60868],{},"A Unified connection using ",[31,60869,60870],{},"Microsoft Teams (bot)",[19,60872],{},[55,60874,60876],{"id":60875},"create-a-valid-teams-app-package","Create a Valid Teams App Package",[22,60878,59295,60879,60881],{},[36,60880,60861],{}," must include:",[2354,60883,60884,60889,60892],{},[2357,60885,60886],{},[36,60887,60888],{},"manifest.json",[2357,60890,60891],{},"Color icon (192×192 PNG)",[2357,60893,60894],{},"Outline icon (32×32 PNG)",[19,60896],{},[3629,60898,60900],{"id":60899},"recommended-approach-avoid-manual-errors","Recommended Approach (Avoid Manual Errors)",[22,60902,60903],{},"Instead of writing JSON manually, use:",[22,60905,60906],{},"👉 Teams Developer Portal",[22,60908,60909],{},[41,60910,60911],{"href":60911,"rel":60912},"https:\u002F\u002Flearn.microsoft.com\u002Fen-us\u002Fmicrosoftteams\u002Fplatform\u002Fconcepts\u002Fbuild-and-test\u002Fteams-developer-portal",[45],[22,60914,60915],{},"This allows you to:",[2354,60917,60918,60921,60924,60927],{},[2357,60919,60920],{},"Configure your bot via UI",[2357,60922,60923],{},"Set scopes correctly",[2357,60925,60926],{},"Generate a valid app package",[2357,60928,60929],{},"Avoid manifest parsing errors",[19,60931],{},[3629,60933,60935],{"id":60934},"manifest-checklist","Manifest Checklist",[22,60937,60938,60939,60941],{},"Ensure your ",[36,60940,60888],{}," includes:",[2354,60943,60944,60947,60953],{},[2357,60945,60946],{},"Valid app ID",[2357,60948,60949,60950],{},"Bot capability with correct ",[36,60951,60952],{},"botId",[2357,60954,60955,60956],{},"Required scopes:\n",[2354,60957,60958,60963,60968],{},[2357,60959,60960],{},[36,60961,60962],{},"team",[2357,60964,60965],{},[36,60966,60967],{},"groupchat",[2357,60969,60970,57751],{},[36,60971,60972],{},"personal",[22,60974,5138],{},[2354,60976,60977,60982],{},[2357,60978,60979,60981],{},[36,60980,60962],{}," → for channels",[2357,60983,60984,60986],{},[36,60985,60967],{}," → for chats",[19,60988],{},[3629,60990,60992],{"id":60991},"minimal-manifest-template-reference","Minimal Manifest Template (Reference)",[2584,60994,60996],{"className":2649,"code":60995,"language":2651,"meta":2652,"style":2433},"{\n  \"$schema\":\"https:\u002F\u002Fdeveloper.microsoft.com\u002Fen-us\u002Fjson-schemas\u002Fteams\u002Fv1.16\u002FMicrosoftTeams.schema.json\",\n  \"manifestVersion\":\"1.16\",\n  \"version\":\"1.0.0\",\n  \"id\":\"YOUR-APP-ID\",\n  \"name\": {\n    \"short\":\"My Teams Bot\",\n    \"full\":\"My Teams Bot\"\n  },\n  \"description\": {\n    \"short\":\"Bot for Teams\",\n    \"full\":\"Bot for Teams integrated with Unified\"\n  },\n  \"developer\": {\n    \"name\":\"Your Company\",\n    \"websiteUrl\":\"https:\u002F\u002Fyourdomain.com\",\n    \"privacyUrl\":\"https:\u002F\u002Fyourdomain.com\u002Fprivacy\",\n    \"termsOfUseUrl\":\"https:\u002F\u002Fyourdomain.com\u002Fterms\"\n  },\n  \"icons\": {\n    \"color\":\"color.png\",\n    \"outline\":\"outline.png\"\n  },\n  \"accentColor\":\"#FFFFFF\",\n  \"bots\": [\n    {\n      \"botId\":\"YOUR-ENTRA-APP-ID\",\n      \"scopes\": [\"team\",\"groupchat\"]\n    }\n  ]\n}\n",[36,60997,60998,61002,61007,61012,61017,61022,61027,61032,61037,61041,61046,61051,61056,61060,61065,61070,61075,61080,61085,61089,61094,61099,61104,61108,61113,61118,61122,61127,61132,61136,61140],{"__ignoreMap":2433},[414,60999,61000],{"class":2593,"line":2594},[414,61001,8916],{},[414,61003,61004],{"class":2593,"line":2434},[414,61005,61006],{},"  \"$schema\":\"https:\u002F\u002Fdeveloper.microsoft.com\u002Fen-us\u002Fjson-schemas\u002Fteams\u002Fv1.16\u002FMicrosoftTeams.schema.json\",\n",[414,61008,61009],{"class":2593,"line":2613},[414,61010,61011],{},"  \"manifestVersion\":\"1.16\",\n",[414,61013,61014],{"class":2593,"line":2625},[414,61015,61016],{},"  \"version\":\"1.0.0\",\n",[414,61018,61019],{"class":2593,"line":2677},[414,61020,61021],{},"  \"id\":\"YOUR-APP-ID\",\n",[414,61023,61024],{"class":2593,"line":2751},[414,61025,61026],{},"  \"name\": {\n",[414,61028,61029],{"class":2593,"line":2760},[414,61030,61031],{},"    \"short\":\"My Teams Bot\",\n",[414,61033,61034],{"class":2593,"line":2768},[414,61035,61036],{},"    \"full\":\"My Teams Bot\"\n",[414,61038,61039],{"class":2593,"line":2776},[414,61040,16052],{},[414,61042,61043],{"class":2593,"line":2784},[414,61044,61045],{},"  \"description\": {\n",[414,61047,61048],{"class":2593,"line":2792},[414,61049,61050],{},"    \"short\":\"Bot for Teams\",\n",[414,61052,61053],{"class":2593,"line":2804},[414,61054,61055],{},"    \"full\":\"Bot for Teams integrated with Unified\"\n",[414,61057,61058],{"class":2593,"line":2809},[414,61059,16052],{},[414,61061,61062],{"class":2593,"line":2829},[414,61063,61064],{},"  \"developer\": {\n",[414,61066,61067],{"class":2593,"line":2843},[414,61068,61069],{},"    \"name\":\"Your Company\",\n",[414,61071,61072],{"class":2593,"line":2849},[414,61073,61074],{},"    \"websiteUrl\":\"https:\u002F\u002Fyourdomain.com\",\n",[414,61076,61077],{"class":2593,"line":2854},[414,61078,61079],{},"    \"privacyUrl\":\"https:\u002F\u002Fyourdomain.com\u002Fprivacy\",\n",[414,61081,61082],{"class":2593,"line":2880},[414,61083,61084],{},"    \"termsOfUseUrl\":\"https:\u002F\u002Fyourdomain.com\u002Fterms\"\n",[414,61086,61087],{"class":2593,"line":3253},[414,61088,16052],{},[414,61090,61091],{"class":2593,"line":3261},[414,61092,61093],{},"  \"icons\": {\n",[414,61095,61096],{"class":2593,"line":3279},[414,61097,61098],{},"    \"color\":\"color.png\",\n",[414,61100,61101],{"class":2593,"line":3313},[414,61102,61103],{},"    \"outline\":\"outline.png\"\n",[414,61105,61106],{"class":2593,"line":3326},[414,61107,16052],{},[414,61109,61110],{"class":2593,"line":3339},[414,61111,61112],{},"  \"accentColor\":\"#FFFFFF\",\n",[414,61114,61115],{"class":2593,"line":3359},[414,61116,61117],{},"  \"bots\": [\n",[414,61119,61120],{"class":2593,"line":6453},[414,61121,15559],{},[414,61123,61124],{"class":2593,"line":6459},[414,61125,61126],{},"      \"botId\":\"YOUR-ENTRA-APP-ID\",\n",[414,61128,61129],{"class":2593,"line":6465},[414,61130,61131],{},"      \"scopes\": [\"team\",\"groupchat\"]\n",[414,61133,61134],{"class":2593,"line":6471},[414,61135,10535],{},[414,61137,61138],{"class":2593,"line":6477},[414,61139,8991],{},[414,61141,61142],{"class":2593,"line":6483},[414,61143,3035],{},[19,61145],{},[3629,61147,61149],{"id":61148},"️-notes-follow-as-steps","⚠️ Notes (Follow as Steps)",[2510,61151,61152,61162,61168],{},[2357,61153,61154,61155,4950,61158,61161],{},"Replace ",[36,61156,61157],{},"YOUR-APP-ID",[36,61159,61160],{},"YOUR-ENTRA-APP-ID"," with your actual app ID",[2357,61163,61164,61165,61167],{},"Ensure both icons exist in the ",[36,61166,60861],{}," file",[2357,61169,61170],{},"Use this only as a reference template, not a full production manifest",[19,61172],{},[55,61174,61176],{"id":61175},"upload-the-app-in-microsoft-teams","Upload the App in Microsoft Teams",[22,61178,8320],{},[2510,61180,61181,61186,61191,61197,61202],{},[2357,61182,43590,61183,61185],{},[31,61184,51093],{}," (left sidebar)",[2357,61187,6184,61188],{},[31,61189,61190],{},"Manage your apps",[2357,61192,61193,61194],{},"Stay on ",[31,61195,61196],{},"Apps tab",[2357,61198,6184,61199],{},[31,61200,61201],{},"Upload an app",[2357,61203,61204,61205],{},"Upload your ",[36,61206,60861],{},[22,61208,61209],{},[4201,61210],{"alt":5892,"src":61211},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_a_microsoft_teams_bot_with_unified-0.png",[22,61213,61214],{},"⚠️ If upload option is missing → admin restriction",[19,61216],{},[55,61218,61220],{"id":61219},"install-the-bot-in-the-right-scope","Install the Bot in the Right Scope",[22,61222,61223],{},"Uploading ≠ installing",[22,61225,61226],{},"You must install the bot in:",[2354,61228,61229,61232,61235,61238],{},[2357,61230,61231],{},"A Team",[2357,61233,61234],{},"A channel",[2357,61236,61237],{},"A group chat",[2357,61239,61240],{},"Personal scope",[22,61242,61243],{},[4201,61244],{"alt":5892,"src":61245},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_a_microsoft_teams_bot_with_unified-1.png",[22,61247,61248],{},"⚠️ If not installed → API calls will fail",[19,61250],{},[55,61252,61254],{"id":61253},"connect-microsoft-teams-bot-to-unified","Connect Microsoft Teams (bot) to Unified",[22,61256,8320],{},[2510,61258,61259,61262,61265,61268],{},[2357,61260,61261],{},"Create connection in Unified",[2357,61263,61264],{},"Complete OAuth",[2357,61266,61267],{},"Approve scopes",[2357,61269,61270],{},"Save connection",[3629,61272,61274],{"id":61273},"common-required-scopes","Common Required Scopes",[2354,61276,61277,61282,61287,61292,61297,61302,61307],{},[2357,61278,61279],{},[36,61280,61281],{},"Channel.ReadBasic.All",[2357,61283,61284],{},[36,61285,61286],{},"ChannelMessage.Read.All",[2357,61288,61289],{},[36,61290,61291],{},"ChatMessage.Read",[2357,61293,61294],{},[36,61295,61296],{},"Chat.Read",[2357,61298,61299],{},[36,61300,61301],{},"ChannelMessage.Send",[2357,61303,61304],{},[36,61305,61306],{},"ChatMessage.Send",[2357,61308,61309],{},[36,61310,52958],{},[22,61312,61313],{},"💡 If permissions change → reconnect integration",[19,61315],{},[55,61317,61319],{"id":61318},"test-the-connection","Test the Connection",[2510,61321,61322,61325,61328],{},[2357,61323,61324],{},"Send a message where the bot is installed",[2357,61326,61327],{},"Call Unified messaging API",[2357,61329,61330],{},"Verify read\u002Fsend works",[22,61332,61333],{},"💡 If connection was created before installation → retry",[19,61335],{},[55,61337,5622],{"id":5621},[3629,61339,61341],{"id":61340},"manifest-parsing-error","❌ Manifest parsing error",[2354,61343,61344,61347],{},[2357,61345,61346],{},"Wrong manifest type (Entra instead of Teams)",[2357,61348,61349],{},"Wrong schema",[19,61351],{},[3629,61353,61355],{"id":61354},"app-package-failed-validation","❌ App package failed validation",[2354,61357,61358,61361,61364,61367],{},[2357,61359,61360],{},"Missing icons",[2357,61362,61363],{},"Files not at root",[2357,61365,61366],{},"Invalid JSON",[2357,61368,61369,61371],{},[36,61370,60952],{}," mismatch",[19,61373],{},[3629,61375,61377],{"id":61376},"no-authorization-information-present","❌ No authorization information present",[2354,61379,61380,61383,61386,61389],{},[2357,61381,61382],{},"Bot not installed in correct scope",[2357,61384,61385],{},"Missing permissions",[2357,61387,61388],{},"Wrong scope",[2357,61390,61391],{},"Token outdated → reconnect",[4156,61393,5736],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":61395},[61396,61397,61398,61399,61405,61406,61407,61410,61411],{"id":4425,"depth":2434,"text":4426},{"id":60800,"depth":2434,"text":60801},{"id":60840,"depth":2434,"text":60841},{"id":60875,"depth":2434,"text":60876,"children":61400},[61401,61402,61403,61404],{"id":60899,"depth":2613,"text":60900},{"id":60934,"depth":2613,"text":60935},{"id":60991,"depth":2613,"text":60992},{"id":61148,"depth":2613,"text":61149},{"id":61175,"depth":2434,"text":61176},{"id":61219,"depth":2434,"text":61220},{"id":61253,"depth":2434,"text":61254,"children":61408},[61409],{"id":61273,"depth":2613,"text":61274},{"id":61318,"depth":2434,"text":61319},{"id":5621,"depth":2434,"text":5622,"children":61412},[61413,61414,61415],{"id":61340,"depth":2613,"text":61341},{"id":61354,"depth":2613,"text":61355},{"id":61376,"depth":2613,"text":61377},{"img":61417,"date":61418,"updated":61419,"tag":2457,"integrations":44603},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_a_microsoft_teams_bot_with_unified-icon.png","2026-04-20T14:51:00.000Z","2026-08-23T14:53:18.245Z","\u002Fguides\u002Fhow_to_set_up_a_microsoft_teams_bot_with_unified",{"title":22654,"description":60772},"guides\u002Fhow_to_set_up_a_microsoft_teams_bot_with_unified","0u5le_pPojxhrRgF3nFz4bTdvQrTlaRqraoaBUbo668",{"id":61425,"title":27984,"body":61426,"description":61794,"extension":2452,"meta":61795,"navigation":2459,"path":61799,"seo":61800,"stem":61801,"__hash__":61802},"guides\u002Fguides\u002Fhow_to_set_up_and_configure_notion.md",{"type":12,"value":61427,"toc":61788},[61428,61431,61433,61437,61440,61444,61447,61461,61464,61472,61480,61484,61487,61543,61559,61563,61566,61590,61597,61656,61659,61668,61670,61673,61783,61786],[15,61429,27984],{"id":61430},"how-to-set-up-and-configure-notion",[19,61432],{},[22,61434,61435],{},[25,61436,49444],{},[22,61438,61439],{},"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 databases.",[55,61441,61443],{"id":61442},"understanding-notion-integrations-internal-vs-public","Understanding Notion integrations: Internal vs Public",[22,61445,61446],{},"Before setting up your Notion integration, it's important to understand the two types of integrations Notion offers:",[2510,61448,61449,61455],{},[2357,61450,61451,61454],{},[31,61452,61453],{},"Internal Integrations",": These are confined to a single workspace and are only accessible by members of that workspace. They're ideal for custom workspace enhancements.",[2357,61456,61457,61460],{},[31,61458,61459],{},"Public Integrations",": These are designed for a wider audience and can be used across any Notion workspace. They follow the OAuth 2.0 protocol for workspace access.",[22,61462,61463],{},"The main difference in terms of accessing user data is:",[2354,61465,61466,61469],{},[2357,61467,61468],{},"For Internal Integrations, workspace members explicitly grant access to their pages or databases via Notion's UI.",[2357,61470,61471],{},"For Public Integrations, users authorize access to their pages during the OAuth flow, or by sharing pages directly with the integration.",[22,61473,61474,61475,97],{},"For more information on the differences, refer to the ",[41,61476,61479],{"href":61477,"rel":61478},"https:\u002F\u002Fdevelopers.notion.com\u002Fdocs\u002Fgetting-started",[45],"Notion API Overview",[55,61481,61483],{"id":61482},"setting-up-your-notion-integration","Setting up your Notion integration",[22,61485,61486],{},"The following steps outline how to register a public Notion integration:",[2510,61488,61489,61495,61498,61515,61519,61528,61535],{},[2357,61490,21005,61491],{},[41,61492,61493],{"href":61493,"rel":61494},"https:\u002F\u002Fwww.notion.so\u002Fmy-integrations",[45],[2357,61496,61497],{},"Click on your integration (or create a new one)",[2357,61499,61500,61501],{},"Follow the steps to register a new Notion integration.\n",[2510,61502,61503,61509],{},[2357,61504,20156,61505,22582,61507,97],{},[31,61506,9015],{},[31,61508,22804],{},[2357,61510,20156,61511,52593,61513],{},[31,61512,6281],{},[36,61514,21741],{},[2357,61516,16292,61517,97],{},[31,61518,46022],{},[2357,61520,61521,61522,741,61525],{},"Go to the configuration settings of your newly created integration and make a note of the ",[31,61523,61524],{},"OAuth Client ID",[31,61526,61527],{},"OAuth Client Secret.",[2357,61529,61530,61531,61534],{},"Still under the configuration settings, make sure to select the permissions you need for your app under ",[31,61532,61533],{},"Capabilities"," e.g. read or update content.",[2357,61536,61537,61538,61542],{},"Enter your OAuth credentials on ",[41,61539,61540],{"href":61540,"rel":61541},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fnotion",[45]," to activate the Notion integration.",[22,61544,61545,61547,61548,36672,61551,61554,61555,97],{},[31,61546,22779],{}," If you wish to create an Internal integration, most of the steps above can be skipped, and you will need to enter your ",[36,61549,61550],{},"Internal integration token",[41,61552,21814],{"href":4146,"rel":61553},[45]," instead. Instructions on how to find your internal token can be found ",[41,61556,28103],{"href":61557,"rel":61558},"https:\u002F\u002Fwww.notion.so\u002Fhelp\u002Fcreate-integrations-with-the-notion-api",[45],[55,61560,61562],{"id":61561},"querying-databases-in-notion","Querying databases in Notion",[22,61564,61565],{},"To query databases in Notion, you'll need to use our Unified KMS endpoint:",[2510,61567,61568,61574],{},[2357,61569,61570,61571,61573],{},"First, make sure you have a ",[36,61572,85],{}," for your Notion integration.",[2357,61575,61576,61577,61580,61581],{},"Since database entries in Notion are technically pages, we'll use the ",[31,61578,61579],{},"List all pages"," endpoint:",[2584,61582,61584],{"className":2649,"code":61583,"language":2651,"meta":2652,"style":2433},"GET \u002Fkms\u002F{connection_id}\u002Fpage\n",[36,61585,61586],{"__ignoreMap":2433},[414,61587,61588],{"class":2593,"line":2594},[414,61589,61583],{},[22,61591,61592,61593],{},"API reference: ",[41,61594,61579],{"href":61595,"rel":61596},"https:\u002F\u002Fdocs.unified.to\u002Fkms\u002Fpage\u002FList_all_pages",[45],[2510,61598,61599,61615],{},[2357,61600,61601,61602,61605,61606],{},"When querying pages in a database, you need to pass the database ID as the ",[36,61603,61604],{},"space_id"," parameter. For example:",[2584,61607,61609],{"className":2649,"code":61608,"language":2651,"meta":2652,"style":2433},"GET \u002Fkms\u002F{connection_id}\u002Fpage?space_id={database_id}\n",[36,61610,61611],{"__ignoreMap":2433},[414,61612,61613],{"class":2593,"line":2594},[414,61614,61608],{},[2357,61616,61617,61618],{},"You can use additional parameters to filter and sort your results:",[2354,61619,61620,61625,61630,61635,61640,61646,61651],{},[2357,61621,61622,61624],{},[36,61623,9263],{},": Number of results to return (default: 30)",[2357,61626,61627,61629],{},[36,61628,9275],{},": Number of results to skip (default: 0)",[2357,61631,61632,61634],{},[36,61633,24782],{},": Return only results updated on or after this date",[2357,61636,61637,61639],{},[36,61638,35839],{},": Sort by 'name', 'updated_at', or 'created_at'",[2357,61641,61642,61645],{},[36,61643,61644],{},"order",": Sort order ('asc' or 'desc')",[2357,61647,61648,61650],{},[36,61649,3819],{},": Search query string",[2357,61652,61653,61655],{},[36,61654,27449],{},": Comma-separated list of fields to return",[22,61657,61658],{},"For example, to get the first 50 pages in a database, sorted by name in ascending order:",[2584,61660,61662],{"className":2649,"code":61661,"language":2651,"meta":2652,"style":2433},"GET \u002Fkms\u002F{connection_id}\u002Fpage?space_id={database_id}&limit=50&sort=name&order=asc\n",[36,61663,61664],{"__ignoreMap":2433},[414,61665,61666],{"class":2593,"line":2594},[414,61667,61661],{},[55,61669,46006],{"id":45827},[22,61671,61672],{},"Notion doesn't offer programmatic creation of webhooks, 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.",[2510,61674,61675,61682,61685,61698,61724,61753,61763],{},[2357,61676,61677,61678],{},"Go you your Notion's integrations page at ",[41,61679,61680],{"href":61680,"rel":61681},"https:\u002F\u002Fwww.notion.so\u002Fprofile\u002Fintegrations",[45],[2357,61683,61684],{},"Either create a new integration or select an existing one.",[2357,61686,16460,61687,61689,61690,97,61693,61695],{},[31,61688,46006],{}," tab and click ",[31,61691,61692],{},"+ Create a subscription",[5888,61694],{},[4201,61696],{"alt":5892,"src":61697},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_and_configure_notion-0.png",[2357,61699,61700,61701,61703,61704,61718,61720],{},"Enter your public ",[31,61702,37299],{}," — 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.",[2510,61705,61706,61712],{},[2357,61707,61708,61709],{},"US: ",[36,61710,61711],{},"https:\u002F\u002Fapi.unified.to\u002Fwebhook\u002Fworkspace\u002Fnotion?workspace_id=$WORKSPACE_ID",[2357,61713,61714,61715],{},"EU: ",[36,61716,61717],{},"https:\u002F\u002Fapi-eu.unified.to\u002Fwebhook\u002Fworkspace\u002Fnotion?workspace_id=$WORKSPACE_ID",[5888,61719],{},[4201,61721],{"alt":61722,"src":61723},"1ef497d7b9b3622de379e6907cd722167766413693ac9f1885b59eb028b4e7dd-webhooks-2.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_and_configure_notion-1.png",[2357,61725,61726,61727,741,61729,61731,61732,61734,61735,741,61737,61740,61741,61744,61745,61748,61749,61752],{},"Select the events that you are interested in receiving from all of your customers.  Created and Deleted events are associated with our ",[36,61728,4949],{},[36,61730,4959],{}," events, while all other events are associated with our ",[36,61733,4953],{}," event.  Both Notion's ",[36,61736,20711],{},[36,61738,61739],{},"Database"," are mapped to Unified's ",[36,61742,61743],{},"KMSPage",", while ",[36,61746,61747],{},"Comments"," are mapped to ",[36,61750,61751],{},"KMSComment",". You can modify these later if needed.",[2357,61754,16292,61755,97,61758,61760],{},[31,61756,61757],{},"Create subscription",[5888,61759],{},[4201,61761],{"alt":5892,"src":61762},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_and_configure_notion-2.png",[2357,61764,61765,61766,61770,61771,61774,61775,61778,61780],{},"After you create the notion webhook, notion will send us a verification token. You can find that verification token in ",[41,61767,61768],{"href":61768,"rel":61769},"https:\u002F\u002Fapp.unified.to\u002Fsettings\u002Fapi",[45],". Paste the ",[36,61772,61773],{},"verification_token"," value into the Verify Subscription form in Notion, and click ",[31,61776,61777],{},"Verify subscription.",[5888,61779],{},[4201,61781],{"alt":5892,"src":61782},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_and_configure_notion-3.png",[22,61784,61785],{},"Once completed, you can create webhooks in Unified.to that will receive these Notion events in real-time.",[4156,61787,5736],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":61789},[61790,61791,61792,61793],{"id":61442,"depth":2434,"text":61443},{"id":61482,"depth":2434,"text":61483},{"id":61561,"depth":2434,"text":61562},{"id":45827,"depth":2434,"text":46006},"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...",{"img":61796,"date":49770,"updated":61797,"tag":2457,"integrations":61798},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_and_configure_notion-icon.png","2026-08-23T14:53:49.414Z","notion","\u002Fguides\u002Fhow_to_set_up_and_configure_notion",{"title":27984,"description":61794},"guides\u002Fhow_to_set_up_and_configure_notion","L1frBVXLxNIci1w4z4EZG3aIM011WnmwujYACtfDMNw",{"id":61804,"title":61805,"body":61806,"description":62309,"extension":2452,"meta":62310,"navigation":2459,"path":62314,"seo":62315,"stem":62316,"__hash__":62317},"guides\u002Fguides\u002Fhow_to_set_up_google_business_profile_api_access_and_get_oauth_2_credentials.md","How to set up Google Business Profile API access and get OAuth 2 credentials",{"type":12,"value":61807,"toc":62306},[61808,61811,61813,61818,61838,61860,62234,62236],[15,61809,61805],{"id":61810},"how-to-set-up-google-business-profile-api-access-and-get-oauth-2-credentials",[19,61812],{},[22,61814,61815],{},[25,61816,61817],{},"August 31, 2026",[4937,61819,61820],{},[22,61821,56914,61822,61824,61825,61828,61829,61831,61832,56927,61834,97],{},[31,61823,4943],{}," that Google Business Profile uses the ",[36,61826,61827],{},"https:\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fbusiness.manage"," scope, which Google classifies as ",[36,61830,56923],{},". You need to contact Unified's Support to setup a CNAME for the API URL (US and EU regions) in order to get your App approved by Google.",[5888,61833],{},[41,61835,61837],{"href":56930,"rel":61836},[45],"How to set up a custom API URL",[4937,61839,61840],{},[22,61841,61842,61843,61845,61846,61851,61852,61855,61856,61859],{},"⚠️ Enabling the APIs is ",[31,61844,8239],{}," enough. Until Google approves your ",[41,61847,61850],{"href":61848,"rel":61849},"https:\u002F\u002Fsupport.google.com\u002Fbusiness\u002Fcontact\u002Fapi_default",[45],"Application for Basic API Access",", your project's quota for the Business Profile APIs stays at ",[31,61853,61854],{},"0 requests per minute"," and every call fails with a ",[36,61857,61858],{},"429",". Submit that form as early as possible — Google's review can take several days to a few weeks.",[2510,61861,61862,61889,61923,61965,62047,62068,62117,62148,62173,62201],{},[2357,61863,61864,61866],{},[31,61865,2542],{},[2354,61867,61868,61878,61881],{},[2357,61869,61870,61871,4149,61874,61877],{},"A Google account with ",[31,61872,61873],{},"owner",[31,61875,61876],{},"manager"," access to the Business Profile(s) you want to connect.",[2357,61879,61880],{},"A verified, active Business Profile. Google's review expects the profile to have been active for at least 60 days and to have a website listed on it.",[2357,61882,61883,61884,61888],{},"Review Google's ",[41,61885,2542],{"href":61886,"rel":61887},"https:\u002F\u002Fdevelopers.google.com\u002Fmy-business\u002Fcontent\u002Fprereqs",[45]," page before you apply.",[2357,61890,61891,61894],{},[31,61892,61893],{},"Create a Google Cloud project",[2354,61895,61896,61902,61909,61914],{},[2357,61897,16434,61898,61901],{},[41,61899,7099],{"href":7097,"rel":61900},[45]," and sign in with that Google account.",[2357,61903,46260,61904,61906,61907,97],{},[31,61905,59037],{}," dropdown at the top of the page and choose ",[31,61908,59041],{},[2357,61910,61911,61912,97],{},"Give your project a name and click ",[31,61913,21975],{},[2357,61915,61916,61917,741,61920,61922],{},"Copy the ",[31,61918,61919],{},"Project number",[31,61921,7108],{}," from the Cloud Console dashboard — you need them in the next step.",[2357,61924,61925,61928],{},[31,61926,61927],{},"Submit the Application for Basic API Access",[2354,61929,61930,61937,61959,61962],{},[2357,61931,61932,61933,61936],{},"Open the ",[41,61934,61850],{"href":61848,"rel":61935},[45]," form.",[2357,61938,61939,61940],{},"Fill in the requested information:\n",[2354,61941,61942,61949,61956],{},[2357,61943,8879,61944,741,61946,61948],{},[31,61945,7108],{},[31,61947,61919],{}," from step 2",[2357,61950,61951,61952,61955],{},"The email address of an ",[31,61953,61954],{},"owner or manager"," of the Business Profile",[2357,61957,61958],{},"Your company name, website and a description of how you will use the API",[2357,61960,61961],{},"Submit the form. Google sends a follow-up email once the request has been reviewed.",[2357,61963,61964],{},"You do not have to wait for approval to continue — steps 4 to 8 can be completed right away.",[2357,61966,61967,61970],{},[31,61968,61969],{},"Enable the Business Profile APIs",[2354,61971,61972,61975,62029,62038],{},[2357,61973,61974],{},"In the Google Cloud Console, make sure your project is selected.",[2357,61976,16270,61977,61982,61983],{},[41,61978,61980],{"href":56968,"rel":61979},[45],[31,61981,52510],{}," and enable each of the following:\n",[2354,61984,61985,61996,62007,62018],{},[2357,61986,61987,3970,61992,61995],{},[41,61988,61991],{"href":61989,"rel":61990},"https:\u002F\u002Fconsole.cloud.google.com\u002Fapis\u002Flibrary\u002Fmybusiness.googleapis.com",[45],"Google My Business API",[36,61993,61994],{},"mybusiness.googleapis.com",") — posts and reviews",[2357,61997,61998,3970,62003,62006],{},[41,61999,62002],{"href":62000,"rel":62001},"https:\u002F\u002Fconsole.cloud.google.com\u002Fapis\u002Flibrary\u002Fmybusinessaccountmanagement.googleapis.com",[45],"My Business Account Management API",[36,62004,62005],{},"mybusinessaccountmanagement.googleapis.com",") — the accounts you manage",[2357,62008,62009,3970,62014,62017],{},[41,62010,62013],{"href":62011,"rel":62012},"https:\u002F\u002Fconsole.cloud.google.com\u002Fapis\u002Flibrary\u002Fmybusinessbusinessinformation.googleapis.com",[45],"My Business Business Information API",[36,62015,62016],{},"mybusinessbusinessinformation.googleapis.com",") — the locations under each account",[2357,62019,62020,3970,62025,62028],{},[41,62021,62024],{"href":62022,"rel":62023},"https:\u002F\u002Fconsole.cloud.google.com\u002Fapis\u002Flibrary\u002Fbusinessprofileperformance.googleapis.com",[45],"Business Profile Performance API",[36,62026,62027],{},"businessprofileperformance.googleapis.com",") — location insights",[2357,62030,62031,62032,62037],{},"These four are the only APIs Unified calls. Google ",[41,62033,62036],{"href":62034,"rel":62035},"https:\u002F\u002Fdevelopers.google.com\u002Fmy-business\u002Fcontent\u002Fbasic-setup",[45],"documents several others"," (Notifications, Verifications, Q&A, Place Actions, Lodging) — you do not need them for a Unified connection.",[2357,62039,8879,62040,62042,62043,62046],{},[31,62041,61991],{}," only becomes visible in the Library ",[31,62044,62045],{},"after"," your Basic API Access request is approved. If you cannot find it, come back to this step once you receive Google's approval email.",[2357,62048,62049,62051],{},[31,62050,57008],{},[2354,62052,62053,62058,62062],{},[2357,62054,57013,62055,97],{},[41,62056,57018],{"href":57016,"rel":62057},[45],[2357,62059,57021,62060,97],{},[31,62061,21975],{},[2357,62063,21005,62064,62067],{},[41,62065,57033],{"href":57031,"rel":62066},[45]," and fill in the required information, including your app name, support email, authorized domain and privacy policy URL.",[2357,62069,62070,62072],{},[31,62071,36554],{},[2354,62073,62074,62079,62090,62099,62111],{},[2357,62075,21005,62076,97],{},[41,62077,57048],{"href":57046,"rel":62078},[45],[2357,62080,36559,62081,62083,62084,319,62086,741,62088,97],{},[36,62082,61827],{},", plus ",[36,62085,52949],{},[36,62087,57056],{},[36,62089,57059],{},[2357,62091,62092,62093,62098],{},"The exact list of scopes used by Unified can always be found in the ",[41,62094,62097],{"href":62095,"rel":62096},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fgooglebusinessprofile?tab=oauth2",[45],"Google Business Profile integration"," in the Unified App.",[2357,62100,62101,62103,62104,62107,62108,62110],{},[31,62102,4943],{}," that ",[36,62105,62106],{},"business.manage"," is a ",[36,62109,56923],{}," scope, so you need to contact Unified's Support to setup a CNAME for the redirect URL (US and EU regions) in order to get your App approved by Google.",[2357,62112,62113,62114,62116],{},"Review the information and click ",[31,62115,57107],{}," through the steps.",[2357,62118,62119,62122],{},[31,62120,62121],{},"Create OAuth 2.0 Credentials",[2354,62123,62124,62129,62135,62141],{},[2357,62125,21005,62126,57121],{},[41,62127,57120],{"href":57118,"rel":62128},[45],[2357,62130,28009,62131,36664,62133,97],{},[31,62132,57127],{},[31,62134,52586],{},[2357,62136,62137,62138,62098],{},"Configure the authorized redirect URI. Get the correct value from the ",[41,62139,62097],{"href":62095,"rel":62140},[45],[2357,62142,62143,62144,741,62146,97],{},"Copy your ",[31,62145,4491],{},[31,62147,4494],{},[2357,62149,62150,62153],{},[31,62151,62152],{},"Publish your Application",[2354,62154,62155,62164],{},[2357,62156,21005,62157,62160,62161,97],{},[41,62158,57175],{"href":57173,"rel":62159},[45]," and click on ",[31,62162,62163],{},"Publish app",[2357,62165,62166,62167,62169,62170,62172],{},"Because you are using a ",[36,62168,56923],{}," scope, Google will require verification of your app. Until it is verified, your consent screen will show the ",[36,62171,47781],{}," name, which is inferred from the redirect URL — this is what the CNAME in step 1 solves.",[2357,62174,62175,62178],{},[31,62176,62177],{},"Configure your Unified integration",[2354,62179,62180,62198],{},[2357,62181,37282,62182,62186,62187],{},[41,62183,62097],{"href":62184,"rel":62185},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fgooglebusinessprofile?tab=auth",[45]," in the Unified App, enter:\n",[2354,62188,62189,62194],{},[2357,62190,62191,62192],{},"The OAuth client's ",[31,62193,4491],{},[2357,62195,62191,62196],{},[31,62197,4494],{},[2357,62199,62200],{},"Save the integration. You are now ready to authorize a Google Business Profile connection.",[2357,62202,62203,62206],{},[31,62204,62205],{},"Verify that your API access was approved",[2354,62207,62208,62218,62227],{},[2357,62209,21005,62210,62215,62216,97],{},[41,62211,62214],{"href":62212,"rel":62213},"https:\u002F\u002Fconsole.cloud.google.com\u002Fiam-admin\u002Fquotas",[45],"IAM & Admin > Quotas"," in the Cloud Console and filter by one of the Business Profile services, for example ",[36,62217,62005],{},[2357,62219,2553,62220,62223,62224,62226],{},[31,62221,62222],{},"Requests per minute"," limit of ",[31,62225,3604],{}," means your Basic API Access request has not been approved yet.",[2357,62228,62229,62230,62233],{},"A limit of ",[31,62231,62232],{},"300"," means you have been approved and your connection will work.",[55,62235,5622],{"id":5621},[155,62237,62238,62247],{},[158,62239,62240],{},[161,62241,62242,62244],{},[164,62243,37665],{},[164,62245,62246],{},"Cause and fix",[174,62248,62249,62262,62273,62284,62298],{},[161,62250,62251,62259],{},[179,62252,62253,39,62256],{},[36,62254,62255],{},"429 RATE_LIMIT_EXCEEDED",[25,62257,62258],{},"Quota exceeded for quota metric 'Requests' and limit 'Requests per minute'",[179,62260,62261],{},"Either your Basic API Access request is still pending (quota is 0 QPM), or you are exceeding the default 300 QPM. Check the quota as described in step 10, and request a quota increase from the same Quotas page if you legitimately need more.",[161,62263,62264,62270],{},[179,62265,62266,62269],{},[36,62267,62268],{},"invalid_client"," when authorizing a connection",[179,62271,62272],{},"The Client ID or Client Secret in the Unified integration does not match the OAuth client, or the redirect URI in Google does not match the one shown in the integration. Re-copy all three values.",[161,62274,62275,62281],{},[179,62276,62277,62280],{},[36,62278,62279],{},"403 PERMISSION_DENIED"," or an empty list of accounts",[179,62282,62283],{},"The Google account used to authorize does not have owner or manager access to the Business Profile, or the required API from step 4 is not enabled on the project.",[161,62285,62286,62292],{},[179,62287,62288,62289,62291],{},"The consent screen shows ",[36,62290,47781],{}," instead of your app name",[179,62293,62294,62295,97],{},"Your app has not been verified by Google yet. Contact Unified's Support to setup a CNAME for the API URL (US and EU regions), then submit your app for verification. See ",[41,62296,61837],{"href":56930,"rel":62297},[45],[161,62299,62300,62303],{},[179,62301,62302],{},"An API cannot be found in the Cloud Console Library",[179,62304,62305],{},"The Google My Business API is only exposed once Google approves your Basic API Access request. Wait for the approval email and enable it then.",{"title":2433,"searchDepth":2434,"depth":2434,"links":62307},[62308],{"id":5621,"depth":2434,"text":5622},"> 💡 Note that Google Business Profile uses the `https,\u002F\u002Fwww.googleapis.com\u002Fauth\u002Fbusiness.manage` scope, which Google classifies as `Sensitive`. You need to...",{"img":7949,"date":62311,"updated":62312,"tag":2457,"integrations":62313},"2026-08-31T12:29:00.000Z","2026-10-09T18:43:22.627Z","googlebusinessprofile","\u002Fguides\u002Fhow_to_set_up_google_business_profile_api_access_and_get_oauth_2_credentials",{"title":61805,"description":62309},"guides\u002Fhow_to_set_up_google_business_profile_api_access_and_get_oauth_2_credentials","xdnuOn8Wu5FsXfHCkftYTWywIHCB5YYNIUHYsi3qzEU",{"id":62319,"title":62320,"body":62321,"description":62804,"extension":2452,"meta":62805,"navigation":2459,"path":62810,"seo":62811,"stem":62812,"__hash__":62813},"guides\u002Fguides\u002Fhow_to_set_up_linkedin_webhooks_with_unified.md","How to Set Up LinkedIn Webhooks with Unified",{"type":12,"value":62322,"toc":62795},[62323,62326,62328,62333,62336,62340,62348,62359,62365,62368,62373,62412,62417,62420,62449,62454,62459,62462,62492,62497,62500,62520,62523,62529,62538,62543,62546,62549,62557,62560,62565,62594,62597,62603,62613,62616,62619,62622,62628,62631,62637,62643,62698,62715,62721,62724,62729,62741,62745,62759,62768,62777,62780,62785,62790],[15,62324,62320],{"id":62325},"how-to-set-up-linkedin-webhooks-with-unified",[19,62327],{},[22,62329,62330],{},[25,62331,62332],{},"February 14, 2026",[22,62334,62335],{},"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 other integrations, so there's no need to learn LinkedIn's proprietary webhook protocol.",[55,62337,62338],{"id":60840},[31,62339,60841],{},[22,62341,62342,62343,62347],{},"Before starting, review the ",[41,62344,27224],{"href":62345,"rel":62346},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fgetting_started_with_unified",[45]," article if you haven't already. You'll also need:",[2354,62349,62350,62353,62356],{},[2357,62351,62352],{},"A LinkedIn developer app (see setup instructions below)",[2357,62354,62355],{},"A LinkedIn connection created through Unified's embedded auth flow",[2357,62357,62358],{},"A publicly accessible URL to receive webhook events",[55,62360,62362],{"id":62361},"setting-up-your-linkedin-developer-app",[31,62363,62364],{},"Setting Up Your LinkedIn Developer App",[22,62366,62367],{},"Before you can receive webhook events, you need a LinkedIn app configured with the right products and permissions.",[22,62369,62370],{},[31,62371,62372],{},"Creating the App",[2510,62374,62375,62385,62407],{},[2357,62376,7257,62377,62382,62383],{},[41,62378,62381],{"href":62379,"rel":62380},"https:\u002F\u002Fwww.linkedin.com\u002Fdevelopers\u002Fapps",[45],"linkedin.com\u002Fdevelopers\u002Fapps"," and click ",[31,62384,45215],{},[2357,62386,62387,62388],{},"Fill in the required fields:\n",[2354,62389,62390,62395,62401],{},[2357,62391,62392,62394],{},[31,62393,45539],{},": Your application's name",[2357,62396,62397,62400],{},[31,62398,62399],{},"LinkedIn Page",": Select the LinkedIn company page you want to monitor (you must be an admin of the page)",[2357,62402,62403,62406],{},[31,62404,62405],{},"App logo",": Upload a logo for your app",[2357,62408,62409,62410],{},"Accept the legal terms and click ",[31,62411,51181],{},[22,62413,62414],{},[31,62415,62416],{},"Requesting API Products",[22,62418,62419],{},"LinkedIn gates webhook access behind specific API products. From your app's settings page:",[2510,62421,62422,62427,62438],{},[2357,62423,62424,62425,50203],{},"Navigate to the ",[31,62426,33642],{},[2357,62428,62429,62430,62433,62434,62437],{},"Request access to ",[31,62431,62432],{},"Community Management API",", which grants the ",[36,62435,62436],{},"r_organization_social"," scope needed for social action notifications",[2357,62439,62440,62441,62444,62445,62448],{},"If you also want to send messages, request ",[31,62442,62443],{},"LinkedIn Marketing API Partner Program"," for the ",[36,62446,62447],{},"w_messages"," scope",[22,62450,62451,62452,7301],{},"Product approvals can take a few business days. You can check the status on the ",[31,62453,33642],{},[22,62455,62456],{},[31,62457,62458],{},"Configuring OAuth Scopes",[22,62460,62461],{},"Once your products are approved:",[2510,62463,62464,62469,62478,62486],{},[2357,62465,7094,62466,62468],{},[31,62467,51141],{}," tab in your app settings",[2357,62470,6235,62471,62474,62475,62477],{},[31,62472,62473],{},"OAuth 2.0 scopes",", verify that ",[36,62476,62436],{}," is listed",[2357,62479,62480,62481,4950,62483,62485],{},"Copy your ",[31,62482,4491],{},[31,62484,4494],{},"; you'll need these when creating a connection in Unified",[2357,62487,6235,62488,62491],{},[31,62489,62490],{},"Authorized redirect URLs",", add your Unified OAuth callback URL",[22,62493,62494],{},[31,62495,62496],{},"Verifying Your Company Page",[22,62498,62499],{},"LinkedIn requires that your developer app is associated with a verified company page:",[2510,62501,62502,62507,62513],{},[2357,62503,7094,62504,62506],{},[31,62505,36643],{}," tab in your app",[2357,62508,6235,62509,62512],{},[31,62510,62511],{},"App Settings",", confirm the correct LinkedIn Page is linked",[2357,62514,62515,62516,62519],{},"A page admin must verify the app. Click ",[31,62517,62518],{},"Generate URL"," next to the verification prompt and share it with a page admin if needed",[22,62521,62522],{},"Once the page is verified and the products are approved, your app is ready to receive social action notifications.",[55,62524,62526],{"id":62525},"creating-a-webhook-for-linkedin-events",[31,62527,62528],{},"Creating a Webhook for LinkedIn Events",[22,62530,62531,62532,62534,62535,62537],{},"You can create a webhook subscription through the API or the Unified dashboard. The webhook will listen for ",[36,62533,20776],{}," objects with the ",[36,62536,4949],{}," event, which is how LinkedIn's social action notifications are surfaced.",[22,62539,62540],{},[31,62541,62542],{},"Via the API",[22,62544,62545],{},"`import { UnifiedTo } from '@unified-api\u002Ftypescript-sdk';",[22,62547,62548],{},"const sdk = new UnifiedTo({\nsecurity: {\njwt: process.env.UNIFIED_API_KEY!,\n},\n});",[22,62550,62551,62552,62556],{},"const webhook = await sdk.unified.createUnifiedWebhook({\nwebhook: {\nhookUrl: '",[41,62553,62554],{"href":62554,"rel":62555},"https:\u002F\u002Fyour-app.com\u002Fwebhooks\u002Flinkedin",[45],"',\nconnectionId: process.env.LINKEDIN_CONNECTION_ID!,\nobjectType: 'messaging_event',\nevent: 'created',\n},\n});",[22,62558,62559],{},"console.log('Webhook created:', webhook.webhook?.id);`",[22,62561,62562],{},[31,62563,62564],{},"Via the Dashboard",[2510,62566,62567,62573,62580,62583,62591],{},[2357,62568,43590,62569,62572],{},[41,62570,21814],{"href":4146,"rel":62571},[45]," and navigate to your workspace",[2357,62574,7257,62575,43573,62577],{},[31,62576,46006],{},[31,62578,62579],{},"Create Webhook",[2357,62581,62582],{},"Select your LinkedIn connection",[2357,62584,62585,62586,62588,62589],{},"Set the object type to ",[36,62587,20776],{}," and the event to ",[36,62590,4949],{},[2357,62592,62593],{},"Enter your webhook URL and save",[22,62595,62596],{},"Once the webhook is active, Unified registers your endpoint with LinkedIn's event subscription API using the organization URN from your connection.",[55,62598,62600],{"id":62599},"receiving-events",[31,62601,62602],{},"Receiving Events",[22,62604,62605,62606,62609,62610,62612],{},"When someone interacts with your LinkedIn company page, Unified converts the raw LinkedIn notification into a standard ",[36,62607,62608],{},"MessagingEvent"," object and POSTs it to your ",[36,62611,5053],{},". Here's what that looks like:",[22,62614,62615],{},"`import express from 'express';",[22,62617,62618],{},"const app = express();\napp.use(express.json());",[22,62620,62621],{},"app.post('\u002Fwebhooks\u002Flinkedin', (req, res) => {\nconst event = req.body;",[2584,62623,62626],{"className":62624,"code":62625,"language":2652},[50343],"switch (event.type) {\n    case 'MESSAGE_RECEIVED':\n        \u002F\u002F Someone commented on a company post, shared it, or edited\u002Fdeleted 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        \u002F\u002F Someone liked a company post\n        console.log('Like from:', event.user?.id);\n        break;\n\n    case 'APP_MENTION':\n        \u002F\u002F Your company was mentioned in a share\n        console.log('Mentioned by:', event.user?.id);\n        break;\n}\n\nres.sendStatus(200);\n",[36,62627,62625],{"__ignoreMap":2433},[22,62629,62630],{},"});`",[55,62632,62634],{"id":62633},"event-type-mapping",[31,62635,62636],{},"Event Type Mapping",[22,62638,62639,62640,62642],{},"LinkedIn's social action types are mapped to Unified's standard ",[36,62641,62608],{}," types:",[2354,62644,62645,62658,62668,62677,62686],{},[2357,62646,62647,4950,62650,62653,62654,62657],{},[31,62648,62649],{},"COMMENT",[31,62651,62652],{},"ADMIN_COMMENT"," become ",[36,62655,62656],{},"MESSAGE_RECEIVED",": a new comment was posted on your organization's content",[2357,62659,62660,62663,62664,62667],{},[31,62661,62662],{},"LIKE"," becomes ",[36,62665,62666],{},"REACTION_ADDED",": someone liked your organization's post",[2357,62669,62670,62673,62674,62676],{},[31,62671,62672],{},"SHARE"," becomes ",[36,62675,62656],{},": someone shared your organization's content",[2357,62678,62679,62663,62682,62685],{},[31,62680,62681],{},"SHARE_MENTION",[36,62683,62684],{},"APP_MENTION",": your organization was mentioned in a share",[2357,62687,62688,4950,62691,62694,62695,62697],{},[31,62689,62690],{},"COMMENT_EDIT",[31,62692,62693],{},"COMMENT_DELETE"," become ",[36,62696,62656],{},": an existing comment was modified or removed",[22,62699,62700,62701,62704,62705,62708,62709,62711,62712,62714],{},"Each event includes the ",[36,62702,62703],{},"channel"," field set to your organization's ID, the ",[36,62706,62707],{},"user"," field with the actor's person ID, and a ",[36,62710,46324],{}," timestamp. The original LinkedIn payload is always available in the ",[36,62713,96],{}," field if you need additional detail.",[55,62716,62718],{"id":62717},"sending-messages-alongside-webhooks",[31,62719,62720],{},"Sending Messages Alongside Webhooks",[22,62722,62723],{},"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.",[22,62725,62726],{},[36,62727,62728],{},"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!, });",[22,62730,62731,62732,62734,62735,62738,62739,20056],{},"Note that LinkedIn's Messages API requires partner-level access with the ",[36,62733,62447],{}," scope. Message creation supports new conversations (via ",[36,62736,62737],{},"destinationMembers",") or replies to existing threads (via ",[36,62740,30001],{},[55,62742,62743],{"id":5621},[31,62744,5622],{},[22,62746,62747,62750,62751,62753,62754,62758],{},[31,62748,62749],{},"Webhook not receiving events?"," LinkedIn requires the ",[36,62752,62436],{}," OAuth scope, which is granted through the Community Management API product. Verify your app has this product approved on the ",[41,62755,62757],{"href":62379,"rel":62756},[45],"LinkedIn Developer Portal",", and that your connection has the scope by checking the connection details in the Unified dashboard.",[22,62760,62761,62764,62765,62767],{},[31,62762,62763],{},"Events arriving for the wrong organization?"," The webhook subscription is tied to the ",[36,62766,8506],{}," 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.",[22,62769,62770,62773,62774,62776],{},[31,62771,62772],{},"LinkedIn Page not verified?"," Your developer app must be associated with a verified company page. Go to your app's ",[31,62775,36643],{}," tab on the LinkedIn Developer Portal and complete the page verification process. A page admin must approve the association.",[22,62778,62779],{},"With just a few lines of code, you're now receiving LinkedIn engagement events through the same webhook API you use for Slack, Discord, and other messaging integrations on Unified. No custom protocol handling required.",[22,62781,5728,62782,97],{},[41,62783,5733],{"href":5731,"rel":62784},[45],[22,62786,62787],{},[41,62788,53067],{"href":21420,"rel":62789},[45],[22,62791,62792],{},[41,62793,53073],{"href":4152,"rel":62794},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":62796},[62797,62798,62799,62800,62801,62802,62803],{"id":60840,"depth":2434,"text":60841},{"id":62361,"depth":2434,"text":62364},{"id":62525,"depth":2434,"text":62528},{"id":62599,"depth":2434,"text":62602},{"id":62633,"depth":2434,"text":62636},{"id":62717,"depth":2434,"text":62720},{"id":5621,"depth":2434,"text":5622},"LinkedIn's Organization Social Action Notifications let you receive real-time updates when people interact with your company page, likes, comments, shares, and...",{"img":62806,"date":62807,"updated":62808,"tag":2457,"integrations":62809},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_linkedin_webhooks_with_unified-icon.png","2026-02-14T23:04:00.000Z","2026-10-13T00:41:41.331Z","linkedin","\u002Fguides\u002Fhow_to_set_up_linkedin_webhooks_with_unified",{"title":62320,"description":62804},"guides\u002Fhow_to_set_up_linkedin_webhooks_with_unified","aFET5dRZwbb8ZoVLUUuvkyhLaB8n2EXiEvHJ7htzrLk",{"id":62815,"title":62816,"body":62817,"description":62831,"extension":2452,"meta":63261,"navigation":2459,"path":63266,"seo":63267,"stem":63268,"__hash__":63269},"guides\u002Fguides\u002Fhow_to_set_up_native_webhooks_for_quickbooks_online_with_unified.md","How to set up native webhooks for QuickBooks Online with Unified",{"type":12,"value":62818,"toc":63250},[62819,62822,62824,62829,62832,62844,62852,62854,62856,62871,62873,62877,62880,62889,62904,62906,62915,62917,62921,62937,62939,62943,62950,62962,62980,62982,62986,62989,63056,63070,63076,63078,63082,63088,63090,63120,63122,63126,63146,63148,63150,63215,63220,63222,63226,63248],[15,62820,62816],{"id":62821},"how-to-set-up-native-webhooks-for-quickbooks-online-with-unified",[19,62823],{},[22,62825,62826],{},[25,62827,62828],{},"August 25, 2026",[22,62830,62831],{},"How to set up native webhooks for QuickBooks Online with Unified.",[22,62833,62834,62835,62837,62838,62843],{},"Intuit does ",[31,62836,8239],{}," provide a programmatic webhook-registration API. The callback URL and entity subscriptions are configured in the ",[41,62839,62842],{"href":62840,"rel":62841},"https:\u002F\u002Fdeveloper.intuit.com\u002F",[45],"Intuit Developer Portal",". Unified then receives Intuit deliveries and fans them out to your Unified webhook subscriptions.",[22,62845,62846,62847],{},"Official Intuit docs: ",[41,62848,62851],{"href":62849,"rel":62850},"https:\u002F\u002Fdeveloper.intuit.com\u002Fapp\u002Fdeveloper\u002Fqbo\u002Fdocs\u002Fdevelop\u002Fwebhooks\u002Fconfigure-webhooks",[45],"Configure webhooks",[19,62853],{},[55,62855,2542],{"id":2541},[2354,62857,62858,62861,62864],{},[2357,62859,62860],{},"An Intuit Developer app with QuickBooks Online Accounting scopes",[2357,62862,62863],{},"A Unified workspace and a connected QuickBooks Online connection (OAuth completed)",[2357,62865,62866,62867,62870],{},"Your Unified ",[31,62868,62869],{},"workspace ID"," (from the Unified dashboard \u002F API)",[19,62872],{},[55,62874,62876],{"id":62875},"step-1-build-the-unified-webhook-endpoint-url","Step 1: Build the Unified webhook endpoint URL",[22,62878,62879],{},"Use this format:",[2584,62881,62883],{"className":2649,"code":62882,"language":2651,"meta":2652,"style":2433},"https:\u002F\u002Fapi.unified.to\u002Fwebhook\u002Fworkspace\u002Fquickbooks?workspace_id=YOUR_WORKSPACE_ID\n",[36,62884,62885],{"__ignoreMap":2433},[414,62886,62887],{"class":2593,"line":2594},[414,62888,62882],{},[4937,62890,62891],{},[22,62892,62893,62894,62897,62898,62900,62901,62903],{},"💡 Replace ",[36,62895,62896],{},"YOUR_WORKSPACE_ID"," with your actual Unified workspace ID.",[5888,62899],{},"\nIf your workspace runs in another Unified data region, use that region's API host instead of ",[36,62902,37266],{}," (for example EU \u002F AU hosts).",[22,62905,17183],{},[2584,62907,62909],{"className":2649,"code":62908,"language":2651,"meta":2652,"style":2433},"https:\u002F\u002Fapi.unified.to\u002Fwebhook\u002Fworkspace\u002Fquickbooks?workspace_id=5e8ba11d3fb8ff95c90b2\n",[36,62910,62911],{"__ignoreMap":2433},[414,62912,62913],{"class":2593,"line":2594},[414,62914,62908],{},[19,62916],{},[55,62918,62920],{"id":62919},"step-2-open-your-app-in-the-intuit-developer-portal","Step 2: Open your app in the Intuit Developer Portal",[2510,62922,62923,62929,62932],{},[2357,62924,21005,62925],{},[41,62926,62927],{"href":62927,"rel":62928},"https:\u002F\u002Fdeveloper.intuit.com\u002Fapp\u002Fdeveloper\u002Fdashboard",[45],[2357,62930,62931],{},"Sign in and open the QuickBooks Online app that customers connect through Unified",[2357,62933,62934,62935],{},"In the left navigation, select ",[31,62936,46006],{},[19,62938],{},[55,62940,62942],{"id":62941},"step-3-choose-production-or-development","Step 3: Choose Production or Development",[22,62944,62945,62946,62949],{},"Intuit maintains ",[31,62947,62948],{},"separate"," webhook configs:",[2354,62951,62952,62957],{},[2357,62953,62954,62956],{},[31,62955,43608],{},": live QuickBooks Online companies",[2357,62958,62959,62961],{},[31,62960,43596],{},": sandbox \u002F testing",[2510,62963,62964,62971,62974],{},[2357,62965,21834,62966,4149,62968,62970],{},[31,62967,43608],{},[31,62969,43596],{}," to match the companies you are testing",[2357,62972,62973],{},"Enter the Endpoint URL from Step 1",[2357,62975,16292,62976,62979],{},[31,62977,62978],{},"Show webhooks"," (or equivalent) to expand the entity list",[19,62981],{},[55,62983,62985],{"id":62984},"step-4-enable-the-entities-unified-supports","Step 4: Enable the entities Unified supports",[22,62987,62988],{},"Enable at least the entities that map to the Unified objects you care about:",[155,62990,62991,63010],{},[158,62992,62993],{},[161,62994,62995,63000,63005],{},[164,62996,62997],{},[31,62998,62999],{},"QuickBooks entity",[164,63001,63002],{},[31,63003,63004],{},"Unified object",[164,63006,63007],{},[31,63008,63009],{},"Operations to enable",[174,63011,63012,63023,63033,63044],{},[161,63013,63014,63016,63020],{},[179,63015,8736],{},[179,63017,63018],{},[36,63019,47222],{},[179,63021,63022],{},"Create, Update, Delete",[161,63024,63025,63027,63031],{},[179,63026,4710],{},[179,63028,63029],{},[36,63030,47222],{},[179,63032,63022],{},[161,63034,63035,63037,63042],{},[179,63036,4670],{},[179,63038,63039],{},[36,63040,63041],{},"accounting_invoice",[179,63043,63022],{},[161,63045,63046,63049,63054],{},[179,63047,63048],{},"Class",[179,63050,63051],{},[36,63052,63053],{},"accounting_category",[179,63055,21935],{},[4937,63057,63058],{},[22,63059,63060,63061,63063,63064,63066],{},"📚 ",[31,63062,63048],{}," is listed as a supported webhook entity in Intuit's docs (Create \u002F Update \u002F Delete):",[5888,63065],{},[41,63067,63069],{"href":62849,"rel":63068},[45],"Configure webhooks → supported API entities",[2510,63071,63072],{},[2357,63073,21834,63074],{},[31,63075,46022],{},[19,63077],{},[55,63079,63081],{"id":63080},"step-5-create-unified-webhooks-for-each-objectevent","Step 5: Create Unified webhooks for each object\u002Fevent",[22,63083,63084,63085,63087],{},"In Unified, create a ",[31,63086,37223],{}," webhook for each object + event pair you need.",[22,63089,45582],{},[2354,63091,63092,63102,63112],{},[2357,63093,63094,20790,63096,10753,63098,10753,63100],{},[36,63095,47222],{},[36,63097,4949],{},[36,63099,4953],{},[36,63101,4959],{},[2357,63103,63104,20790,63106,10753,63108,10753,63110],{},[36,63105,63041],{},[36,63107,4949],{},[36,63109,4953],{},[36,63111,4959],{},[2357,63113,63114,20790,63116,10753,63118],{},[36,63115,63053],{},[36,63117,4949],{},[36,63119,4953],{},[19,63121],{},[55,63123,63125],{"id":63124},"step-6-test-the-delivery-path","Step 6: Test the delivery path",[2510,63127,63128,63135,63143],{},[2357,63129,63130,63131,63134],{},"In the Intuit Developer Portal Webhooks page, use ",[31,63132,63133],{},"Send test notification"," (if available) to confirm your endpoint responds with HTTP 200 quickly",[2357,63136,63137,63138,63140,63141],{},"In a connected QuickBooks company (sandbox or production matching Step 3), create or update an enabled entity; for example, create\u002Fupdate a ",[31,63139,63048],{}," for ",[36,63142,63053],{},[2357,63144,63145],{},"Confirm Unified receives the delivery and dispatches to your Unified webhook hook URL",[19,63147],{},[55,63149,5622],{"id":5621},[2354,63151,63152,63187,63201],{},[2357,63153,63154,63157],{},[31,63155,63156],{},"No events arriving",[2354,63158,63159,63164,63173,63179],{},[2357,63160,63161,63162],{},"Confirm the Endpoint URL includes the correct ",[36,63163,24263],{},[2357,63165,63166,63167,63169,63170,63172],{},"Confirm you configured ",[31,63168,43608],{}," vs ",[31,63171,43596],{}," for the company you changed",[2357,63174,63175,63176,63178],{},"Confirm the entity (e.g. ",[31,63177,63048],{},") is enabled in the Intuit portal",[2357,63180,63181,63182,63184,63185],{},"Confirm a Unified native webhook exists for that ",[36,63183,17057],{}," + ",[36,63186,5060],{},[2357,63188,63189,63192],{},[31,63190,63191],{},"Subscribe fails with realm_id error",[2354,63193,63194],{},[2357,63195,63196,63197,63200],{},"Re-auth the QuickBooks connection so ",[36,63198,63199],{},"realm_id"," is present",[2357,63202,63203,63206],{},[31,63204,63205],{},"Events for one company only",[2354,63207,63208],{},[2357,63209,63210,63211,63214],{},"Expected: matching is per ",[36,63212,63213],{},"realmId",". Each company connection has its own subscription marker",[22,63216,5728,63217,97],{},[41,63218,5733],{"href":5731,"rel":63219},[45],[19,63221],{},[55,63223,63225],{"id":63224},"references","References",[2354,63227,63228,63234,63241],{},[2357,63229,63230],{},[41,63231,63233],{"href":62849,"rel":63232},[45],"Intuit: Configure webhooks",[2357,63235,63236],{},[41,63237,63240],{"href":63238,"rel":63239},"https:\u002F\u002Fdeveloper.intuit.com\u002Fapp\u002Fdeveloper\u002Fqbo\u002Fdocs\u002Fdevelop\u002Fwebhooks\u002Fmanage-webhooks-notifications",[45],"Intuit: Manage webhook notifications",[2357,63242,63243],{},[41,63244,63247],{"href":63245,"rel":63246},"https:\u002F\u002Fdeveloper.intuit.com\u002Fapp\u002Fdeveloper\u002Fqbo\u002Fdocs\u002Fdevelop\u002Fwebhooks\u002Fbest-practices",[45],"Intuit: Best practices",[4156,63249,5736],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":63251},[63252,63253,63254,63255,63256,63257,63258,63259,63260],{"id":2541,"depth":2434,"text":2542},{"id":62875,"depth":2434,"text":62876},{"id":62919,"depth":2434,"text":62920},{"id":62941,"depth":2434,"text":62942},{"id":62984,"depth":2434,"text":62985},{"id":63080,"depth":2434,"text":63081},{"id":63124,"depth":2434,"text":63125},{"id":5621,"depth":2434,"text":5622},{"id":63224,"depth":2434,"text":63225},{"img":63262,"date":63263,"updated":63264,"tag":2457,"integrations":63265},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_native_webhooks_for_quickbooks_online_with_unified-icon.png","2026-08-25T18:41:00.000Z","2026-10-13T00:41:32.295Z","quickbooks","\u002Fguides\u002Fhow_to_set_up_native_webhooks_for_quickbooks_online_with_unified",{"title":62816,"description":62831},"guides\u002Fhow_to_set_up_native_webhooks_for_quickbooks_online_with_unified","M9f9N3EHIOgudvqMrLsl6Zj0DAORGbNd_vJmTMBwGzY",{"id":63271,"title":63272,"body":63273,"description":63470,"extension":2452,"meta":63471,"navigation":2459,"path":63475,"seo":63476,"stem":63477,"__hash__":63478},"guides\u002Fguides\u002Fhow_to_set_up_slack_webhooks_using_event_subscriptions.md","How to set up Slack webhooks using event subscriptions",{"type":12,"value":63274,"toc":63464},[63275,63278,63280,63285,63288,63290,63292,63317,63321,63390,63394,63397,63445,63448,63450,63452],[15,63276,63272],{"id":63277},"how-to-set-up-slack-webhooks-using-event-subscriptions",[19,63279],{},[22,63281,63282],{},[25,63283,63284],{},"November 14, 2024",[22,63286,63287],{},"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 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.",[55,63289,4890],{"id":4889},[22,63291,52767],{},[2354,63293,63294,63297,63300,63306,63314],{},[2357,63295,63296],{},"A Slack app created in your workspace",[2357,63298,63299],{},"Access to your Slack app's configuration settings",[2357,63301,16352,63302,63305],{},[41,63303,123],{"href":121,"rel":63304},[45]," workspace ID",[2357,63307,63308,63309],{},"An understanding of ",[41,63310,63313],{"href":63311,"rel":63312},"https:\u002F\u002Fdocs.unified.to\u002Fconcepts\u002Fwebhooks",[45],"how webhooks work in Unified.to",[2357,63315,63316],{},"Create a webhook in your",[55,63318,63320],{"id":63319},"enable-event-subscriptions-in-slack","Enable event subscriptions in Slack",[2510,63322,63323,63329,63332,63341,63351,63376,63385],{},[2357,63324,63325,63326],{},"Go to the Slack API dashboard at ",[41,63327,57565],{"href":57565,"rel":63328},[45],[2357,63330,63331],{},"Select your app from the list of available apps",[2357,63333,63334,63335,22578,63338],{},"In the left sidebar, under ",[31,63336,63337],{},"Features",[31,63339,63340],{},"Event Subscriptions",[2357,63342,63343,63344,63347,63348],{},"Toggle the ",[31,63345,63346],{},"Enable Events"," switch to ",[31,63349,63350],{},"On",[2357,63352,37282,63353,63356,63357,27087,63359,63361,63362],{},[31,63354,63355],{},"Request URL"," field, enter (depending on your data centre; replace ID with your workspace ID, and replace ",[36,63358,47638],{},[36,63360,57801],{}," if using that integration):",[2510,63363,63364,63370],{},[2357,63365,63366,63367],{},"(US data center) ",[36,63368,63369],{},"https:\u002F\u002Fapi.unified.to\u002Fwebhook\u002Fworkspace\u002Fslack?workspace_id={ID}",[2357,63371,63372,63373],{},"(EU data center) ",[36,63374,63375],{},"https:\u002F\u002Fapi-eu.unified.to\u002Fwebhook\u002Fworkspace\u002Fslack?workspace_id={ID}",[2357,63377,63378,63379,63381],{},"Wait for Slack to verify the URL. You should see a green checkmark indicating successful verification.",[5888,63380],{},[4201,63382],{"alt":63383,"src":63384},"Screenshot_2024-11-14_at_5.10.40_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_slack_webhooks_using_event_subscriptions-0.png",[2357,63386,16292,63387,63389],{},[31,63388,49554],{}," at the bottom of the page",[55,63391,63393],{"id":63392},"subscribe-to-events-from-slack","Subscribe to events from Slack",[22,63395,63396],{},"After you've enabled events and verified the request URL works, you need to subscribe to the events that you are interested in.",[2510,63398,63399,63406,63441],{},[2357,63400,63401,63402,63405],{},"The minimum event you should subscribe to is",[36,63403,63404],{},"message.groups"," (under user)",[2357,63407,63408,63409,2646,63412],{},"The other events you can subscribe to are the ones that fall under the following scopes under ",[31,63410,63411],{},"Subscribe to events on behalf of users",[2510,63413,63414,63418,63422,63426],{},[2357,63415,63416],{},[36,63417,57779],{},[2357,63419,63420],{},[36,63421,63404],{},[2357,63423,63424],{},[36,63425,57785],{},[2357,63427,63428,63431,63433,63436,63438],{},[36,63429,63430],{},"message.mpim",[5888,63432],{},[4201,63434],{"alt":5892,"src":63435},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_slack_webhooks_using_event_subscriptions-1.png",[5888,63437],{},[25,63439,63440],{},"Example of Slack events that you can subscribe to for webhook events",[2357,63442,16292,63443,63389],{},[31,63444,49554],{},[22,63446,63447],{},"Once completed, you can create webhooks in Unified.to that will receive these Slack events in real-time.",[22,63449,31288],{},[55,63451,37023],{"id":37022},[2354,63453,63454,63459],{},[2357,63455,63456],{},[41,63457,5733],{"href":5731,"rel":63458},[45],[2357,63460,63461],{},[41,63462,45818],{"href":45816,"rel":63463},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":63465},[63466,63467,63468,63469],{"id":4889,"depth":2434,"text":4890},{"id":63319,"depth":2434,"text":63320},{"id":63392,"depth":2434,"text":63393},{"id":37022,"depth":2434,"text":37023},"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...",{"img":63472,"date":63473,"updated":63474,"tag":2457,"integrations":47638},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_slack_webhooks_using_event_subscriptions-icon.png","2024-11-14T00:00:00.000Z","2026-10-13T00:41:30.209Z","\u002Fguides\u002Fhow_to_set_up_slack_webhooks_using_event_subscriptions",{"title":63272,"description":63470},"guides\u002Fhow_to_set_up_slack_webhooks_using_event_subscriptions","sus2SqFW8qfbgYgMmyI-OpbKECcxQyvPOORqKrK_R8I",{"id":63480,"title":63481,"body":63482,"description":64094,"extension":2452,"meta":64095,"navigation":2459,"path":64100,"seo":64101,"stem":64102,"__hash__":64103},"guides\u002Fguides\u002Fhow_to_set_up_telegram_bot_with_unified.md","How to set up Telegram (bot) with Unified.to",{"type":12,"value":63483,"toc":64092},[63484,63487,63489,63494,63501,63507,63509,63513,63529,63544,63546,63551,63615,63632,63634,63639,63650,63673,63676,63678,63683,63716,63724,63731,63733,63738,63752,63755,63785,63790,63799,63839,63863,63865,63870,63877,63943,63946,63992,63995,63997,64002,64041,64043,64048,64077,64090],[15,63485,63481],{"id":63486},"how-to-set-up-telegram-bot-with-unifiedto",[19,63488],{},[22,63490,63491],{},[25,63492,63493],{},"June 30, 2026",[22,63495,63496,63497,63500],{},"Telegram's ",[31,63498,63499],{},"Bot API"," lets you send and receive messages through a bot account you control. This guide walks you through creating a Telegram bot, connecting it to Unified.to with its bot token, and (optionally) turning on webhooks so you receive incoming messages and button clicks in real time.",[22,63502,63503,63506],{},[31,63504,63505],{},"Estimated time:"," 10 minutes",[19,63508],{},[22,63510,63511],{},[31,63512,2542],{},[2354,63514,63515,63518,63526],{},[2357,63516,63517],{},"A Telegram account (any mobile or desktop client).",[2357,63519,63520,63521,63525],{},"A Unified.to account with a workspace. ",[41,63522,63524],{"href":121,"rel":63523},[45],"Sign up here"," if you don't have one.",[2357,63527,63528],{},"For receiving messages via webhooks: nothing extra — Unified.to hosts the HTTPS endpoint for you.",[4937,63530,63531],{},[22,63532,63533,63536,63537,63539,63540,63543],{},[31,63534,63535],{},"Bot API vs. personal account:"," This integration uses the Telegram ",[31,63538,63499],{},", so all messages are sent and received as your ",[31,63541,63542],{},"bot",", not as your personal Telegram user. People interact with your bot by starting a chat with it or by adding it to a group\u002Fchannel.",[19,63545],{},[22,63547,63548],{},[31,63549,63550],{},"Step 1 — Create a bot and get your bot token",[2510,63552,63553,63564,63572,63581,63593,63609],{},[2357,63554,63555,63556,63563],{},"In any Telegram client, open a chat with ",[41,63557,63560],{"href":63558,"rel":63559},"https:\u002F\u002Ft.me\u002FBotFather",[45],[31,63561,63562],{},"@BotFather"," (the official bot for creating bots).",[2357,63565,63566,63567,97],{},"Send the command ",[31,63568,63569],{},[36,63570,63571],{},"\u002Fnewbot",[2357,63573,63574,63575,63577,63578,20056],{},"When prompted, enter a ",[31,63576,9043],{}," for your bot (the display name, e.g. ",[25,63579,63580],{},"Acme Support",[2357,63582,63583,63584,63586,63587,63589,63590,20056],{},"Then enter a ",[31,63585,54035],{}," for your bot. It must end in ",[36,63588,63542],{}," (e.g. ",[36,63591,63592],{},"acme_support_bot",[2357,63594,63595,63596,63599,63600],{},"BotFather replies with a confirmation that includes your ",[31,63597,63598],{},"HTTP API token",". It looks like this:",[2584,63601,63603],{"className":2649,"code":63602,"language":2651,"meta":2652,"style":2433},"123456789:AAEhBP0...M_zv1u123ew11\n",[36,63604,63605],{"__ignoreMap":2433},[414,63606,63607],{"class":2593,"line":2594},[414,63608,63602],{},[2357,63610,63611,63614],{},[31,63612,63613],{},"Copy this token"," and keep it safe — it grants full control of your bot. You'll paste it into Unified.to in Step 3.",[4937,63616,63617],{},[22,63618,63619,63620,63625,63626,63631],{},"Lost the token later? Send ",[31,63621,63622],{},[36,63623,63624],{},"\u002Ftoken"," to BotFather and pick your bot, or ",[31,63627,63628],{},[36,63629,63630],{},"\u002Frevoke"," to roll it.",[19,63633],{},[22,63635,63636],{},[31,63637,63638],{},"Step 2 — (Optional) Let your bot read group messages",[22,63640,63641,63642,63645,63646,63649],{},"By default a bot in ",[31,63643,63644],{},"privacy mode"," only receives messages that mention it or reply to it. If you want your bot to receive ",[31,63647,63648],{},"all"," messages in a group:",[2510,63651,63652,63665,63668],{},[2357,63653,43590,63654,63659,63660,97],{},[41,63655,63657],{"href":63558,"rel":63656},[45],[31,63658,63562],{}," and send ",[31,63661,63662],{},[36,63663,63664],{},"\u002Fsetprivacy",[2357,63666,63667],{},"Select your bot.",[2357,63669,43569,63670,97],{},[31,63671,63672],{},"Disable",[22,63674,63675],{},"You can skip this step for one-to-one (direct) chats — bots always receive direct messages sent to them.",[19,63677],{},[22,63679,63680],{},[31,63681,63682],{},"Step 3 — Connect Telegram in Unified.to",[2510,63684,63685,63694,63703,63709],{},[2357,63686,63687,63688,63690,63691,97],{},"In the Unified.to dashboard, go to ",[31,63689,4433],{}," and search for ",[31,63692,63693],{},"Telegram (bot)",[2357,63695,6184,63696,63699,63700,63702],{},[31,63697,63698],{},"Connect"," (or ",[31,63701,6955],{},") to start a new connection.",[2357,63704,63705,63706,63708],{},"When prompted for credentials, paste the value from Step 1 into the ",[31,63707,49579],{}," field.",[2357,63710,63711,63712,63715],{},"Submit. Unified.to validates the token by calling the Telegram ",[36,63713,63714],{},"getMe"," endpoint and, on success, creates the connection. The bot's name is shown on the connection.",[22,63717,63718,63719,97],{},"You can also create the connection programmatically by storing the bot token as the connection's token credential — see the ",[41,63720,63723],{"href":63721,"rel":63722},"https:\u002F\u002Fdocs.unified.to\u002Funified\u002Funified\u002Fauthorization",[45],"Authorization API",[22,63725,63726,63727,63730],{},"That's it for sending messages. To ",[31,63728,63729],{},"receive"," messages, continue to the webhook setup below.",[19,63732],{},[22,63734,63735],{},[31,63736,63737],{},"Step 4 — Find a chat ID to send to",[22,63739,63740,63741,63744,63745,63747,63748,63751],{},"The Bot API can't list chats, so you need the ",[31,63742,63743],{},"chat ID"," of whoever you want to message. A chat ID is a number (e.g. ",[36,63746,59609],{}," for a person, or a negative number like ",[36,63749,63750],{},"-1001234567890"," for a group\u002Fchannel).",[22,63753,63754],{},"The easiest way to discover one:",[2510,63756,63757,63775,63778],{},[2357,63758,63759,63760,63763,63764,63767,63768,63771,63772,97],{},"From the recipient's Telegram account, ",[31,63761,63762],{},"start a chat with your bot"," (search its ",[36,63765,63766],{},"@username"," and press ",[31,63769,63770],{},"Start","), or ",[31,63773,63774],{},"add the bot to your group\u002Fchannel",[2357,63776,63777],{},"Have them send any message to the bot \u002F group.",[2357,63779,63780,63781,63784],{},"That inbound message arrives through your Unified.to webhook (Step 5) and includes the ",[36,63782,63783],{},"channel_id"," (the Telegram chat ID). Use that value as the destination for future messages.",[22,63786,63787],{},[31,63788,63789],{},"Sending a message",[22,63791,63792,63793,63795,63796,63798],{},"Once you have a ",[36,63794,63783],{},", send a message through the unified ",[36,63797,20770],{}," endpoint:",[2584,63800,63802],{"className":2649,"code":63801,"language":2651,"meta":2652,"style":2433},"curl -X POST 'https:\u002F\u002Fapi.unified.to\u002Fmessaging\u002F\u003CCONNECTION_ID>\u002Fmessage' \\\n  -H 'Authorization: Bearer \u003CYOUR_UNIFIED_API_KEY>' \\\n  -H 'Content-Type: application\u002Fjson' \\\n  -d '{\n        \"channels\": [{ \"id\": \"123456789\" }],\n        \"message\": \"Hello from Unified.to 👋\"\n      }'\n",[36,63803,63804,63809,63814,63819,63824,63829,63834],{"__ignoreMap":2433},[414,63805,63806],{"class":2593,"line":2594},[414,63807,63808],{},"curl -X POST 'https:\u002F\u002Fapi.unified.to\u002Fmessaging\u002F\u003CCONNECTION_ID>\u002Fmessage' \\\n",[414,63810,63811],{"class":2593,"line":2434},[414,63812,63813],{},"  -H 'Authorization: Bearer \u003CYOUR_UNIFIED_API_KEY>' \\\n",[414,63815,63816],{"class":2593,"line":2613},[414,63817,63818],{},"  -H 'Content-Type: application\u002Fjson' \\\n",[414,63820,63821],{"class":2593,"line":2625},[414,63822,63823],{},"  -d '{\n",[414,63825,63826],{"class":2593,"line":2677},[414,63827,63828],{},"        \"channels\": [{ \"id\": \"123456789\" }],\n",[414,63830,63831],{"class":2593,"line":2751},[414,63832,63833],{},"        \"message\": \"Hello from Unified.to 👋\"\n",[414,63835,63836],{"class":2593,"line":2760},[414,63837,63838],{},"      }'\n",[22,63840,63841,63842,63844,63845,63847,63848,63851,63852,63855,63856,63851,63859,63862],{},"You can also include inline buttons (mapped to Telegram inline keyboards) and reply to a message via ",[36,63843,54970],{},". The response contains the new message ",[36,63846,5072],{},", which is required to ",[31,63849,63850],{},"edit"," (",[36,63853,63854],{},"editMessageText",") or ",[31,63857,63858],{},"delete",[36,63860,63861],{},"deleteMessage",") it later.",[19,63864],{},[22,63866,63867],{},[31,63868,63869],{},"Step 5 — Set up a webhook to receive messages",[22,63871,63872,63873,63876],{},"Unified.to registers the Telegram webhook for you — you don't call ",[36,63874,63875],{},"setWebhook"," yourself. When you create a webhook subscription, Unified.to points your bot at a secure HTTPS endpoint and verifies every delivery with a secret token.",[2510,63878,63879,63893,63934,63937],{},[2357,63880,63881,63882,63884,63885,63887,63888,20056],{},"In the Unified.to dashboard, open your ",[31,63883,63693],{}," connection and go to ",[31,63886,46006],{}," (or use the ",[41,63889,63892],{"href":63890,"rel":63891},"https:\u002F\u002Fdocs.unified.to\u002Funified\u002Funified\u002Fcreateunifiedwebhook",[45],"Webhook API",[2357,63894,63895,63896],{},"Create a webhook and choose what you want to receive:\n",[2354,63897,63898,63915],{},[2357,63899,63900,63904,63905,63909,63910,63914],{},[31,63901,63902],{},[36,63903,20770],{},", event ",[31,63906,63907],{},[36,63908,4949],{}," — each new incoming message (and ",[31,63911,63912],{},[36,63913,4953],{}," for edited messages).",[2357,63916,63917,63904,63921,63925,63926,63928,63929,4696,63931,20056],{},[31,63918,63919],{},[36,63920,20776],{},[31,63922,63923],{},[36,63924,4949],{}," — incoming messages ",[31,63927,10047],{}," inline-button clicks, delivered as unified events (",[36,63930,62656],{},[36,63932,63933],{},"BUTTON_CLICK",[2357,63935,63936],{},"Provide your destination URL — the place Unified.to should forward normalized events to.",[2357,63938,63939,63940,63942],{},"Save. Unified.to calls Telegram's ",[36,63941,63875],{}," behind the scenes and begins forwarding events.",[22,63944,63945],{},"Example webhook creation via the API:",[2584,63947,63949],{"className":2649,"code":63948,"language":2651,"meta":2652,"style":2433},"curl -X POST 'https:\u002F\u002Fapi.unified.to\u002Funified\u002Fwebhook' \\\n  -H 'Authorization: Bearer \u003CYOUR_UNIFIED_API_KEY>' \\\n  -H 'Content-Type: application\u002Fjson' \\\n  -d '{\n        \"connection_id\": \"\u003CCONNECTION_ID>\",\n        \"object_type\": \"messaging_message\",\n        \"event\": \"created\",\n        \"hook_url\": \"https:\u002F\u002Fyour-app.example.com\u002Ftelegram\u002Fincoming\"\n      }'\n",[36,63950,63951,63956,63960,63964,63968,63973,63978,63983,63988],{"__ignoreMap":2433},[414,63952,63953],{"class":2593,"line":2594},[414,63954,63955],{},"curl -X POST 'https:\u002F\u002Fapi.unified.to\u002Funified\u002Fwebhook' \\\n",[414,63957,63958],{"class":2593,"line":2434},[414,63959,63813],{},[414,63961,63962],{"class":2593,"line":2613},[414,63963,63818],{},[414,63965,63966],{"class":2593,"line":2625},[414,63967,63823],{},[414,63969,63970],{"class":2593,"line":2677},[414,63971,63972],{},"        \"connection_id\": \"\u003CCONNECTION_ID>\",\n",[414,63974,63975],{"class":2593,"line":2751},[414,63976,63977],{},"        \"object_type\": \"messaging_message\",\n",[414,63979,63980],{"class":2593,"line":2760},[414,63981,63982],{},"        \"event\": \"created\",\n",[414,63984,63985],{"class":2593,"line":2768},[414,63986,63987],{},"        \"hook_url\": \"https:\u002F\u002Fyour-app.example.com\u002Ftelegram\u002Fincoming\"\n",[414,63989,63990],{"class":2593,"line":2776},[414,63991,63838],{},[22,63993,63994],{},"To stop receiving events, delete the webhook. Unified.to removes the bot's Telegram webhook automatically once the last subscription on the connection is gone.",[19,63996],{},[22,63998,63999],{},[31,64000,64001],{},"Notes & troubleshooting",[2354,64003,64004,64010,64016,64025,64031],{},[2357,64005,64006,64009],{},[31,64007,64008],{},"One webhook per bot."," Telegram allows a single webhook URL per bot, so all of a connection's webhook subscriptions share the same registration — that's expected and handled automatically.",[2357,64011,64012,64015],{},[31,64013,64014],{},"HTTPS is required."," Telegram only delivers updates to HTTPS endpoints. Webhooks therefore work on Unified.to's hosted environment but not against a plain-HTTP localhost listener during local development.",[2357,64017,64018,64021,64022,64024],{},[31,64019,64020],{},"No history."," The Bot API cannot list or fetch past messages or chats — a bot only sees messages sent ",[31,64023,62045],{}," it joined a chat, delivered via webhooks. There is no \"list messages\" or \"list channels\" operation.",[2357,64026,64027,64030],{},[31,64028,64029],{},"Not seeing group messages?"," Make sure you disabled privacy mode (Step 2) and re-added the bot to the group if needed.",[2357,64032,64033,8032,64037,64040],{},[31,64034,64035],{},[36,64036,63714],{},[31,64038,64039],{},"\u002F connection fails?"," Double-check the bot token was pasted exactly, with no extra spaces, and that the bot hasn't been revoked in BotFather.",[19,64042],{},[22,64044,64045],{},[31,64046,64047],{},"What you can do next",[2354,64049,64050,64060,64069],{},[2357,64051,64052,64053,4696,64056,4696,64058,20056],{},"Send, edit, and delete messages (",[36,64054,64055],{},"sendMessage",[36,64057,63854],{},[36,64059,63861],{},[2357,64061,64062,64063,63851,64066,20056],{},"Look up a single chat's details with ",[36,64064,64065],{},"messaging_channel",[36,64067,64068],{},"getChat",[2357,64070,64071,64072,4950,64074,64076],{},"Receive incoming messages and inline-button clicks via ",[36,64073,20770],{},[36,64075,20776],{}," webhooks.",[22,64078,64079,64080,64084,64085,97],{},"Need help? ",[41,64081,64083],{"href":121,"rel":64082},[45],"Contact Unified.to support"," or browse the ",[41,64086,64089],{"href":64087,"rel":64088},"https:\u002F\u002Fdocs.unified.to\u002Fguides",[45],"other guides",[4156,64091,5736],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":64093},[],"Telegram's Bot API lets you send and receive messages through a bot account you control. This guide walks you through creating a Telegram bot, connecting it to...",{"img":64096,"date":64097,"updated":64098,"tag":2457,"integrations":64099},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_telegram_bot_with_unified-icon.png","2026-06-30T23:39:00.000Z","2026-08-23T14:54:22.327Z","telegram","\u002Fguides\u002Fhow_to_set_up_telegram_bot_with_unified",{"title":63481,"description":64094},"guides\u002Fhow_to_set_up_telegram_bot_with_unified","KTE8zopnXnBe-nQCiSUi90v2lVWIssP5tVm0ZfVrJ0I",{"id":64105,"title":37045,"body":64106,"description":64833,"extension":2452,"meta":64834,"navigation":2459,"path":64838,"seo":64839,"stem":64840,"__hash__":64841},"guides\u002Fguides\u002Fhow_to_set_up_your_scopes_in_hubspot.md",{"type":12,"value":64107,"toc":64819},[64108,64111,64113,64118,64121,64123,64126,64147,64151,64164,64169,64173,64471,64475,64483,64487,64492,64496,64501,64505,64513,64558,64563,64567,64575,64580,64585,64590,64597,64604,64615,64619,64622,64655,64662,64694,64700,64704,64707,64715,64720,64724,64730,64740,64743,64748,64750,64757,64760,64796,64798,64816],[15,64109,37045],{"id":64110},"how-to-set-up-your-scopes-in-hubspot",[19,64112],{},[22,64114,64115],{},[25,64116,64117],{},"June 11, 2024",[22,64119,64120],{},"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.",[55,64122,4890],{"id":4889},[22,64124,64125],{},"This guide assumes you have a basic understanding of:",[2354,64127,64128,64133,64140],{},[2357,64129,64130],{},[41,64131,36554],{"href":16407,"rel":64132},[45],[2357,64134,64135],{},[41,64136,64139],{"href":64137,"rel":64138},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_create_connection_with_hubspot",[45],"How to create a connection (Project) ",[2357,64141,64142],{},[41,64143,64146],{"href":64144,"rel":64145},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_get_your_hubspot_developer_key_and_oauth_2_credentials_legacy_apps",[45],"How to get your HubSpot developer key and OAuth 2 credentials (Legacy App)",[55,64148,64150],{"id":64149},"set-up-required-scopes-in-hubspot-project","Set up required scopes in HubSpot (Project)",[2510,64152,64153,64159,64162],{},[2357,64154,21005,64155,64158],{},[41,64156,46581],{"href":46581,"rel":64157},[45],", Sign in.",[2357,64160,64161],{},"Development →  Project → select your project",[2357,64163,46736],{},[22,64165,64166],{},[4201,64167],{"alt":5892,"src":64168},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_your_scopes_in_hubspot-0.png",[2510,64170,64171],{},[2357,64172,46746],{},[2584,64174,64175],{"className":16485,"code":46749,"language":16487,"meta":2433,"style":2433},[36,64176,64177,64181,64191,64201,64207,64217,64227,64237,64243,64253,64259,64265,64269,64275,64281,64287,64293,64299,64305,64311,64317,64323,64329,64335,64341,64347,64353,64359,64363,64367,64373,64379,64383,64389,64399,64405,64411,64415,64421,64431,64441,64451,64459,64463,64467],{"__ignoreMap":2433},[414,64178,64179],{"class":2593,"line":2594},[414,64180,8916],{"class":2705},[414,64182,64183,64185,64187,64189],{"class":2593,"line":2434},[414,64184,36807],{"class":2601},[414,64186,7340],{"class":2705},[414,64188,46764],{"class":2601},[414,64190,2757],{"class":2705},[414,64192,64193,64195,64197,64199],{"class":2593,"line":2613},[414,64194,15528],{"class":2601},[414,64196,7340],{"class":2705},[414,64198,46775],{"class":2601},[414,64200,2757],{"class":2705},[414,64202,64203,64205],{"class":2593,"line":2625},[414,64204,36829],{"class":2601},[414,64206,10477],{"class":2705},[414,64208,64209,64211,64213,64215],{"class":2593,"line":2677},[414,64210,46788],{"class":2601},[414,64212,7340],{"class":2705},[414,64214,46793],{"class":2601},[414,64216,2757],{"class":2705},[414,64218,64219,64221,64223,64225],{"class":2593,"line":2751},[414,64220,38476],{"class":2601},[414,64222,7340],{"class":2705},[414,64224,46804],{"class":2601},[414,64226,2757],{"class":2705},[414,64228,64229,64231,64233,64235],{"class":2593,"line":2760},[414,64230,46811],{"class":2601},[414,64232,7340],{"class":2705},[414,64234,46816],{"class":2601},[414,64236,2757],{"class":2705},[414,64238,64239,64241],{"class":2593,"line":2768},[414,64240,46823],{"class":2601},[414,64242,10477],{"class":2705},[414,64244,64245,64247,64249,64251],{"class":2593,"line":2776},[414,64246,46830],{"class":2601},[414,64248,7340],{"class":2705},[414,64250,46835],{"class":2601},[414,64252,2757],{"class":2705},[414,64254,64255,64257],{"class":2593,"line":2784},[414,64256,46842],{"class":2601},[414,64258,8960],{"class":2705},[414,64260,64261,64263],{"class":2593,"line":2792},[414,64262,46849],{"class":2601},[414,64264,2757],{"class":2705},[414,64266,64267],{"class":2593,"line":2804},[414,64268,11039],{"class":2705},[414,64270,64271,64273],{"class":2593,"line":2809},[414,64272,46860],{"class":2601},[414,64274,8960],{"class":2705},[414,64276,64277,64279],{"class":2593,"line":2829},[414,64278,46867],{"class":2601},[414,64280,2757],{"class":2705},[414,64282,64283,64285],{"class":2593,"line":2843},[414,64284,46874],{"class":2601},[414,64286,2757],{"class":2705},[414,64288,64289,64291],{"class":2593,"line":2849},[414,64290,46881],{"class":2601},[414,64292,2757],{"class":2705},[414,64294,64295,64297],{"class":2593,"line":2854},[414,64296,46888],{"class":2601},[414,64298,2757],{"class":2705},[414,64300,64301,64303],{"class":2593,"line":2880},[414,64302,46895],{"class":2601},[414,64304,2757],{"class":2705},[414,64306,64307,64309],{"class":2593,"line":3253},[414,64308,46902],{"class":2601},[414,64310,2757],{"class":2705},[414,64312,64313,64315],{"class":2593,"line":3261},[414,64314,46909],{"class":2601},[414,64316,2757],{"class":2705},[414,64318,64319,64321],{"class":2593,"line":3279},[414,64320,46902],{"class":2601},[414,64322,2757],{"class":2705},[414,64324,64325,64327],{"class":2593,"line":3313},[414,64326,46922],{"class":2601},[414,64328,2757],{"class":2705},[414,64330,64331,64333],{"class":2593,"line":3326},[414,64332,46929],{"class":2601},[414,64334,2757],{"class":2705},[414,64336,64337,64339],{"class":2593,"line":3339},[414,64338,46936],{"class":2601},[414,64340,2757],{"class":2705},[414,64342,64343,64345],{"class":2593,"line":3359},[414,64344,46943],{"class":2601},[414,64346,2757],{"class":2705},[414,64348,64349,64351],{"class":2593,"line":6453},[414,64350,46950],{"class":2601},[414,64352,2757],{"class":2705},[414,64354,64355,64357],{"class":2593,"line":6459},[414,64356,46957],{"class":2601},[414,64358,2757],{"class":2705},[414,64360,64361],{"class":2593,"line":6465},[414,64362,46964],{"class":2601},[414,64364,64365],{"class":2593,"line":6471},[414,64366,11039],{"class":2705},[414,64368,64369,64371],{"class":2593,"line":6477},[414,64370,46973],{"class":2601},[414,64372,46976],{"class":2705},[414,64374,64375,64377],{"class":2593,"line":6483},[414,64376,46981],{"class":2601},[414,64378,46984],{"class":2705},[414,64380,64381],{"class":2593,"line":6489},[414,64382,3548],{"class":2705},[414,64384,64385,64387],{"class":2593,"line":6495},[414,64386,46993],{"class":2601},[414,64388,10477],{"class":2705},[414,64390,64391,64393,64395,64397],{"class":2593,"line":6501},[414,64392,47000],{"class":2601},[414,64394,10492],{"class":2705},[414,64396,47005],{"class":2601},[414,64398,10497],{"class":2705},[414,64400,64401,64403],{"class":2593,"line":6507},[414,64402,47012],{"class":2601},[414,64404,46976],{"class":2705},[414,64406,64407,64409],{"class":2593,"line":6513},[414,64408,47019],{"class":2601},[414,64410,46984],{"class":2705},[414,64412,64413],{"class":2593,"line":6519},[414,64414,3548],{"class":2705},[414,64416,64417,64419],{"class":2593,"line":6525},[414,64418,47030],{"class":2601},[414,64420,10477],{"class":2705},[414,64422,64423,64425,64427,64429],{"class":2593,"line":6531},[414,64424,47037],{"class":2601},[414,64426,7340],{"class":2705},[414,64428,47042],{"class":2601},[414,64430,2757],{"class":2705},[414,64432,64433,64435,64437,64439],{"class":2593,"line":6537},[414,64434,47049],{"class":2601},[414,64436,7340],{"class":2705},[414,64438,47054],{"class":2601},[414,64440,2757],{"class":2705},[414,64442,64443,64445,64447,64449],{"class":2593,"line":6543},[414,64444,47061],{"class":2601},[414,64446,7340],{"class":2705},[414,64448,47066],{"class":2601},[414,64450,2757],{"class":2705},[414,64452,64453,64455,64457],{"class":2593,"line":6549},[414,64454,47073],{"class":2601},[414,64456,7340],{"class":2705},[414,64458,47078],{"class":2601},[414,64460,64461],{"class":2593,"line":6555},[414,64462,10535],{"class":2705},[414,64464,64465],{"class":2593,"line":6561},[414,64466,4032],{"class":2705},[414,64468,64469],{"class":2593,"line":6567},[414,64470,3035],{"class":2705},[2510,64472,64473],{},[2357,64474,47095],{},[2584,64476,64477],{"className":16485,"code":36999,"language":16487,"meta":2433,"style":2433},[36,64478,64479],{"__ignoreMap":2433},[414,64480,64481],{"class":2593,"line":2594},[414,64482,36999],{"class":2705},[2510,64484,64485],{},[2357,64486,47108],{},[22,64488,64489],{},[4201,64490],{"alt":5892,"src":64491},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_your_scopes_in_hubspot-1.png",[2510,64493,64494],{},[2357,64495,47118],{},[22,64497,64498],{},[4201,64499],{"alt":5892,"src":64500},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_your_scopes_in_hubspot-2.png",[55,64502,64504],{"id":64503},"set-up-required-scopes-in-hubspot-legacy-app","Set up required scopes in HubSpot (Legacy App)",[22,64506,64507,64509,64510],{},[31,64508,4943],{},": If you are using webhooks, please refer to: ",[41,64511,36393],{"href":46475,"rel":64512},[45],[2510,64514,64515,64520,64523,64526],{},[2357,64516,21005,64517,64158],{},[41,64518,46581],{"href":46581,"rel":64519},[45],[2357,64521,64522],{},"Development → Legacy App→ Your New App",[2357,64524,64525],{},"In the same Auth tab, scroll",[2357,64527,64528,64529,64532,64533,7340,64535,741,64537,64539],{},"If you are not using webhooks, then ",[41,64530,123],{"href":121,"rel":64531},[45]," only requires two scopes to be set as ",[31,64534,9018],{},[36,64536,36562],{},[36,64538,36617],{},[2510,64540,64541,64546,64550,64556],{},[2357,64542,16292,64543],{},[31,64544,64545],{},"+ Add new scope",[2357,64547,21834,64548],{},[36,64549,36562],{},[2357,64551,64552,64553,64555],{},"Set it as a ",[31,64554,9018],{}," scope",[2357,64557,57711],{},[22,64559,64560],{},[4201,64561],{"alt":5892,"src":64562},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_your_scopes_in_hubspot-3.png",[55,64564,64566],{"id":64565},"setup-optional-scopes","Setup optional scopes",[2510,64568,64569],{},[2357,64570,64571,64572],{},"You can see the list of scopes required for the objects you need at ",[41,64573,36611],{"href":36611,"rel":64574},[45],[22,64576,64577],{},[4201,64578],{"alt":5892,"src":64579},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_your_scopes_in_hubspot-4.png",[2510,64581,64582],{},[2357,64583,64584],{},"Make sure to select optional",[22,64586,64587],{},[4201,64588],{"alt":5892,"src":64589},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_your_scopes_in_hubspot-5.png",[2510,64591,64592,64595],{},[2357,64593,64594],{},"Add all the scopes you need",[2357,64596,57711],{},[3629,64598,64600,64601],{"id":64599},"configure-your-scopes-on-unifiedto","Configure your scopes on ",[41,64602,123],{"href":121,"rel":64603},[45],[22,64605,64606,64607,64610,64611,97],{},"Be sure to also configure these scopes in your ",[41,64608,123],{"href":121,"rel":64609},[45]," settings. For instructions on how to do that, refer to our ",[41,64612,64614],{"href":16407,"rel":64613},[45],"Scopes guide",[55,64616,64618],{"id":64617},"understanding-hubspots-scope-constraints","Understanding HubSpot's scope constraints",[22,64620,64621],{},"HubSpot has some specific rules about how scopes work:",[2354,64623,64624,64644,64649,64652],{},[2357,64625,64626,64627,64629,64630],{},"If you specify a scope as ",[31,64628,9018],{},", it must be included in every authorization request.\n",[2354,64631,64632],{},[2357,64633,64634,64636,64637,64640,64641,64643],{},[31,64635,4943],{},": If you intend to ",[25,64638,64639],{},"read"," data via a webhook, then the read scope for that object must be marked as ",[31,64642,9018],{}," in HubSpot.",[2357,64645,64646,64648],{},[31,64647,36592],{}," scopes may or may not be included in the authorization.",[2357,64650,64651],{},"If you don't specify a scope at all, it cannot be included in the authorization request.",[2357,64653,64654],{},"The OAuth scope cannot be removed and must always be required.",[22,64656,64657,64658,64661],{},"Behind the scenes, ",[41,64659,123],{"href":121,"rel":64660},[45]," will request scopes according to what you have configured on the platform:",[2354,64663,64664,64672,64686],{},[2357,64665,64666,64667,64669,64670,64555],{},"We'll always request ",[36,64668,36562],{}," as a ",[31,64671,9018],{},[2357,64673,64674,64675,64677,64678,64681,64682,64685],{},"When you enable ",[36,64676,29627],{}," scopes on ",[41,64679,123],{"href":121,"rel":64680},[45],", we convert every Hubspot scope ending with ",[36,64683,64684],{},".read"," to required, assuming they'll all be used for webhooks.",[2357,64687,64688,64689,64691,64692,97],{},"Otherwise, if you have not enabled the ",[36,64690,29627],{}," scope, then all other scopes will be requested as ",[31,64693,36592],{},[22,64695,64696,64697],{},"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: ",[41,64698,36393],{"href":46475,"rel":64699},[45],[55,64701,64703],{"id":64702},"what-your-users-will-see","What your users will see",[22,64705,64706],{},"When your users sign in with HubSpot, they'll see a screen requesting access to the scopes you've specified:",[2354,64708,64709,64712],{},[2357,64710,64711],{},"Required scopes will always be shown and cannot be deselected.",[2357,64713,64714],{},"Optional scopes will be shown and can be deselected by the user.",[22,64716,64717],{},[4201,64718],{"alt":5892,"src":64719},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_your_scopes_in_hubspot-6.png",[55,64721,64723],{"id":64722},"specifying-required-vs-optional-scopes","Specifying Required vs Optional Scopes",[22,64725,64726,64727,64729],{},"Unified tries to automatically classify scopes as required or optional.  If you need additional control, you can always specify this information in the ",[36,64728,16739],{}," URL parameter.",[22,64731,64732,64733,4149,64736,64739],{},"Just prefix the Hubspot-specific scope with ",[36,64734,64735],{},"required:",[36,64737,64738],{},"optional:"," and we will handle them correctly.",[22,64741,64742],{},"eg.",[22,64744,64745],{},[36,64746,64747],{},"required:crm.objects.contacts.read",[55,64749,5622],{"id":5621},[22,64751,64752,64753,64756],{},"If your HubSpot scopes don't match the requested scopes via ",[41,64754,123],{"href":121,"rel":64755},[45],", your users may see an error message about there being a scopes mismatch.",[22,64758,64759],{},"Double-check that:",[2510,64761,64762,64769,64776,64782],{},[2357,64763,64764,64765,64768],{},"All scopes in your HubSpot app are included in every ",[41,64766,123],{"href":121,"rel":64767},[45]," request.",[2357,64770,64771,64772,64775],{},"All scopes requested by ",[41,64773,123],{"href":121,"rel":64774},[45]," are specified (either as required or optional) in your HubSpot app.",[2357,64777,64778,64779,64781],{},"If you're using webhooks, ensure all read scopes are set as ",[31,64780,9018],{}," in your HubSpot app.",[2357,64783,64784,64785,741,64787,64793,64794,97],{},"If you're not using webhooks, ensure all scopes aside from ",[36,64786,36617],{},[41,64788,64791],{"href":64789,"rel":64790},"https:\u002F\u002Fcrm.objects.owners.read\u002F",[45],[36,64792,36562],{}," are set as ",[31,64795,36592],{},[55,64797,37023],{"id":37022},[2354,64799,64800,64806,64811],{},[2357,64801,64802],{},[41,64803,64805],{"href":16407,"rel":64804},[45],"Understanding scopes",[2357,64807,64808],{},[41,64809,36393],{"href":46475,"rel":64810},[45],[2357,64812,64813],{},[41,64814,16751],{"href":56549,"rel":64815},[45],[4156,64817,64818],{},"html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":2433,"searchDepth":2434,"depth":2434,"links":64820},[64821,64822,64823,64824,64828,64829,64830,64831,64832],{"id":4889,"depth":2434,"text":4890},{"id":64149,"depth":2434,"text":64150},{"id":64503,"depth":2434,"text":64504},{"id":64565,"depth":2434,"text":64566,"children":64825},[64826],{"id":64599,"depth":2613,"text":64827},"Configure your scopes on Unified.to",{"id":64617,"depth":2434,"text":64618},{"id":64702,"depth":2434,"text":64703},{"id":64722,"depth":2434,"text":64723},{"id":5621,"depth":2434,"text":5622},{"id":37022,"depth":2434,"text":37023},"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...",{"img":64835,"date":64836,"updated":64837,"tag":2457,"integrations":37069},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_set_up_your_scopes_in_hubspot-icon.png","2024-06-11T00:00:00.000Z","2026-08-23T14:53:59.401Z","\u002Fguides\u002Fhow_to_set_up_your_scopes_in_hubspot",{"title":37045,"description":64833},"guides\u002Fhow_to_set_up_your_scopes_in_hubspot","zicvhWdoRESHGGUpmD9ewSp1XvgoQnAO8Kx22X4zIQk",{"id":64843,"title":64844,"body":64845,"description":64859,"extension":2452,"meta":64968,"navigation":2459,"path":64973,"seo":64974,"stem":64975,"__hash__":64976},"guides\u002Fguides\u002Fhow_to_setup_a_freshbooks_developer_app.md","How to setup a Freshbooks developer app",{"type":12,"value":64846,"toc":64964},[64847,64850,64852,64857,64860,64864,64877,64882,64907,64912,64922,64927,64932,64937,64941,64959],[15,64848,64844],{"id":64849},"how-to-setup-a-freshbooks-developer-app",[19,64851],{},[22,64853,64854],{},[25,64855,64856],{},"October 3, 2025",[22,64858,64859],{},"This guide will show you how to retrieve your OAuth 2 credentials on Freshbooks",[55,64861,64863],{"id":64862},"create-your-freshbooks-app-and-get-your-client-id-and-secret","Create your Freshbooks App and get your Client ID and Secret",[2510,64865,64866,64873],{},[2357,64867,64868,64869],{},"Go to the Freshbooks Developer Portal:\n",[41,64870,64871],{"href":64871,"rel":64872},"https:\u002F\u002Fmy.freshbooks.com\u002F#\u002Fdeveloper",[45],[2357,64874,28009,64875],{},[36,64876,45531],{},[22,64878,64879],{},[4201,64880],{"alt":5892,"src":64881},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_setup_a_freshbooks_developer_app-0.png",[2510,64883,64884,64887,64899],{},[2357,64885,64886],{},"Fill in the Application Name, Application Type, these are mandatory",[2357,64888,64889,64890],{},"Add the scopes needed\n",[2510,64891,64892],{},[2357,64893,64894,64895],{},"You can see the scopes we use on ",[41,64896,64897],{"href":64897,"rel":64898},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Ffreshbooks?tab=oauth2",[45],[2357,64900,36559,64901,64906],{},[41,64902,64904],{"href":21741,"rel":64903},[45],[36,64905,21741],{}," in the Redirect URIs",[22,64908,64909],{},[4201,64910],{"alt":5892,"src":64911},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_setup_a_freshbooks_developer_app-1.png",[2510,64913,64914,64917,64919],{},[2357,64915,64916],{},"You can also fill in the non mandatory fields, logo, etc.",[2357,64918,50106],{},[2357,64920,64921],{},"Click on the App again",[22,64923,64924],{},[4201,64925],{"alt":5892,"src":64926},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_setup_a_freshbooks_developer_app-2.png",[2510,64928,64929],{},[2357,64930,64931],{},"Your Client ID and Secret are at the bottom",[22,64933,64934],{},[4201,64935],{"alt":5892,"src":64936},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_setup_a_freshbooks_developer_app-3.png",[55,64938,64940],{"id":64939},"activate-the-freshbooks-integration-in-unified","Activate the Freshbooks Integration in Unified",[2510,64942,64943,64949,64954,64957],{},[2357,64944,21005,64945],{},[41,64946,64947],{"href":64947,"rel":64948},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Ffreshbooks?tab=auth",[45],[2357,64950,64951,64952],{},"Click in ",[36,64953,49717],{},[2357,64955,64956],{},"Add your Client ID and Secret",[2357,64958,45366],{},[22,64960,64961],{},[4201,64962],{"alt":5892,"src":64963},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_setup_a_freshbooks_developer_app-4.png",{"title":2433,"searchDepth":2434,"depth":2434,"links":64965},[64966,64967],{"id":64862,"depth":2434,"text":64863},{"id":64939,"depth":2434,"text":64940},{"img":64969,"date":64970,"updated":64971,"tag":2457,"integrations":64972},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_setup_a_freshbooks_developer_app-icon.png","2025-10-03T00:00:00.000Z","2026-08-23T14:53:34.138Z","freshbooks","\u002Fguides\u002Fhow_to_setup_a_freshbooks_developer_app",{"title":64844,"description":64859},"guides\u002Fhow_to_setup_a_freshbooks_developer_app","OKDXf2K3rR9AnzT-Vx9bXte7brQpFsK4nDA0_HnQraQ",{"id":64978,"title":64979,"body":64980,"description":65054,"extension":2452,"meta":65055,"navigation":2459,"path":65059,"seo":65060,"stem":65061,"__hash__":65062},"guides\u002Fguides\u002Fhow_to_setup_a_tiktok_shop_application.md","How to setup a TikTok Shop application",{"type":12,"value":64981,"toc":65052},[64982,64985,64987,64992,64999,65002,65023,65026,65049],[15,64983,64979],{"id":64984},"how-to-setup-a-tiktok-shop-application",[19,64986],{},[22,64988,64989],{},[25,64990,64991],{},"August 11, 2026",[22,64993,64994,64995,64998],{},"TikTok Shop uses different terminology than the standard OAuth2. There's no menu item labeled 'OAuth' — the OAuth 2.0 client ",[25,64996,64997],{},"is"," the 'app,' and the credentials are labeled App Key \u002F App Secret rather than Client ID \u002F Client Secret.",[22,65000,65001],{},"Here's the mapping and the exact path:",[2354,65003,65004,65010,65016],{},[2357,65005,65006,65009],{},[31,65007,65008],{},"App Key"," = your OAuth2 Client ID",[2357,65011,65012,65015],{},[31,65013,65014],{},"App Secret"," = your OAuth2 Client Secret",[2357,65017,65018,65019,65022],{},"(You'll also see a ",[31,65020,65021],{},"Service ID"," on the same page — TikTok-specific, not part of standard OAuth)",[22,65024,65025],{},"Steps in Partner Center:",[2510,65027,65028,65031,65034,65037,65043,65046],{},[2357,65029,65030],{},"Log in and make sure you're registered as an app developer (not just a seller account). If you skipped developer onboarding, the App & Service section won't behave as expected.",[2357,65032,65033],{},"In the left navigation, select App & Service, then click Create app & service in the top-right corner.",[2357,65035,65036],{},"Choose the app type. A Public app is for applications you plan to publish on the TikTok Shop App Store; a Custom app is for your own store or direct distribution to specific sellers. Both use the same OAuth 2.0 authentication and have the same level of API access. For a unified-API connector like yours, Public is the usual choice (you can convert a Custom app later if needed).",[2357,65038,65039,65040,65042],{},"Fill in name, category, target market, and set your ",[31,65041,36424],{}," to your callback endpoint. Enable API access.",[2357,65044,65045],{},"After creating, you land on the app detail page. Copy the App key (client ID), the App secret (client secret), and the ID \u002F service ID shown below the app name.",[2357,65047,65048],{},"Separately, apply for the API permissions\u002Fscopes you need under Manage API — these are granted per-app and gate what data you can pull.",[22,65050,65051],{},"One important gotcha for you: region is split. The main Partner Center is partner.tiktokshop.com, but the US region has a separate center at partner.us.tiktokshop.com. Credentials aren't shared across them, so if your sellers span US and non-US, you may need an app in each.",{"title":2433,"searchDepth":2434,"depth":2434,"links":65053},[],"TikTok Shop uses different terminology than the standard OAuth2. There's no menu item labeled 'OAuth' — the OAuth 2.0 client is the 'app,' and the credentials...",{"img":7949,"date":65056,"updated":65057,"tag":2457,"integrations":65058},"2026-08-11T13:32:00.000Z","2026-08-23T14:54:26.927Z","tiktokshop","\u002Fguides\u002Fhow_to_setup_a_tiktok_shop_application",{"title":64979,"description":65054},"guides\u002Fhow_to_setup_a_tiktok_shop_application","SM4uzre6Jc-0f8NnFYEa-hCfD0PmnOhUM4EqBXMxjmY",{"id":65064,"title":65065,"body":65066,"description":65748,"extension":2452,"meta":65749,"navigation":2459,"path":65752,"seo":65753,"stem":65754,"__hash__":65755},"guides\u002Fguides\u002Fhow_to_setup_aws_assume_role_for_aws_secret_manager.md","How to Setup AWS Assume Role for AWS Secret Manager",{"type":12,"value":65067,"toc":65730},[65068,65071,65073,65078,65081,65083,65086,65090,65125,65143,65145,65153,65157,65160,65312,65316,65493,65497,65582,65586,65589,65600,65602,65606,65614,65618,65642,65646,65649,65653,65664,65668,65671,65685,65689,65728],[15,65069,65065],{"id":65070},"how-to-setup-aws-assume-role-for-aws-secret-manager",[19,65072],{},[22,65074,65075],{},[25,65076,65077],{},"March 12, 2026",[22,65079,65080],{},"This guide walks you through configuring AWS IAM Assume Role so that Unified can securely access AWS Secrets Manager in your account — without sharing long-lived AWS access keys.",[55,65082,4426],{"id":4425},[22,65084,65085],{},"Instead of providing static AWS credentials (access key + secret), you can create an IAM role in your AWS account and grant Unified permission to assume it. Unified uses AWS STS (Security Token Service) to obtain short-lived, temporary credentials scoped to your Secrets Manager.",[3629,65087,65089],{"id":65088},"how-it-works","How it works",[2584,65091,65093],{"className":2649,"code":65092,"language":2651,"meta":2652,"style":2433},"┌───────────────┐         STS AssumeRole          ┌────────────────────┐\n│  Unified API  │ ──────────────────────────────► │  Your AWS Account  │\n│  (account     │   (with External ID check)      │                    │\n│   944579081756│ ◄────────────────────────────── │  IAM Role          │\n└───────────────┘    temporary credentials        │  Secrets Manager   │\n                                                  └────────────────────┘\n",[36,65094,65095,65100,65105,65110,65115,65120],{"__ignoreMap":2433},[414,65096,65097],{"class":2593,"line":2594},[414,65098,65099],{},"┌───────────────┐         STS AssumeRole          ┌────────────────────┐\n",[414,65101,65102],{"class":2593,"line":2434},[414,65103,65104],{},"│  Unified API  │ ──────────────────────────────► │  Your AWS Account  │\n",[414,65106,65107],{"class":2593,"line":2613},[414,65108,65109],{},"│  (account     │   (with External ID check)      │                    │\n",[414,65111,65112],{"class":2593,"line":2625},[414,65113,65114],{},"│   944579081756│ ◄────────────────────────────── │  IAM Role          │\n",[414,65116,65117],{"class":2593,"line":2677},[414,65118,65119],{},"└───────────────┘    temporary credentials        │  Secrets Manager   │\n",[414,65121,65122],{"class":2593,"line":2751},[414,65123,65124],{},"                                                  └────────────────────┘\n",[2510,65126,65127,65130,65133,65136],{},[2357,65128,65129],{},"You create an IAM role in your AWS account with a trust policy that allows Unified's AWS account to assume it.",[2357,65131,65132],{},"You attach a permissions policy to that role granting access to Secrets Manager.",[2357,65134,65135],{},"You provide the role's ARN and an External ID in the Unified dashboard.",[2357,65137,65138,65139,65142],{},"Unified calls ",[36,65140,65141],{},"sts:AssumeRole"," with the External ID, receives temporary credentials, and uses them to read\u002Fwrite secrets.",[55,65144,2542],{"id":2541},[2354,65146,65147,65150],{},[2357,65148,65149],{},"An AWS account with permissions to create IAM roles and policies",[2357,65151,65152],{},"Access to the Unified dashboard with workspace admin permissions",[55,65154,65156],{"id":65155},"step-1-create-an-iam-policy-for-secrets-manager","Step 1: Create an IAM Policy for Secrets Manager",[22,65158,65159],{},"In the AWS Console, create a policy that grants the permissions Unified needs on Secrets Manager.",[2510,65161,65162,65172,65305],{},[2357,65163,21005,65164,45999,65167,45999,65169],{},[31,65165,65166],{},"IAM",[31,65168,57390],{},[31,65170,65171],{},"Create policy",[2357,65173,45688,65174,65176,65177,65280,65282,65283,65286,65287,1374,65290,65293,65294,65296,65298,65299,65301,65302],{},[31,65175,24222],{}," tab and paste the following:",[2584,65178,65180],{"className":7323,"code":65179,"language":7325,"meta":2433,"style":2433},"{\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [\n        {\n            \"Effect\": \"Allow\",\n            \"Action\": [\n                \"secretsmanager:CreateSecret\",\n                \"secretsmanager:GetSecretValue\",\n                \"secretsmanager:UpdateSecret\",\n                \"secretsmanager:DeleteSecret\"\n            ],\n            \"Resource\": \"arn:aws:secretsmanager:YOUR_REGION:YOUR_ACCOUNT_ID:secret:*\"\n        }\n    ]\n}\n",[36,65181,65182,65186,65198,65205,65209,65221,65228,65235,65242,65249,65254,65258,65268,65272,65276],{"__ignoreMap":2433},[414,65183,65184],{"class":2593,"line":2594},[414,65185,8916],{"class":2705},[414,65187,65188,65191,65193,65196],{"class":2593,"line":2434},[414,65189,65190],{"class":2607},"    \"Version\"",[414,65192,7340],{"class":2705},[414,65194,65195],{"class":2601},"\"2012-10-17\"",[414,65197,2757],{"class":2705},[414,65199,65200,65203],{"class":2593,"line":2613},[414,65201,65202],{"class":2607},"    \"Statement\"",[414,65204,8960],{"class":2705},[414,65206,65207],{"class":2593,"line":2625},[414,65208,10590],{"class":2705},[414,65210,65211,65214,65216,65219],{"class":2593,"line":2677},[414,65212,65213],{"class":2607},"            \"Effect\"",[414,65215,7340],{"class":2705},[414,65217,65218],{"class":2601},"\"Allow\"",[414,65220,2757],{"class":2705},[414,65222,65223,65226],{"class":2593,"line":2751},[414,65224,65225],{"class":2607},"            \"Action\"",[414,65227,8960],{"class":2705},[414,65229,65230,65233],{"class":2593,"line":2760},[414,65231,65232],{"class":2601},"                \"secretsmanager:CreateSecret\"",[414,65234,2757],{"class":2705},[414,65236,65237,65240],{"class":2593,"line":2768},[414,65238,65239],{"class":2601},"                \"secretsmanager:GetSecretValue\"",[414,65241,2757],{"class":2705},[414,65243,65244,65247],{"class":2593,"line":2776},[414,65245,65246],{"class":2601},"                \"secretsmanager:UpdateSecret\"",[414,65248,2757],{"class":2705},[414,65250,65251],{"class":2593,"line":2784},[414,65252,65253],{"class":2601},"                \"secretsmanager:DeleteSecret\"\n",[414,65255,65256],{"class":2593,"line":2792},[414,65257,11624],{"class":2705},[414,65259,65260,65263,65265],{"class":2593,"line":2804},[414,65261,65262],{"class":2607},"            \"Resource\"",[414,65264,7340],{"class":2705},[414,65266,65267],{"class":2601},"\"arn:aws:secretsmanager:YOUR_REGION:YOUR_ACCOUNT_ID:secret:*\"\n",[414,65269,65270],{"class":2593,"line":2809},[414,65271,10641],{"class":2705},[414,65273,65274],{"class":2593,"line":2829},[414,65275,56114],{"class":2705},[414,65277,65278],{"class":2593,"line":2843},[414,65279,3035],{"class":2705},[5888,65281],{},"Replace ",[36,65284,65285],{},"YOUR_REGION"," (e.g. ",[36,65288,65289],{},"us-east-1",[36,65291,65292],{},"YOUR_ACCOUNT_ID"," with your values.",[5888,65295],{},[31,65297,44037],{}," To restrict access further, you can narrow the ",[36,65300,44774],{}," to a specific prefix, for example:\n",[36,65303,65304],{},"arn:aws:secretsmanager:us-east-1:123456789012:secret:unified\u002F*",[2357,65306,65307,65308,65311],{},"Name the policy (e.g. ",[36,65309,65310],{},"UnifiedSecretsManagerAccess",") and create it.",[55,65313,65315],{"id":65314},"step-2-create-an-iam-role-with-a-trust-policy","Step 2: Create an IAM Role with a Trust Policy",[2510,65317,65318,65328,65469,65477,65483],{},[2357,65319,21005,65320,45999,65322,45999,65325],{},[31,65321,65166],{},[31,65323,65324],{},"Roles",[31,65326,65327],{},"Create role",[2357,65329,21834,65330,65333,65334,65451,65282,65453,65456,65457,65459,65462,65463,65468],{},[31,65331,65332],{},"Custom trust policy"," and paste the following:",[2584,65335,65337],{"className":7323,"code":65336,"language":7325,"meta":2433,"style":2433},"{\n    \"Version\": \"2012-10-17\",\n    \"Statement\": [\n        {\n            \"Effect\": \"Allow\",\n            \"Principal\": {\n                \"AWS\": \"arn:aws:iam::944579081756:user\u002Funified_assume_role_user\"\n            },\n            \"Action\": \"sts:AssumeRole\",\n            \"Condition\": {\n                \"StringEquals\": {\n                    \"sts:ExternalId\": \"YOUR_EXTERNAL_ID\"\n                }\n            }\n        }\n    ]\n}\n",[36,65338,65339,65343,65353,65359,65363,65373,65380,65390,65394,65405,65412,65419,65429,65434,65439,65443,65447],{"__ignoreMap":2433},[414,65340,65341],{"class":2593,"line":2594},[414,65342,8916],{"class":2705},[414,65344,65345,65347,65349,65351],{"class":2593,"line":2434},[414,65346,65190],{"class":2607},[414,65348,7340],{"class":2705},[414,65350,65195],{"class":2601},[414,65352,2757],{"class":2705},[414,65354,65355,65357],{"class":2593,"line":2613},[414,65356,65202],{"class":2607},[414,65358,8960],{"class":2705},[414,65360,65361],{"class":2593,"line":2625},[414,65362,10590],{"class":2705},[414,65364,65365,65367,65369,65371],{"class":2593,"line":2677},[414,65366,65213],{"class":2607},[414,65368,7340],{"class":2705},[414,65370,65218],{"class":2601},[414,65372,2757],{"class":2705},[414,65374,65375,65378],{"class":2593,"line":2751},[414,65376,65377],{"class":2607},"            \"Principal\"",[414,65379,10477],{"class":2705},[414,65381,65382,65385,65387],{"class":2593,"line":2760},[414,65383,65384],{"class":2607},"                \"AWS\"",[414,65386,7340],{"class":2705},[414,65388,65389],{"class":2601},"\"arn:aws:iam::944579081756:user\u002Funified_assume_role_user\"\n",[414,65391,65392],{"class":2593,"line":2768},[414,65393,39647],{"class":2705},[414,65395,65396,65398,65400,65403],{"class":2593,"line":2776},[414,65397,65225],{"class":2607},[414,65399,7340],{"class":2705},[414,65401,65402],{"class":2601},"\"sts:AssumeRole\"",[414,65404,2757],{"class":2705},[414,65406,65407,65410],{"class":2593,"line":2784},[414,65408,65409],{"class":2607},"            \"Condition\"",[414,65411,10477],{"class":2705},[414,65413,65414,65417],{"class":2593,"line":2792},[414,65415,65416],{"class":2607},"                \"StringEquals\"",[414,65418,10477],{"class":2705},[414,65420,65421,65424,65426],{"class":2593,"line":2804},[414,65422,65423],{"class":2607},"                    \"sts:ExternalId\"",[414,65425,7340],{"class":2705},[414,65427,65428],{"class":2601},"\"YOUR_EXTERNAL_ID\"\n",[414,65430,65431],{"class":2593,"line":2809},[414,65432,65433],{"class":2705},"                }\n",[414,65435,65436],{"class":2593,"line":2829},[414,65437,65438],{"class":2705},"            }\n",[414,65440,65441],{"class":2593,"line":2843},[414,65442,10641],{"class":2705},[414,65444,65445],{"class":2593,"line":2849},[414,65446,56114],{"class":2705},[414,65448,65449],{"class":2593,"line":2854},[414,65450,3035],{"class":2705},[5888,65452],{},[36,65454,65455],{},"YOUR_EXTERNAL_ID"," with a unique, hard-to-guess string of your choice (e.g. a UUID). You will enter this same value in the Unified dashboard later.",[5888,65458],{},[31,65460,65461],{},"Why an External ID?"," The External ID prevents the ",[41,65464,65467],{"href":65465,"rel":65466},"https:\u002F\u002Fdocs.aws.amazon.com\u002FIAM\u002Flatest\u002FUserGuide\u002Fconfused-deputy.html",[45],"confused deputy problem",". It ensures that only requests originating through your Unified workspace — and not a third party who happens to know the role ARN — can assume the role.",[2357,65470,16292,65471,65473,65474,65476],{},[31,65472,49302],{},", then attach the ",[36,65475,65310],{}," policy you created in Step 1.",[2357,65478,65479,65480,65311],{},"Name the role (e.g. ",[36,65481,65482],{},"UnifiedSecretsManagerRole",[2357,65484,65485,65486,65489,65490],{},"Copy the role's ",[31,65487,65488],{},"ARN"," from the role summary page. It will look like:\n",[36,65491,65492],{},"arn:aws:iam::123456789012:role\u002FUnifiedSecretsManagerRole",[55,65494,65496],{"id":65495},"step-3-configure-unified","Step 3: Configure Unified",[2510,65498,65499,65506,65512,65518,65579],{},[2357,65500,65501,65502,97],{},"Log in to the ",[41,65503,65505],{"href":4146,"rel":65504},[45],"Unified dashboard",[2357,65507,16270,65508,45999,65510,97],{},[31,65509,36643],{},[31,65511,22149],{},[2357,65513,65514,65515,97],{},"Under the secrets manager section, select ",[31,65516,65517],{},"AWS Secret Manager",[2357,65519,65520,65521],{},"Fill in the following fields:",[155,65522,65523,65531],{},[158,65524,65525],{},[161,65526,65527,65529],{},[164,65528,5244],{},[164,65530,5247],{},[174,65532,65533,65545,65557,65567],{},[161,65534,65535,65540],{},[179,65536,65537],{},[31,65538,65539],{},"AWS Region",[179,65541,65542,65543,2980],{},"The region where your Secrets Manager secrets are stored (e.g. ",[36,65544,65289],{},[161,65546,65547,65552],{},[179,65548,65549],{},[31,65550,65551],{},"AWS ARN",[179,65553,65554,65555,2980],{},"The full ARN of the IAM role you created (e.g. ",[36,65556,65492],{},[161,65558,65559,65564],{},[179,65560,65561],{},[31,65562,65563],{},"AWS External ID",[179,65565,65566],{},"The same External ID string you used in the trust policy",[161,65568,65569,65577],{},[179,65570,65571,65573,65574,65576],{},[31,65572,22779],{}," When using Assume Role, you do ",[31,65575,8239],{}," need to fill in the AWS Key and AWS Secret fields. Those fields are only required for the static-credentials approach.",[179,65578],{},[2357,65580,65581],{},"Save your workspace settings.",[55,65583,65585],{"id":65584},"step-4-verify-the-setup","Step 4: Verify the Setup",[22,65587,65588],{},"Once saved, Unified will automatically use the Assume Role flow for all new connections in your workspace. To verify:",[2510,65590,65591,65594,65597],{},[2357,65592,65593],{},"Create or update a connection in your workspace.",[2357,65595,65596],{},"Check your AWS Secrets Manager console — you should see a new secret created with a name that includes your workspace ID.",[2357,65598,65599],{},"If there are any issues, Unified will surface errors in the connection status.",[55,65601,5622],{"id":5621},[3629,65603,65605],{"id":65604},"missing-role-arn-or-region","'Missing role ARN or region'",[22,65607,65608,65609,741,65611,65613],{},"Ensure both the ",[31,65610,65539],{},[31,65612,65551],{}," fields are filled in on your workspace settings.",[3629,65615,65617],{"id":65616},"access-denied-or-not-authorized-to-perform-stsassumerole","'Access Denied' or 'Not authorized to perform sts:AssumeRole'",[2354,65619,65620,65630,65635],{},[2357,65621,65622,65623,65626,65627],{},"Verify the ",[31,65624,65625],{},"trust policy"," on your IAM role references the correct Unified AWS principal:\n",[36,65628,65629],{},"arn:aws:iam::944579081756:user\u002Funified_assume_role_user",[2357,65631,65622,65632,65634],{},[31,65633,24427],{}," in the trust policy matches exactly what you entered in Unified.",[2357,65636,65637,65638,65641],{},"Ensure the IAM role's permissions policy includes the required ",[36,65639,65640],{},"secretsmanager:*"," actions.",[3629,65643,65645],{"id":65644},"the-security-token-included-in-the-request-is-expired","'The security token included in the request is expired'",[22,65647,65648],{},"Temporary credentials are cached for up to 55 minutes and refreshed automatically. If you see this error persistently, confirm that your IAM role allows a session duration of at least 1 hour (the default).",[3629,65650,65652],{"id":65651},"secrets-are-not-being-stored","Secrets are not being stored",[2354,65654,65655,65658],{},[2357,65656,65657],{},"Confirm the IAM role's permissions policy allows actions on the correct region and account.",[2357,65659,65660,65661,65663],{},"Check that the ",[36,65662,44774],{}," in your permissions policy matches the region configured in Unified.",[55,65665,65667],{"id":65666},"migrating-from-static-credentials","Migrating from Static Credentials",[22,65669,65670],{},"If you are currently using the static AWS Key \u002F AWS Secret approach:",[2510,65672,65673,65676,65679,65682],{},[2357,65674,65675],{},"Follow Steps 1-3 above to set up the IAM role and configure Unified.",[2357,65677,65678],{},"Once the ARN and External ID are saved, Unified will prefer the Assume Role flow over static credentials.",[2357,65680,65681],{},"After verifying that secrets are being read and written correctly, you can remove the static AWS Key and AWS Secret from your workspace settings.",[2357,65683,65684],{},"Revoke or delete the old IAM user credentials in your AWS account.",[55,65686,65688],{"id":65687},"security-best-practices","Security Best Practices",[2354,65690,65691,65697,65706,65712,65722],{},[2357,65692,65693,65696],{},[31,65694,65695],{},"Use a unique External ID per workspace."," This prevents cross-workspace role assumption.",[2357,65698,65699,65702,65703,65705],{},[31,65700,65701],{},"Scope the permissions policy narrowly."," Restrict the ",[36,65704,44774],{}," to only the secret prefixes Unified needs.",[2357,65707,65708,65711],{},[31,65709,65710],{},"Rotate the External ID periodically."," Update both the IAM trust policy and the Unified dashboard when you do.",[2357,65713,65714,65717,65718,65721],{},[31,65715,65716],{},"Enable CloudTrail logging."," Monitor ",[36,65719,65720],{},"AssumeRole"," events in your AWS account to audit access.",[2357,65723,65724,65727],{},[31,65725,65726],{},"Do not share the External ID publicly."," Treat it as a sensitive configuration value.",[4156,65729,37739],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":65731},[65732,65735,65736,65737,65738,65739,65740,65746,65747],{"id":4425,"depth":2434,"text":4426,"children":65733},[65734],{"id":65088,"depth":2613,"text":65089},{"id":2541,"depth":2434,"text":2542},{"id":65155,"depth":2434,"text":65156},{"id":65314,"depth":2434,"text":65315},{"id":65495,"depth":2434,"text":65496},{"id":65584,"depth":2434,"text":65585},{"id":5621,"depth":2434,"text":5622,"children":65741},[65742,65743,65744,65745],{"id":65604,"depth":2613,"text":65605},{"id":65616,"depth":2613,"text":65617},{"id":65644,"depth":2613,"text":65645},{"id":65651,"depth":2613,"text":65652},{"id":65666,"depth":2434,"text":65667},{"id":65687,"depth":2434,"text":65688},"This guide walks you through configuring AWS IAM Assume Role so that Unified can securely access AWS Secrets Manager in your account — without sharing...",{"img":7949,"date":65750,"updated":65751,"tag":2457,"integrations":3},"2026-03-12T15:37:00.000Z","2026-05-28T13:16:29.279Z","\u002Fguides\u002Fhow_to_setup_aws_assume_role_for_aws_secret_manager",{"title":65065,"description":65748},"guides\u002Fhow_to_setup_aws_assume_role_for_aws_secret_manager","Heis7Xe0Zq8Ekw84T0qjOGADOWIs3A_uMEOmcMYMBAA",{"id":65757,"title":65758,"body":65759,"description":66537,"extension":2452,"meta":66538,"navigation":2459,"path":66542,"seo":66543,"stem":66544,"__hash__":66545},"guides\u002Fguides\u002Fhow_to_setup_oracle_jd_edwards.md","How to setup Oracle JD Edwards",{"type":12,"value":65760,"toc":66519},[65761,65764,65766,65771,65778,65788,65804,65806,65808,65825,65831,65846,65848,65850,65898,65900,65904,65907,65916,65923,65930,65932,65936,65939,65951,65959,65961,65965,65972,65975,65982,65984,65988,65991,66012,66024,66026,66030,66033,66054,66061,66063,66067,66073,66102,66104,66108,66111,66121,66123,66127,66130,66198,66201,66203,66205,66286,66288,66295,66302,66369,66371,66373,66410,66412,66420,66430,66450,66490,66509,66511,66516],[15,65762,65758],{"id":65763},"how-to-setup-oracle-jd-edwards",[19,65765],{},[22,65767,65768],{},[25,65769,65770],{},"August 17, 2026",[15,65772,65774,65775],{"id":65773},"connect-jd-edwards-to-unifiedto","Connect JD Edwards to ",[41,65776,123],{"href":121,"rel":65777},[45],[22,65779,65780,65783,65784,65787],{},[31,65781,65782],{},"Administrator guide"," — How to configure your JD Edwards EnterpriseOne environment so ",[41,65785,123],{"href":121,"rel":65786},[45]," can securely read data through the Application Interface Services (AIS) Server REST API.",[4937,65789,65790],{},[22,65791,65792,65795,65796,65799,65800,65803],{},[31,65793,65794],{},"Audience:"," JDE \u002F CNC administrator · ",[31,65797,65798],{},"Applies to:"," EnterpriseOne 9.2 · ",[31,65801,65802],{},"Access level:"," Read-only",[19,65805],{},[55,65807,4426],{"id":4425},[22,65809,65810,65813,65814,65817,65818,34,65821,65824],{},[41,65811,123],{"href":121,"rel":65812},[45]," connects to JD Edwards the same way any external REST client does — through the ",[31,65815,65816],{},"Application Interface Services (AIS) Server",", the lightweight JSON-over-REST gateway that ships with EnterpriseOne. ",[31,65819,65820],{},"Nothing is installed inside your JD Edwards environment.",[41,65822,123],{"href":121,"rel":65823},[45]," makes outbound HTTPS calls to your AIS Server, signs in with a JD Edwards user account you provide, and reads data using the standard AIS services. Every request is authenticated by EnterpriseOne and constrained by that user's security.",[22,65826,65827,65828,97],{},"This guide walks a JDE or CNC administrator through the one-time setup: confirming the AIS Server, securing it, creating a dedicated service account, granting the right access, opening the network path, and verifying the connection before handing the sign-in details to ",[41,65829,123],{"href":121,"rel":65830},[45],[2584,65832,65834],{"className":2649,"code":65833,"language":2651,"meta":2652,"style":2433},"Unified.to  ──HTTPS──▶  AIS Server (\u002Fjderest)  ──E1 auth──▶  EnterpriseOne\n(external client)       (token & data services)             (apps, security, data)\n",[36,65835,65836,65841],{"__ignoreMap":2433},[414,65837,65838],{"class":2593,"line":2594},[414,65839,65840],{},"Unified.to  ──HTTPS──▶  AIS Server (\u002Fjderest)  ──E1 auth──▶  EnterpriseOne\n",[414,65842,65843],{"class":2593,"line":2434},[414,65844,65845],{},"(external client)       (token & data services)             (apps, security, data)\n",[19,65847],{},[55,65849,4890],{"id":4889},[2354,65851,65853,65862,65871,65880,65889],{"className":65852},[44157],[2357,65854,65856,34,65858,65861],{"className":65855},[44161],[44163,65857],{"disabled":2459,"type":44165},[31,65859,65860],{},"An AIS Server is deployed and running."," AIS is managed in Server Manager as part of your EnterpriseOne Tools installation.",[2357,65863,65865,34,65867,65870],{"className":65864},[44161],[44163,65866],{"disabled":2459,"type":44165},[31,65868,65869],{},"EnterpriseOne Tools Release 9.2.4 or later."," This is the minimum release documented for the AIS Server REST API.",[2357,65872,65874,34,65876,65879],{"className":65873},[44161],[44163,65875],{"disabled":2459,"type":44165},[31,65877,65878],{},"The AIS Server is configured with a Security Server."," From Tools 9.2.2.2 onward, an AIS Server must be associated with an EnterpriseOne Enterprise (Security) Server.",[2357,65881,65883,34,65885,65888],{"className":65882},[44161],[44163,65884],{"disabled":2459,"type":44165},[31,65886,65887],{},"You can create users and assign roles"," in the EnterpriseOne security tools, and you can reach Server Manager.",[2357,65890,65892,34,65894,65897],{"className":65891},[44161],[44163,65893],{"disabled":2459,"type":44165},[31,65895,65896],{},"You know which environment and role"," the integration should sign in to (for example a reporting or production environment).",[19,65899],{},[55,65901,65903],{"id":65902},"step-1-confirm-the-ais-server-and-note-its-url","Step 1 — Confirm the AIS Server and note its URL",[22,65905,65906],{},"In Server Manager, open your AIS Server instance and confirm it is started. AIS exposes its services under a base URL of the form:",[2584,65908,65910],{"className":2649,"code":65909,"language":2651,"meta":2652,"style":2433},"https:\u002F\u002F\u003Cais-host>:\u003Cport>\u002Fjderest\n",[36,65911,65912],{"__ignoreMap":2433},[414,65913,65914],{"class":2593,"line":2594},[414,65915,65909],{},[22,65917,65918,65919,65922],{},"Record this base URL — ",[41,65920,123],{"href":121,"rel":65921},[45]," needs it. Individual services live beneath it (for example the token request and data services), so the host and port are all you supply.",[4937,65924,65925],{},[22,65926,65927,65929],{},[31,65928,22779],{}," If AIS sits behind a reverse proxy or load balancer, use the externally reachable URL that terminates TLS, not the internal application-server address.",[19,65931],{},[55,65933,65935],{"id":65934},"step-2-require-https","Step 2 — Require HTTPS",[22,65937,65938],{},"Configure the AIS Server (or the proxy in front of it) to use SSL\u002FTLS so all traffic is over HTTPS. The AIS Server supports SSL configuration through Server Manager and the application server it runs on.",[2354,65940,65941,65948],{},[2357,65942,65943,65944,65947],{},"Install a certificate signed by a trusted public authority so ",[41,65945,123],{"href":121,"rel":65946},[45]," can validate it.",[2357,65949,65950],{},"Avoid self-signed certificates for production; they cause TLS validation failures for external clients.",[4937,65952,65953],{},[22,65954,65955,65958],{},[31,65956,65957],{},"⚠ Important:"," Credentials are sent on every sign-in. Do not expose the AIS Server over plain HTTP.",[19,65960],{},[55,65962,65964],{"id":65963},"step-3-enable-the-authentication-method-in-ais-security-settings","Step 3 — Enable the authentication method in AIS security settings",[22,65966,65967,65968,65971],{},"In Server Manager, open the AIS Server's ",[31,65969,65970],{},"Application Interface Services Security Settings",". The login type used by the client must be enabled there for that client to authenticate. Enable standard EnterpriseOne username\u002Fpassword authentication.",[22,65973,65974],{},"Confirm the AIS Server's Security Server host and port are defined so it can validate sign-ins against EnterpriseOne.",[4937,65976,65977],{},[22,65978,65979,65981],{},[31,65980,22779],{}," These settings are shared by all AIS clients. Changing them affects every application that uses this AIS Server, so review them with your CNC team before saving.",[19,65983],{},[55,65985,65987],{"id":65986},"step-4-create-a-dedicated-service-account","Step 4 — Create a dedicated service account",[22,65989,65990],{},"Create a JD Edwards EnterpriseOne user reserved for this integration rather than reusing a person's login. A dedicated account keeps the integration's activity auditable and easy to revoke.",[2354,65992,65993,66000,66009],{},[2357,65994,65995,65996,65999],{},"Assign it a role scoped to ",[31,65997,65998],{},"read\u002Finquiry access"," for the data the integration should see.",[2357,66001,66002,66003,741,66005,66008],{},"Set the default ",[31,66004,56512],{},[31,66006,66007],{},"role"," it signs in with, or plan to supply them explicitly.",[2357,66010,66011],{},"Apply your standard password policy; use a strong, unique password.",[4937,66013,66014],{},[22,66015,66016,66019,66020,66023],{},[31,66017,66018],{},"✓ Best practice:"," Because ",[41,66021,123],{"href":121,"rel":66022},[45]," reads data, a role with inquiry-level access is sufficient. Grant no more than the integration needs.",[19,66025],{},[55,66027,66029],{"id":66028},"step-5-grant-the-account-access","Step 5 — Grant the account access",[22,66031,66032],{},"Two layers govern what the service account can do — make sure both allow the data you intend to share:",[2354,66034,66035,66041],{},[2357,66036,66037,66040],{},[31,66038,66039],{},"AIS access."," Per your Tools release, grant the user access to the AIS Server — for example by adding it to the AIS user allowlist or assigning the appropriate AIS role — so it is permitted to authenticate as an AIS client.",[2357,66042,66043,66046,66047,741,66050,66053],{},[31,66044,66045],{},"EnterpriseOne security."," AIS requests honor EnterpriseOne security. Use Security Workbench to ensure the user's role has access to the applications and data the integration reads, and review any ",[31,66048,66049],{},"row",[31,66051,66052],{},"column"," security that would hide records or fields.",[4937,66055,66056],{},[22,66057,66058,66060],{},[31,66059,22779],{}," If the integration returns fewer records or fields than expected, security on the role is the usual cause — the account can only ever see what EnterpriseOne security permits.",[19,66062],{},[55,66064,66066],{"id":66065},"step-6-open-the-network-path","Step 6 — Open the network path",[22,66068,66069,66072],{},[41,66070,123],{"href":121,"rel":66071},[45],"'s servers must be able to reach your AIS Server over HTTPS.",[2354,66074,66075,66088,66095],{},[2357,66076,66077,66078,66081,66082,66087],{},"Allow inbound HTTPS to the AIS host\u002Fport through your firewall — restricted to ",[41,66079,123],{"href":121,"rel":66080},[45],"'s egress IP addresses listed in the ",[41,66083,66086],{"href":66084,"rel":66085},"https:\u002F\u002Fapp.notion.com\u002Fp\u002Funified-to\u002Fbf8154eb04f84537b972c6170fb94a79?v=e7df13bafc244e839a8b60b15ec0f96d&p=3bf6207b838480c78091fc0cb6d883de&pm=s#appendix--unifiedto-egress-ip-addresses",[45],"appendix"," below.",[2357,66089,66090,66091,66094],{},"If you expose AIS through a gateway or DMZ proxy, forward the ",[36,66092,66093],{},"\u002Fjderest"," path to the AIS Server.",[2357,66096,66097,66098,66101],{},"The AIS Server's ",[31,66099,66100],{},"allowed origins"," (CORS) setting governs browser-based callers. Server-to-server calls are not subject to browser CORS, but confirm no other network policy blocks the caller.",[19,66103],{},[55,66105,66107],{"id":66106},"step-7-review-the-session-timeout","Step 7 — Review the session timeout",[22,66109,66110],{},"When a client signs in, the AIS Server issues a session token that expires after an idle period you control in Server Manager. The default is short; keep it reasonable so routine syncs don't expire mid-request, while still meeting your security policy.",[4937,66112,66113],{},[22,66114,66115,34,66117,66120],{},[31,66116,22779],{},[41,66118,123],{"href":121,"rel":66119},[45]," re-authenticates automatically when a token expires, so no coordination on exact timing is required — this is just to avoid an unusually aggressive timeout.",[19,66122],{},[55,66124,66126],{"id":66125},"step-8-verify-the-connection","Step 8 — Verify the connection",[22,66128,66129],{},"From a machine that can reach the AIS Server, request a token with the service account. A successful response confirms the URL, TLS, security settings, and account are all working together:",[2584,66131,66133],{"className":2586,"code":66132,"language":2588,"meta":2433,"style":2433},"# Request an AIS session token\ncurl -X POST -H \"Content-Type: application\u002Fjson\" \\\n  https:\u002F\u002F\u003Cais-host>:\u003Cport>\u002Fjderest\u002Fv2\u002Ftokenrequest \\\n  -d '{ \"username\": \"\u003Cservice-user>\", \"password\": \"\u003Cpassword>\",\n        \"environment\": \"\u003Cenv>\", \"role\": \"\u003Crole>\", \"deviceName\": \"unifiedto\" }'\n",[36,66134,66135,66140,66155,66186,66193],{"__ignoreMap":2433},[414,66136,66137],{"class":2593,"line":2594},[414,66138,66139],{"class":3527},"# Request an AIS session token\n",[414,66141,66142,66144,66146,66148,66151,66153],{"class":2593,"line":2434},[414,66143,18073],{"class":2597},[414,66145,18076],{"class":2607},[414,66147,18079],{"class":2601},[414,66149,66150],{"class":2607}," -H",[414,66152,18107],{"class":2601},[414,66154,18085],{"class":2607},[414,66156,66157,66160,66162,66165,66168,66170,66172,66174,66177,66179,66181,66184],{"class":2593,"line":2613},[414,66158,66159],{"class":2601},"  https:\u002F\u002F",[414,66161,2988],{"class":2698},[414,66163,66164],{"class":2601},"ais-hos",[414,66166,66167],{"class":2705},"t",[414,66169,54166],{"class":2698},[414,66171,2646],{"class":2601},[414,66173,2988],{"class":2698},[414,66175,66176],{"class":2601},"por",[414,66178,66167],{"class":2705},[414,66180,54166],{"class":2698},[414,66182,66183],{"class":2601},"\u002Fjderest\u002Fv2\u002Ftokenrequest",[414,66185,18085],{"class":2607},[414,66187,66188,66190],{"class":2593,"line":2625},[414,66189,18114],{"class":2607},[414,66191,66192],{"class":2601}," '{ \"username\": \"\u003Cservice-user>\", \"password\": \"\u003Cpassword>\",\n",[414,66194,66195],{"class":2593,"line":2677},[414,66196,66197],{"class":2601},"        \"environment\": \"\u003Cenv>\", \"role\": \"\u003Crole>\", \"deviceName\": \"unifiedto\" }'\n",[22,66199,66200],{},"A JSON response containing user information and a token means the account can authenticate. An error points to the layer to revisit — see the table below.",[19,66202],{},[55,66204,5622],{"id":5621},[155,66206,66207,66218],{},[158,66208,66209],{},[161,66210,66211,66213,66215],{},[164,66212,37665],{},[164,66214,7838],{},[164,66216,66217],{},"Where to look",[174,66219,66220,66231,66242,66253,66264,66275],{},[161,66221,66222,66225,66228],{},[179,66223,66224],{},"Connection refused \u002F timeout",[179,66226,66227],{},"Network path or TLS not reachable from outside.",[179,66229,66230],{},"Firewall rules, proxy, AIS host\u002Fport (Step 6), HTTPS (Step 2).",[161,66232,66233,66236,66239],{},[179,66234,66235],{},"Certificate error",[179,66237,66238],{},"Self-signed or untrusted certificate.",[179,66240,66241],{},"Install a publicly trusted certificate (Step 2).",[161,66243,66244,66247,66250],{},[179,66245,66246],{},"401 Unauthorized",[179,66248,66249],{},"Bad credentials, or login type not enabled.",[179,66251,66252],{},"Service account and AIS security settings (Steps 3–4).",[161,66254,66255,66258,66261],{},[179,66256,66257],{},"403 \u002F access denied",[179,66259,66260],{},"User not permitted as an AIS client.",[179,66262,66263],{},"AIS access \u002F allowlist or AIS role (Step 5).",[161,66265,66266,66269,66272],{},[179,66267,66268],{},"Signs in, no data",[179,66270,66271],{},"EnterpriseOne security hides the records or fields.",[179,66273,66274],{},"Security Workbench: application, row, and column security (Step 5).",[161,66276,66277,66280,66283],{},[179,66278,66279],{},"Works, then fails later",[179,66281,66282],{},"Session token expired.",[179,66284,66285],{},"AIS session timeout (Step 7).",[19,66287],{},[55,66289,66291,66292],{"id":66290},"hand-off-to-unifiedto","Hand off to ",[41,66293,123],{"href":121,"rel":66294},[45],[22,66296,66297,66298,66301],{},"Once the token test succeeds, provide these values to ",[41,66299,123],{"href":121,"rel":66300},[45]," when creating the connection. Share the password through a secure channel.",[155,66303,66304,66312],{},[158,66305,66306],{},[161,66307,66308,66310],{},[164,66309,5244],{},[164,66311,5247],{},[174,66313,66314,66327,66336,66345,66357],{},[161,66315,66316,66321],{},[179,66317,66318],{},[31,66319,66320],{},"AIS Server URL",[179,66322,66323,66324],{},"The base HTTPS URL, e.g. ",[36,66325,66326],{},"https:\u002F\u002Fjde.example.com:9302",[161,66328,66329,66333],{},[179,66330,66331],{},[31,66332,20097],{},[179,66334,66335],{},"The dedicated service account you created",[161,66337,66338,66342],{},[179,66339,66340],{},[31,66341,20113],{},[179,66343,66344],{},"That account's password",[161,66346,66347,66352],{},[179,66348,66349],{},[31,66350,66351],{},"Environment",[179,66353,66354,66356],{},[25,66355,36592],{}," — the environment to sign in to (defaults to the AIS Server's setting)",[161,66358,66359,66364],{},[179,66360,66361],{},[31,66362,66363],{},"Role",[179,66365,66366,66368],{},[25,66367,36592],{}," — the role to sign in with (defaults to the AIS Server's setting)",[19,66370],{},[55,66372,63225],{"id":63224},[2354,66374,66375,66382,66389,66396,66403],{},[2357,66376,66377],{},[41,66378,66381],{"href":66379,"rel":66380},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fapplications\u002Fjd-edwards\u002Finteroperability\u002F9.2.x\u002Feoiis\u002Fmanaging-the-ais-server-through-server-manager.html",[45],"Managing the AIS Server through Server Manager",[2357,66383,66384],{},[41,66385,66388],{"href":66386,"rel":66387},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fapplications\u002Fjd-edwards\u002Fadministration\u002F9.2.x\u002Feotsc\u002Fapplication-interface-services-ais-server-and-ais-client.html",[45],"Application Interface Services (AIS) Server and AIS Client Security",[2357,66390,66391],{},[41,66392,66395],{"href":66393,"rel":66394},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fapplications\u002Fjd-edwards\u002Fcross-product\u002F9.2\u002Frest-api\u002FAuthentication.html",[45],"REST API for the JD Edwards EnterpriseOne AIS Server — Authentication",[2357,66397,66398],{},[41,66399,66402],{"href":66400,"rel":66401},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fapplications\u002Fjd-edwards\u002Fcross-product\u002F9.2\u002Frest-api\u002FQuickStart.html",[45],"REST API for the JD Edwards EnterpriseOne AIS Server — Quick Start",[2357,66404,66405],{},[41,66406,66409],{"href":66407,"rel":66408},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fapplications\u002Fjd-edwards\u002Finteroperability\u002F9.2.x\u002Feoiis\u002F",[45],"JD Edwards EnterpriseOne Tools: Application Interface Services Server Reference Guide",[19,66411],{},[55,66413,66415,66416,66419],{"id":66414},"appendix-unifiedto-egress-ip-addresses","Appendix — ",[41,66417,123],{"href":121,"rel":66418},[45]," egress IP addresses",[22,66421,66422,66425,66426,66429],{},[41,66423,123],{"href":121,"rel":66424},[45]," calls your AIS Server from the fixed IP addresses below. Allow inbound HTTPS from these addresses to the AIS host\u002Fport in your firewall or reverse proxy (Step 6). Allowlisting all three keeps the connection working regardless of which ",[41,66427,123],{"href":121,"rel":66428},[45]," region serves it.",[2584,66431,66433],{"className":2649,"code":66432,"language":2651,"meta":2652,"style":2433},"44.199.69.244\n3.65.142.239\n13.239.151.208\n",[36,66434,66435,66440,66445],{"__ignoreMap":2433},[414,66436,66437],{"class":2593,"line":2594},[414,66438,66439],{},"44.199.69.244\n",[414,66441,66442],{"class":2593,"line":2434},[414,66443,66444],{},"3.65.142.239\n",[414,66446,66447],{"class":2593,"line":2613},[414,66448,66449],{},"13.239.151.208\n",[155,66451,66452,66461],{},[158,66453,66454],{},[161,66455,66456,66459],{},[164,66457,66458],{},"IP address",[164,66460,5987],{},[174,66462,66463,66472,66481],{},[161,66464,66465,66469],{},[179,66466,66467],{},[36,66468,54095],{},[179,66470,66471],{},"United States",[161,66473,66474,66478],{},[179,66475,66476],{},[36,66477,54098],{},[179,66479,66480],{},"European Union",[161,66482,66483,66487],{},[179,66484,66485],{},[36,66486,54101],{},[179,66488,66489],{},"Australia \u002F Asia-Pacific",[4937,66491,66492],{},[22,66493,66494,66496,66497,66500,66501,66504,66505,66508],{},[31,66495,22779],{}," Allow these addresses ",[31,66498,66499],{},"inbound"," to your AIS Server. They are the source addresses of ",[41,66502,123],{"href":121,"rel":66503},[45],"'s outbound calls — no changes to your own outbound firewall rules are required. If your ",[41,66506,123],{"href":121,"rel":66507},[45]," connection uses a single region, you may allowlist only that region's address, but permitting all three avoids breakage if the serving region changes.",[19,66510],{},[22,66512,66513],{},[25,66514,66515],{},"This guide describes standard JD Edwards EnterpriseOne administration using Oracle's published documentation. Exact menu labels and available settings vary by Tools Release; consult the references above for your version. Verify each step in a non-production environment first.",[4156,66517,66518],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}",{"title":2433,"searchDepth":2434,"depth":2434,"links":66520},[66521,66522,66523,66524,66525,66526,66527,66528,66529,66530,66531,66532,66534,66535],{"id":4425,"depth":2434,"text":4426},{"id":4889,"depth":2434,"text":4890},{"id":65902,"depth":2434,"text":65903},{"id":65934,"depth":2434,"text":65935},{"id":65963,"depth":2434,"text":65964},{"id":65986,"depth":2434,"text":65987},{"id":66028,"depth":2434,"text":66029},{"id":66065,"depth":2434,"text":66066},{"id":66106,"depth":2434,"text":66107},{"id":66125,"depth":2434,"text":66126},{"id":5621,"depth":2434,"text":5622},{"id":66290,"depth":2434,"text":66533},"Hand off to Unified.to",{"id":63224,"depth":2434,"text":63225},{"id":66414,"depth":2434,"text":66536},"Appendix — Unified.to egress IP addresses","Administrator guide — How to configure your JD Edwards EnterpriseOne environment so Unified.to can securely read data through the Application Interface...",{"img":7949,"date":66539,"updated":66540,"tag":2457,"integrations":66541},"2026-08-17T01:48:00.000Z","2026-08-23T14:54:28.095Z","oraclejde","\u002Fguides\u002Fhow_to_setup_oracle_jd_edwards",{"title":65758,"description":66537},"guides\u002Fhow_to_setup_oracle_jd_edwards","kItaBaGSWGcKFfMz3YvJkgPBQlGp6YAYpZt9VDYyA9o",{"id":66547,"title":66548,"body":66549,"description":66562,"extension":2452,"meta":66927,"navigation":2459,"path":66932,"seo":66933,"stem":66934,"__hash__":66935},"guides\u002Fguides\u002Fhow_to_setup_quickbooks_desktop.md","How to Setup Quickbooks Desktop",{"type":12,"value":66550,"toc":66925},[66551,66554,66556,66560,66563,66922],[15,66552,66548],{"id":66553},"how-to-setup-quickbooks-desktop",[19,66555],{},[22,66557,66558],{},[25,66559,45502],{},[22,66561,66562],{},"Quickbooks Desktop\u002FEnterprise is a desktop application and not a web\u002Fonline application, and thus needs additional setup to enable API access.",[2510,66564,66565,66573,66582,66591,66874,66877,66886,66895,66904,66913],{},[2357,66566,66567,66572],{},[41,66568,66571],{"href":66569,"rel":66570},"https:\u002F\u002Fquickbooks.intuit.com\u002Flearn-support\u002Fen-ca\u002Fhelp-article\u002Finstall-products\u002Fset-quickbooks-web-connector\u002FL4Vp7VI44_CA_en_CA",[45],"Download QBWC"," (Web Connector) from Quickbooks and install the program on the same computer where your Quickbooks Desktop is running.",[2357,66574,66575,66576,66578],{},"Activate Quickbooks Desktop Integration in your workspace",[5888,66577],{},[4201,66579],{"alt":66580,"src":66581},"Screenshot_2026-04-02_at_10.37.30_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_setup_quickbooks_desktop-0.png",[2357,66583,66584,66585,66587],{},"Create a Quickbooks Desktop connection within Unified (enter your username and password you will use in the QBWC)",[5888,66586],{},[4201,66588],{"alt":66589,"src":66590},"Screenshot_2026-04-02_at_10.39.37_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_setup_quickbooks_desktop-1.png",[2357,66592,66593,66594],{},"Create a .qwc file, it should be in the following format:",[2584,66595,66597],{"className":16485,"code":66596,"language":16487,"meta":2433,"style":2433},"\u003C?xml version=\"1.0\"?>\n\u003CQBWCXML>\n\u003CAppName>Unified\u003C\u002FAppName>\n\u003CAppID>\u003C\u002FAppID>\n\u003CAppURL>\nhttps:\u002F\u002Fapi.unified.to\u002Fwebhook\u002Fworkspace\u002Fquickbooksdesktop?workspace_id=your_workspace_id&amp;connection_id=\nyour_quickbooks_desktop_connection_id\u003C\u002FAppURL>\n\u003CAppDescription>A short description for WCWebService1\u003C\u002FAppDescription>\n\u003CAppSupport>\nhttps:\u002F\u002Funified.ngrok.dev\u002Fsupport\n\u003C\u002FAppSupport>\n\u003CUserName>your_username\u003C\u002FUserName>\n\u003COwnerID>{57F3B9B1-86F1-4fcc-B1EE-566DE1813D21}\u003C\u002FOwnerID>\n\u003CFileID>{90A44FB5-33D9-4815-AC85-BC87A7E7D1EZ}\u003C\u002FFileID>\n\u003CQBType>QBFS\u003C\u002FQBType>\n\u003CScheduler>\n\u003CRunEveryNMinutes>number_of_minutes_between_each_sync_or_remove_this_if_you_want_to_sync_manually\u003C\u002FRunEveryNMinutes>\n\u003C\u002FScheduler>\n\u003C\u002FQBWCXML>\n",[36,66598,66599,66615,66625,66639,66653,66662,66673,66682,66696,66705,66710,66719,66733,66779,66821,66835,66844,66858,66866],{"__ignoreMap":2433},[414,66600,66601,66604,66607,66609,66612],{"class":2593,"line":2594},[414,66602,66603],{"class":2698},"\u003C?",[414,66605,66606],{"class":2705},"xml version",[414,66608,2798],{"class":2698},[414,66610,66611],{"class":2601},"\"1.0\"",[414,66613,66614],{"class":2698},"?>\n",[414,66616,66617,66619,66622],{"class":2593,"line":2434},[414,66618,2988],{"class":2705},[414,66620,66621],{"class":2607},"QBWCXML",[414,66623,66624],{"class":2705},">\n",[414,66626,66627,66629,66632,66635,66637],{"class":2593,"line":2613},[414,66628,2988],{"class":2705},[414,66630,66631],{"class":2607},"AppName",[414,66633,66634],{"class":2705},">Unified\u003C\u002F",[414,66636,66631],{"class":2607},[414,66638,66624],{"class":2705},[414,66640,66641,66643,66646,66649,66651],{"class":2593,"line":2625},[414,66642,2988],{"class":2705},[414,66644,66645],{"class":2607},"AppID",[414,66647,66648],{"class":2705},">\u003C\u002F",[414,66650,66645],{"class":2607},[414,66652,66624],{"class":2705},[414,66654,66655,66657,66660],{"class":2593,"line":2677},[414,66656,2988],{"class":2705},[414,66658,66659],{"class":2607},"AppURL",[414,66661,66624],{"class":2705},[414,66663,66664,66667,66670],{"class":2593,"line":2751},[414,66665,66666],{"class":2705},"https:\u002F\u002Fapi.unified.to\u002Fwebhook\u002Fworkspace\u002Fquickbooksdesktop?workspace_id=your_workspace_id",[414,66668,66669],{"class":2607},"&amp;",[414,66671,66672],{"class":2705},"connection_id=\n",[414,66674,66675,66678,66680],{"class":2593,"line":2760},[414,66676,66677],{"class":2705},"your_quickbooks_desktop_connection_id\u003C\u002F",[414,66679,66659],{"class":2607},[414,66681,66624],{"class":2705},[414,66683,66684,66686,66689,66692,66694],{"class":2593,"line":2768},[414,66685,2988],{"class":2705},[414,66687,66688],{"class":2607},"AppDescription",[414,66690,66691],{"class":2705},">A short description for WCWebService1\u003C\u002F",[414,66693,66688],{"class":2607},[414,66695,66624],{"class":2705},[414,66697,66698,66700,66703],{"class":2593,"line":2776},[414,66699,2988],{"class":2705},[414,66701,66702],{"class":2607},"AppSupport",[414,66704,66624],{"class":2705},[414,66706,66707],{"class":2593,"line":2784},[414,66708,66709],{"class":2705},"https:\u002F\u002Funified.ngrok.dev\u002Fsupport\n",[414,66711,66712,66715,66717],{"class":2593,"line":2792},[414,66713,66714],{"class":2705},"\u003C\u002F",[414,66716,66702],{"class":2607},[414,66718,66624],{"class":2705},[414,66720,66721,66723,66726,66729,66731],{"class":2593,"line":2804},[414,66722,2988],{"class":2705},[414,66724,66725],{"class":2607},"UserName",[414,66727,66728],{"class":2705},">your_username\u003C\u002F",[414,66730,66725],{"class":2607},[414,66732,66624],{"class":2705},[414,66734,66735,66737,66740,66743,66746,66748,66751,66754,66756,66759,66761,66764,66766,66769,66772,66775,66777],{"class":2593,"line":2809},[414,66736,2988],{"class":2705},[414,66738,66739],{"class":2607},"OwnerID",[414,66741,66742],{"class":2705},">{57",[414,66744,66745],{"class":2607},"F3B9B1",[414,66747,34146],{"class":2698},[414,66749,66750],{"class":2705},"86",[414,66752,66753],{"class":2607},"F1",[414,66755,34146],{"class":2698},[414,66757,66758],{"class":2705},"4fcc",[414,66760,34146],{"class":2698},[414,66762,66763],{"class":2607},"B1EE",[414,66765,34146],{"class":2698},[414,66767,66768],{"class":2705},"566",[414,66770,66771],{"class":2607},"DE1813D21",[414,66773,66774],{"class":2705},"}\u003C\u002F",[414,66776,66739],{"class":2607},[414,66778,66624],{"class":2705},[414,66780,66781,66783,66786,66789,66792,66794,66797,66800,66802,66805,66807,66810,66812,66815,66817,66819],{"class":2593,"line":2829},[414,66782,2988],{"class":2705},[414,66784,66785],{"class":2607},"FileID",[414,66787,66788],{"class":2705},">{90",[414,66790,66791],{"class":2607},"A44FB5",[414,66793,34146],{"class":2698},[414,66795,66796],{"class":2705},"33",[414,66798,66799],{"class":2607},"D9",[414,66801,34146],{"class":2698},[414,66803,66804],{"class":2607},"4815",[414,66806,34146],{"class":2698},[414,66808,66809],{"class":2607},"AC85",[414,66811,34146],{"class":2698},[414,66813,66814],{"class":2607},"BC87A7E7D1EZ",[414,66816,66774],{"class":2705},[414,66818,66785],{"class":2607},[414,66820,66624],{"class":2705},[414,66822,66823,66825,66828,66831,66833],{"class":2593,"line":2843},[414,66824,2988],{"class":2705},[414,66826,66827],{"class":2607},"QBType",[414,66829,66830],{"class":2705},">QBFS\u003C\u002F",[414,66832,66827],{"class":2607},[414,66834,66624],{"class":2705},[414,66836,66837,66839,66842],{"class":2593,"line":2849},[414,66838,2988],{"class":2705},[414,66840,66841],{"class":2607},"Scheduler",[414,66843,66624],{"class":2705},[414,66845,66846,66848,66851,66854,66856],{"class":2593,"line":2854},[414,66847,2988],{"class":2705},[414,66849,66850],{"class":2607},"RunEveryNMinutes",[414,66852,66853],{"class":2705},">number_of_minutes_between_each_sync_or_remove_this_if_you_want_to_sync_manually\u003C\u002F",[414,66855,66850],{"class":2607},[414,66857,66624],{"class":2705},[414,66859,66860,66862,66864],{"class":2593,"line":2880},[414,66861,66714],{"class":2705},[414,66863,66841],{"class":2607},[414,66865,66624],{"class":2705},[414,66867,66868,66870,66872],{"class":2593,"line":3253},[414,66869,66714],{"class":2705},[414,66871,66621],{"class":2607},[414,66873,66624],{"class":2705},[2357,66875,66876],{},"Once the QBWC has installed, first open your Quickbooks Desktop with the company you wish to sync",[2357,66878,66879,66880,66882],{},"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.",[5888,66881],{},[4201,66883],{"alt":66884,"src":66885},"Screenshot_2026-04-02_at_10.41.19_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_setup_quickbooks_desktop-2.png",[2357,66887,66888,66889,66891],{},"Click 'Ok' to grant access",[5888,66890],{},[4201,66892],{"alt":66893,"src":66894},"Screenshot_2026-04-02_at_10.43.58_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_setup_quickbooks_desktop-3.png",[2357,66896,66897,66898,66900],{},"Select 'Yes, whenever my Quickbooks company file is open' and 'Continue'",[5888,66899],{},[4201,66901],{"alt":66902,"src":66903},"aaplication_permission_%281%29.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_setup_quickbooks_desktop-4.png",[2357,66905,66906,66907,66909],{},"'Confirm'",[5888,66908],{},[4201,66910],{"alt":66911,"src":66912},"confirm_%281%29.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_setup_quickbooks_desktop-5.png",[2357,66914,66915,66916,66918],{},"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'.",[5888,66917],{},[4201,66919],{"alt":66920,"src":66921},"app_added_%281%29.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_setup_quickbooks_desktop-6.png",[4156,66923,66924],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":2433,"searchDepth":2434,"depth":2434,"links":66926},[],{"img":66928,"date":66929,"updated":66930,"tag":2457,"integrations":66931},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_setup_quickbooks_desktop-icon.png","2026-04-02T14:30:00.000Z","2026-08-23T14:53:23.562Z","quickbooksdesktop","\u002Fguides\u002Fhow_to_setup_quickbooks_desktop",{"title":66548,"description":66562},"guides\u002Fhow_to_setup_quickbooks_desktop","-0MHlJxEkMFkN2BmLvVqA5GkVSB_qCzcBQKN78dAIcw",{"id":66937,"title":66938,"body":66939,"description":67538,"extension":2452,"meta":67539,"navigation":2459,"path":67544,"seo":67545,"stem":67546,"__hash__":67547},"guides\u002Fguides\u002Fhow_to_setup_sage_100_with_unified.md","How to setup Sage 100 with Unified.to",{"type":12,"value":66940,"toc":67524},[66941,66944,66946,66951,66955,66966,66988,66994,66996,66998,67026,67028,67032,67057,67060,67062,67066,67069,67078,67084,67093,67096,67111,67119,67133,67135,67139,67170,67176,67178,67182,67185,67218,67224,67228,67237,67333,67335,67339,67355,67357,67361,67364,67423,67425,67429,67432,67460,67462,67464,67470,67476,67482,67487,67493,67495,67499,67522],[15,66942,66938],{"id":66943},"how-to-setup-sage-100-with-unifiedto",[19,66945],{},[22,66947,66948],{},[25,66949,66950],{},"July 17, 2026",[15,66952,66954],{"id":66953},"connecting-sage-100-how-to-get-your-api-credentials","Connecting Sage 100 — How to get your API credentials",[22,66956,66957,66958,66961,66962,66965],{},"This guide walks a Sage 100 administrator through everything needed to connect Sage 100 to Unified.\nSage 100 is on-prem software, so the connection is made through ",[31,66959,66960],{},"eBusiness Web Services",", a module\nthat runs on your own Sage 100 server. When you finish, you will have the ",[31,66963,66964],{},"four values"," Unified\nasks for:",[2510,66967,66968,66973,66978,66983],{},[2357,66969,66970],{},[31,66971,66972],{},"Web Services URL",[2357,66974,66975],{},[31,66976,66977],{},"Company Code",[2357,66979,66980],{},[31,66981,66982],{},"Web Services Username",[2357,66984,66985],{},[31,66986,66987],{},"Web Services Password",[22,66989,66990,66993],{},[31,66991,66992],{},"Who should do this:"," a Sage 100 system administrator (or your Sage business partner). Several steps happen on the Windows server that hosts Sage 100 and in Internet Information Services (IIS), so server access is required.",[19,66995],{},[55,66997,17893],{"id":17892},[2354,66999,67000,67003,67014,67019],{},[2357,67001,67002],{},"Sage 100 (Advanced or Premium; MAS 90\u002F200 lineage) installed and running.",[2357,67004,67005,67006,67009,67010,67013],{},"Administrator access to the ",[31,67007,67008],{},"Sage 100 server"," and to ",[31,67011,67012],{},"IIS"," on that server.",[2357,67015,8879,67016,67018],{},[31,67017,66960],{}," module — it ships with Sage 100 but is installed separately from\nthe Sage 100 installation program. If it is not installed yet, do that first (see Step 1).",[2357,67020,67021,67022,67025],{},"The server must be ",[31,67023,67024],{},"reachable from Unified over HTTPS",". Sage 100 typically lives inside a private\nnetwork, so you will usually publish the endpoint through a reverse proxy, VPN, or secure tunnel\nand give it a valid TLS certificate. Coordinate this with your IT\u002Fnetwork team.",[19,67027],{},[55,67029,67031],{"id":67030},"step-1-install-ebusiness-web-services-if-not-already-installed","Step 1 — Install eBusiness Web Services (if not already installed)",[2510,67033,67034,67041,67050],{},[2357,67035,67036,67037,67040],{},"Run the ",[31,67038,67039],{},"Sage 100 installation program"," on the server.",[2357,67042,67043,67044,67046,67047,97],{},"Choose to install ",[31,67045,66960],{}," and complete the wizard. It installs a web\napplication into IIS under a virtual directory named ",[36,67048,67049],{},"ebusinesswebservices",[2357,67051,67052,67053,67056],{},"After installation, open the ",[31,67054,67055],{},"Sage 100 eBusiness Web Services"," configuration utility on the\nserver (installed alongside the module). You will use it in later steps.",[22,67058,67059],{},"If eBusiness Web Services is already installed, skip to Step 2.",[19,67061],{},[55,67063,67065],{"id":67064},"step-2-confirm-the-endpoint-url-and-that-it-is-reachable","Step 2 — Confirm the endpoint URL and that it is reachable",[22,67067,67068],{},"The service exposes a single SOAP endpoint:",[2584,67070,67072],{"className":2649,"code":67071,"language":2651,"meta":2652,"style":2433},"https:\u002F\u002F\u003Cyour-server>\u002Febusinesswebservices\u002Fmasservice.svc\n",[36,67073,67074],{"__ignoreMap":2433},[414,67075,67076],{"class":2593,"line":2594},[414,67077,67071],{},[22,67079,67080,67081,2646],{},"Verify it works by opening this URL in a browser ",[31,67082,67083],{},"from a machine that can reach the server",[2584,67085,67087],{"className":2649,"code":67086,"language":2651,"meta":2652,"style":2433},"https:\u002F\u002F\u003Cyour-server>\u002Febusinesswebservices\u002Fmasservice.svc?wsdl\n",[36,67088,67089],{"__ignoreMap":2433},[414,67090,67091],{"class":2593,"line":2594},[414,67092,67086],{},[22,67094,67095],{},"You should see the WSDL (an XML document). If it loads, the endpoint is live.",[2354,67097,67098,67104],{},[2357,67099,65282,67100,67103],{},[36,67101,67102],{},"\u003Cyour-server>"," with the public host name that Unified will use to reach the server.",[2357,67105,67106,67107,67110],{},"Make sure the host name ",[31,67108,67109],{},"matches the TLS certificate"," on the site, and that the port (usually",[2510,67112,67114],{"start":67113},443,[2357,67115,67116,67117,66087],{},"is open to Unified. If the WSDL does not load, see ",[31,67118,5622],{},[22,67120,67121,67124,67125,67128,67129,67132],{},[31,67122,67123],{},"This full URL is the \"Web Services URL\" value"," you will enter in Unified. (Unified also accepts\njust the base ",[36,67126,67127],{},"https:\u002F\u002F\u003Cyour-server>\u002Febusinesswebservices"," and will add ",[36,67130,67131],{},"\u002Fmasservice.svc"," for you.)",[19,67134],{},[55,67136,67138],{"id":67137},"step-3-enable-the-company-for-web-services-and-note-the-company-code","Step 3 — Enable the company for web services and note the Company Code",[2510,67140,67141,67147,67150,67160],{},[2357,67142,67143,67144,97],{},"In Sage 100, open ",[31,67145,67146],{},"Library Master → Main → Company Maintenance",[2357,67148,67149],{},"Select the company you want to connect.",[2357,67151,67152,67153,67156,67157],{},"Ensure the company is ",[31,67154,67155],{},"enabled for web services"," (eBusiness Web Services must be turned on for\nthis company). If you are unsure where this setting is in your version, your Sage business\npartner can confirm it — the eBusiness Web Services guide requires the company to be enabled or\nevery call returns ",[25,67158,67159],{},"\"Web services are not enabled for this company.\"",[2357,67161,67162,67163,67165,67166,67169],{},"Note the ",[31,67164,66977],{}," — the short code (for example ",[36,67167,67168],{},"ABC",") that identifies this company.",[22,67171,67172,67175],{},[31,67173,67174],{},"This is the \"Company Code\" value"," you will enter in Unified.",[19,67177],{},[55,67179,67181],{"id":67180},"step-4-create-or-designate-a-web-services-user","Step 4 — Create (or designate) a web-services user",[22,67183,67184],{},"Unified authenticates as a Sage 100 user on every call, so create a dedicated user for the\nintegration.",[2510,67186,67187,67192,67202,67212],{},[2357,67188,67143,67189,97],{},[31,67190,67191],{},"Library Master → Main → User Maintenance",[2357,67193,67194,67195,67198,67199,97],{},"Create a new user (recommended: a dedicated integration account, e.g. ",[36,67196,67197],{},"WEBSVC",") or choose an\nexisting one, and set a strong ",[31,67200,67201],{},"password",[2357,67203,67204,67205,67207,67208,67211],{},"Ensure the user is ",[31,67206,67155],{},". If a user is not web-services-enabled, calls\nfail with ",[25,67209,67210],{},"\"Web services are not enabled for the system.\""," \u002F an authorization error.",[2357,67213,67214,67215],{},"Make sure the account is not locked. A locked account returns\n",[25,67216,67217],{},"\"This user account has been locked.\"",[22,67219,67220,67223],{},[31,67221,67222],{},"The user name and password are the \"Web Services Username\" and \"Web Services Password\""," you will\nenter in Unified.",[3629,67225,67227],{"id":67226},"give-the-user-the-right-permissions-roles","Give the user the right permissions (roles)",[22,67229,67230,67231,67233,67234,67236],{},"The web-services user must belong to a ",[31,67232,66007],{}," (Library Master → Main → Role Maintenance) that grants\nthe tasks the integration uses. For the Customer and Sales Order features Unified supports, enable\nthese tasks on the role's ",[31,67235,23826],{}," tab:",[155,67238,67239,67249],{},[158,67240,67241],{},[161,67242,67243,67246],{},[164,67244,67245],{},"Feature (Unified)",[164,67247,67248],{},"Sage 100 task to allow",[174,67250,67251,67262,67272,67282,67292,67301,67310,67319,67326],{},[161,67252,67253,67256],{},[179,67254,67255],{},"Read customers",[179,67257,67258,67259],{},"Accounts Receivable → Main → Customer Maintenance → ",[31,67260,67261],{},"View",[161,67263,67264,67267],{},[179,67265,67266],{},"Update customers",[179,67268,67258,67269],{},[31,67270,67271],{},"Modify",[161,67273,67274,67277],{},[179,67275,67276],{},"Delete customers",[179,67278,67258,67279],{},[31,67280,67281],{},"Remove",[161,67283,67284,67287],{},[179,67285,67286],{},"Read sales orders",[179,67288,67289,67290],{},"Sales Order → Main → Sales Order Entry → ",[31,67291,67261],{},[161,67293,67294,67297],{},[179,67295,67296],{},"Create sales orders",[179,67298,67289,67299],{},[31,67300,21975],{},[161,67302,67303,67306],{},[179,67304,67305],{},"Update sales orders",[179,67307,67289,67308],{},[31,67309,67271],{},[161,67311,67312,67315],{},[179,67313,67314],{},"Delete sales orders",[179,67316,67289,67317],{},[31,67318,67281],{},[161,67320,67321,67324],{},[179,67322,67323],{},"Grant only what you need. If a task is not allowed, the matching Unified operation returns an",[179,67325],{},[161,67327,67328,67331],{},[179,67329,67330],{},"authorization error.",[179,67332],{},[19,67334],{},[55,67336,67338],{"id":67337},"step-5-optional-expose-extra-fields-udfs","Step 5 — (Optional) Expose extra fields (UDFs)",[22,67340,67341,67342,67344,67345,67347,67348,45025,67351,67354],{},"By default, User-Defined Fields (UDFs) and Development Partner fields are ",[31,67343,8239],{}," returned. If you\nneed them, open the ",[31,67346,67055],{}," configuration utility → ",[31,67349,67350],{},"Advanced Settings",[31,67352,67353],{},"Additional Fields"," tab and add the fields you want to expose. This step is optional and only\nneeded for custom fields.",[19,67356],{},[55,67358,67360],{"id":67359},"step-6-enter-the-values-into-unified","Step 6 — Enter the values into Unified",[22,67362,67363],{},"In the Sage 100 connection form in Unified, provide:",[155,67365,67366,67374],{},[158,67367,67368],{},[161,67369,67370,67372],{},[164,67371,5244],{},[164,67373,5247],{},[174,67375,67376,67387,67398,67407,67416],{},[161,67377,67378,67382],{},[179,67379,67380],{},[31,67381,66972],{},[179,67383,67384],{},[36,67385,67386],{},"https:\u002F\u002F\u003Cyour-server>\u002Febusinesswebservices\u002Fmasservice.svc",[161,67388,67389,67393],{},[179,67390,67391],{},[31,67392,66977],{},[179,67394,67395,67396],{},"e.g. ",[36,67397,67168],{},[161,67399,67400,67404],{},[179,67401,67402],{},[31,67403,66982],{},[179,67405,67406],{},"the user from Step 4",[161,67408,67409,67413],{},[179,67410,67411],{},[31,67412,66987],{},[179,67414,67415],{},"that user's password",[161,67417,67418,67421],{},[179,67419,67420],{},"Save the connection. Unified will begin talking to your Sage 100 server directly over HTTPS.",[179,67422],{},[19,67424],{},[55,67426,67428],{"id":67427},"what-unified-can-and-cannot-do-with-sage-100","What Unified can and cannot do with Sage 100",[22,67430,67431],{},"eBusiness Web Services is a focused API. It is important to set expectations:",[2354,67433,67434,67446],{},[2357,67435,67436,67439,67440,67442,67443,97],{},[31,67437,67438],{},"Supported:"," looking up, updating, and removing ",[31,67441,33481],{},"; and creating, reading, updating,\nand removing ",[31,67444,67445],{},"Sales Orders",[2357,67447,67448,67451,67452,67455,67456,67459],{},[31,67449,67450],{},"Not available:"," the API has ",[31,67453,67454],{},"no \"list everything\" operation"," — records are fetched one at a\ntime by their key (customer number, or sales order number). There is also ",[31,67457,67458],{},"no API"," for invoices,\ninventory items, vendors, purchase orders, or general-ledger accounts, so those are not available\nthrough this connection.",[19,67461],{},[55,67463,5622],{"id":5621},[22,67465,67466,67469],{},[31,67467,67468],{},"The WSDL will not load (wrong host name).","\nIIS uses the server's full computer name in the WSDL's internal URLs. If that name does not match\nyour TLS certificate or is not reachable from outside, the WSDL fails to download. Fix the server's\nfull computer name, or set SSL host headers in IIS so the correct host name is used.",[22,67471,67472,67475],{},[31,67473,67474],{},"\"Web services are not enabled for the system \u002F this company.\"","\nThe system and\u002For the specific company is not enabled for web services (Steps 3–4). Enable them.",[22,67477,67478,67481],{},[31,67479,67480],{},"Authorization errors on specific operations.","\nThe web-services user's role is missing the required task permission (Step 4). Add it.",[22,67483,67484,67486],{},[31,67485,67217],{},"\nUnlock the account in User Maintenance.",[22,67488,67489,67492],{},[31,67490,67491],{},"Connectivity\u002Ftimeout errors.","\nConfirm the server is reachable from the internet on HTTPS and that any proxy\u002Ftunnel is up.",[19,67494],{},[55,67496,67498],{"id":67497},"references-official-sage-documentation","References (official Sage documentation)",[2354,67500,67501,67508,67515],{},[2357,67502,67503,67504],{},"Sage 100 Web Services Guide (2024, PDF): ",[41,67505,67506],{"href":67506,"rel":67507},"https:\u002F\u002Fdocs.sage.com\u002Fdocs\u002Fen\u002Fcustomer\u002F100erp\u002F2024\u002Fopen\u002FWebServices.pdf",[45],[2357,67509,67510,67511],{},"Programming with eBusiness Web Services: ",[41,67512,67513],{"href":67513,"rel":67514},"https:\u002F\u002Fhelp-sage100.na.sage.com\u002FWebServicesGuide\u002F2025\u002FContent\u002FWebServices\u002FProgramming.htm",[45],[2357,67516,67517,67518],{},"API reference (operations): ",[41,67519,67520],{"href":67520,"rel":67521},"https:\u002F\u002Fhelp-sage100.na.sage.com\u002FWebServicesGuide\u002F2025\u002FContent\u002FWebServices\u002FAPIs.htm",[45],[4156,67523,5736],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":67525},[67526,67527,67528,67529,67530,67533,67534,67535,67536,67537],{"id":17892,"depth":2434,"text":17893},{"id":67030,"depth":2434,"text":67031},{"id":67064,"depth":2434,"text":67065},{"id":67137,"depth":2434,"text":67138},{"id":67180,"depth":2434,"text":67181,"children":67531},[67532],{"id":67226,"depth":2613,"text":67227},{"id":67337,"depth":2434,"text":67338},{"id":67359,"depth":2434,"text":67360},{"id":67427,"depth":2434,"text":67428},{"id":5621,"depth":2434,"text":5622},{"id":67497,"depth":2434,"text":67498},"This guide walks a Sage 100 administrator through everything needed to connect Sage 100 to Unified.",{"img":67540,"date":67541,"updated":67542,"tag":2457,"integrations":67543},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_setup_sage_100_with_unified-icon.png","2026-07-17T02:00:00.000Z","2026-08-23T14:54:24.579Z","sage100","\u002Fguides\u002Fhow_to_setup_sage_100_with_unified",{"title":66938,"description":67538},"guides\u002Fhow_to_setup_sage_100_with_unified","s5_rlJ-PRhAOGsAGqbWaf6sO_bCHxeO7QQ6XlhHMboM",{"id":67549,"title":16751,"body":67550,"description":68520,"extension":2452,"meta":68521,"navigation":2459,"path":68524,"seo":68525,"stem":68526,"__hash__":68527},"guides\u002Fguides\u002Fhow_to_troubleshoot_unhealthy_connections.md",{"type":12,"value":67551,"toc":68499},[67552,67555,67557,67562,67565,67568,67570,67572,67579,67583,67586,67614,67623,67627,67630,67655,67658,67678,67681,67684,67697,67700,67736,67739,67743,67746,67750,67766,67770,67796,67802,67815,67819,67829,68010,68019,68026,68032,68036,68040,68043,68048,68056,68061,68081,68085,68091,68095,68122,68126,68148,68155,68178,68188,68237,68245,68258,68263,68273,68278,68281,68285,68290,68295,68300,68304,68307,68312,68317,68321,68336,68340,68343,68347,68355,68359,68370,68374,68377,68382,68390,68394,68397,68450,68463,68474,68476,68493,68496],[15,67553,16751],{"id":67554},"how-to-troubleshoot-unhealthy-connections",[19,67556],{},[22,67558,67559],{},[25,67560,67561],{},"September 25, 2024",[22,67563,67564],{},"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.",[22,67566,67567],{},"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.",[55,67569,4890],{"id":4889},[22,67571,64125],{},[2354,67573,67574],{},[2357,67575,67576],{},[41,67577,36554],{"href":16407,"rel":67578},[45],[55,67580,67582],{"id":67581},"connection-lifecycle","Connection lifecycle",[22,67584,67585],{},"Understanding the connection lifecycle can help in troubleshooting:",[2510,67587,67588,67591,67594,67597,67600],{},[2357,67589,67590],{},"Your customer selects an integration from your app to authorize.",[2357,67592,67593],{},"Your customer is directed to the authorization page for that integration.",[2357,67595,67596],{},"Unified.to determines what to display on the page (e.g. OAuth vs API token)",[2357,67598,67599],{},"Your customer grants access to their account.",[2357,67601,67602,67603],{},"Unified.to's server creates a connection in memory and attempts to test it immediately.\n",[2510,67604,67605,67608],{},[2357,67606,67607],{},"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).",[2357,67609,67610,67611],{},"If tests fail, the customer is redirected to the failure URL you specified with error details in the query parameters. See the below section: ",[31,67612,67613],{},"Handle errors during connection creation",[22,67615,67616,67617,67619,67620,66087],{},"When a connection later stops working, your customer can go through the same flow again to ",[31,67618,16657],{},". The connection keeps its ID. See ",[31,67621,67622],{},"Re-authorize an unhealthy connection",[55,67624,67626],{"id":67625},"understanding-connection-health","Understanding connection health",[22,67628,67629],{},"Connections in Unified.to have different health statuses based on recent credential and access checks:",[2354,67631,67632,67637,67643,67649],{},[2357,67633,67634,67636],{},[31,67635,7003],{},": A recent API call or OAuth token refresh succeeded.",[2357,67638,67639,67642],{},[31,67640,67641],{},"Unhealthy",": The integration rejected the connection's credentials or access, and it has not successfully completed a call or token refresh since.",[2357,67644,67645,67648],{},[31,67646,67647],{},"Unhealthy now",": A recent API call or token refresh showed that the connection's credentials or access are no longer accepted, after previous successful activity.",[2357,67650,67651,67654],{},[31,67652,67653],{},"New",": The connection has been created but has not yet been used.",[22,67656,67657],{},"Unified marks a connection unhealthy when a integration no longer accepts its credentials or access. This may mean you need to review permission scopes and re-authorize the connection.",[22,67659,67660,67661,319,67664,67667,67668,67670,67671,67673,67674,67677],{},"Other errors do not change connection health. This includes request-validation errors (",[36,67662,67663],{},"400",[36,67665,67666],{},"422","), missing records (",[36,67669,7885],{},"), rate limits (",[36,67672,61858],{},"), and temporary integration errors (",[36,67675,67676],{},"5xx","). A connection can represent multiple objects and endpoints, so these errors may be specific to a request rather than an indication that the connection needs to be re-authorized.",[55,67679,67613],{"id":67680},"handle-errors-during-connection-creation",[22,67682,67683],{},"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:",[2354,67685,67686,67691],{},[2357,67687,67688,67690],{},[36,67689,30966],{},": An error message",[2357,67692,67693,67696],{},[36,67694,67695],{},"log_id",": The ID of the API call log entry for this failure",[22,67698,67699],{},"To properly handle these errors in your application:",[2510,67701,67702,67726],{},[2357,67703,67704,67707],{},[31,67705,67706],{},"Review the API call log:",[2354,67708,67709,67717,67723],{},[2357,67710,21005,67711,67716],{},[41,67712,67714],{"href":16717,"rel":67713},[45],[31,67715,16719],{}," in your Unified.to dashboard",[2357,67718,67719,67720,67722],{},"Look up the log entry using the ",[36,67721,67695],{}," from the URL",[2357,67724,67725],{},"Examine the error message and status code to understand what went wrong",[2357,67727,67728,67731],{},[31,67729,67730],{},"Implement error handling in your app",[2510,67732,67733],{},[2357,67734,67735],{},"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",[22,67737,67738],{},"Review the section below, 'Troubleshooting by connection error codes', for a detailed walkthrough of the possible error codes and how to handle them.",[55,67740,67742],{"id":67741},"handle-errors-after-a-connection-is-created","Handle errors after a connection is created",[22,67744,67745],{},"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.",[3629,67747,67749],{"id":67748},"_1-check-the-connection-status","1. Check the connection status",[2510,67751,67752,67759],{},[2357,67753,16460,67754,16437],{},[41,67755,67757],{"href":28005,"rel":67756},[45],[31,67758,16241],{},[2357,67760,67761,67762,4149,67764,97],{},"Look for connections marked as ",[31,67763,67641],{},[31,67765,67647],{},[3629,67767,67769],{"id":67768},"_2-review-api-call-logs","2. Review API call logs",[2510,67771,67772,67779,67786,67793],{},[2357,67773,21005,67774,97],{},[41,67775,67777],{"href":16717,"rel":67776},[45],[31,67778,16719],{},[2357,67780,67781,67782,20056],{},"Filter the logs by the connection ID of the unhealthy connection (retention depends on your plan; see ",[41,67783,23020],{"href":67784,"rel":67785},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_long_are_logs_retained",[45],[2357,67787,67788,67789,34146,67791,97],{},"Look for recent credential or access errors, especially status codes ",[36,67790,16723],{},[36,67792,16726],{},[2357,67794,67795],{},"Click on an error log to view details about the failed API call.",[22,67797,67798,67799,67801],{},"You can also use the Unified API to retrieve a list of your connections and API call logs. Pass the ",[36,67800,85],{}," to the API calls endpoint to filter by that connection.",[22,67803,67804,34,67806,319,67811],{},[31,67805,28958],{},[41,67807,67810],{"href":67808,"rel":67809},"https:\u002F\u002Fdocs.unified.to\u002Funified\u002Fconnection\u002FList_all_connections",[45],"List all connections",[41,67812,67814],{"href":23145,"rel":67813},[45],"List all API calls",[3629,67816,67818],{"id":67817},"_3-re-authorize-an-unhealthy-connection","3. Re-authorize an unhealthy connection",[22,67820,67821,67822,67825,67826,67828],{},"Once you've fixed the cause (for example, restored your app's access or corrected scopes), ask your customer to re-authorize the ",[31,67823,67824],{},"existing"," connection rather than creating a new one. Re-authorizing keeps the same connection ID, so the connection IDs you've stored, your webhooks, and the connection's ",[36,67827,24431],{}," keep working.",[2510,67830,67831,67896,67989,67992],{},[2357,67832,67833,67834],{},"From your backend, create a re-authorization token with your API key:",[2584,67835,67837],{"className":16485,"code":67836,"language":16487,"meta":2433,"style":2433},"POST \u003Chttps:\u002F\u002Fapi.unified.to\u002Funified\u002Fconnection\u002F{CONNECTION_ID}\u002Freauth>\nAuthorization: bearer {YOUR_API_KEY}\n\n\u002F\u002F Response\n{ \"reauth_token\": \"...\", \"expires_at\": \"...\" }\n",[36,67838,67839,67853,67864,67868,67873],{"__ignoreMap":2433},[414,67840,67841,67843,67846,67848,67850],{"class":2593,"line":2594},[414,67842,45857],{"class":2607},[414,67844,67845],{"class":2698}," \u003C",[414,67847,43699],{"class":2597},[414,67849,2646],{"class":2705},[414,67851,67852],{"class":3527},"\u002F\u002Fapi.unified.to\u002Funified\u002Fconnection\u002F{CONNECTION_ID}\u002Freauth>\n",[414,67854,67855,67857,67860,67862],{"class":2593,"line":2434},[414,67856,22285],{"class":2597},[414,67858,67859],{"class":2705},": bearer {",[414,67861,55539],{"class":2607},[414,67863,3035],{"class":2705},[414,67865,67866],{"class":2593,"line":2613},[414,67867,2740],{"emptyLinePlaceholder":2459},[414,67869,67870],{"class":2593,"line":2625},[414,67871,67872],{"class":3527},"\u002F\u002F Response\n",[414,67874,67875,67878,67881,67883,67885,67887,67890,67892,67894],{"class":2593,"line":2677},[414,67876,67877],{"class":2705},"{ ",[414,67879,67880],{"class":2601},"\"reauth_token\"",[414,67882,7340],{"class":2705},[414,67884,40798],{"class":2601},[414,67886,319],{"class":2705},[414,67888,67889],{"class":2601},"\"expires_at\"",[414,67891,7340],{"class":2705},[414,67893,40798],{"class":2601},[414,67895,8986],{"class":2705},[2357,67897,67898,67899,741,67901,2646,67904],{},"Send your customer to the usual authorization URL, adding ",[36,67900,85],{},[36,67902,67903],{},"reauth_token",[2584,67905,67907],{"className":16485,"code":67906,"language":16487,"meta":2433,"style":2433},"\u003Chttps:\u002F\u002Fapi.unified.to\u002Funified\u002Fintegration\u002Fauth\u002F>\n{WORKSPACE_ID}\u002F{INTEGRATION e.g. hubspot}?redirect=true\n&connection_id={CONNECTION_ID}&reauth_token={REAUTH_TOKEN}\n&success_redirect={SUCCESS_URL}&failure_redirect={FAILURE_URL}\n",[36,67908,67909,67920,67947,67967],{"__ignoreMap":2433},[414,67910,67911,67913,67915,67917],{"class":2593,"line":2594},[414,67912,2988],{"class":2698},[414,67914,43699],{"class":2597},[414,67916,2646],{"class":2705},[414,67918,67919],{"class":3527},"\u002F\u002Fapi.unified.to\u002Funified\u002Fintegration\u002Fauth\u002F>\n",[414,67921,67922,67924,67926,67928,67930,67932,67935,67938,67940,67943,67945],{"class":2593,"line":2434},[414,67923,28091],{"class":2705},[414,67925,28049],{"class":2607},[414,67927,38264],{"class":2705},[414,67929,23303],{"class":2698},[414,67931,28091],{"class":2705},[414,67933,67934],{"class":2607},"INTEGRATION",[414,67936,67937],{"class":2705}," e.g. hubspot}",[414,67939,3610],{"class":2698},[414,67941,67942],{"class":2705},"redirect",[414,67944,2798],{"class":2698},[414,67946,10733],{"class":2607},[414,67948,67949,67952,67954,67956,67958,67960,67962,67964],{"class":2593,"line":2613},[414,67950,67951],{"class":2698},"&",[414,67953,85],{"class":2705},[414,67955,2798],{"class":2698},[414,67957,41865],{"class":2705},[414,67959,67951],{"class":2698},[414,67961,67903],{"class":2705},[414,67963,2798],{"class":2698},[414,67965,67966],{"class":2705},"{REAUTH_TOKEN}\n",[414,67968,67969,67971,67974,67976,67979,67981,67984,67986],{"class":2593,"line":2625},[414,67970,67951],{"class":2698},[414,67972,67973],{"class":2705},"success_redirect",[414,67975,2798],{"class":2698},[414,67977,67978],{"class":2705},"{SUCCESS_URL}",[414,67980,67951],{"class":2698},[414,67982,67983],{"class":2705},"failure_redirect",[414,67985,2798],{"class":2698},[414,67987,67988],{"class":2705},"{FAILURE_URL}\n",[2357,67990,67991],{},"Your customer signs in again. We test the new credentials the same way as when the connection was created.",[2357,67993,67994,67995,34,67997,67999,68000,56327,68003,68006,68007,97],{},"On success, the connection is updated in place and your customer is redirected to the success URL with the ",[31,67996,24574],{},[36,67998,5072],{},". You'll receive ",[36,68001,68002],{},"CONNECTION_UPDATED",[36,68004,68005],{},"CONNECTION_HEALTHY"," if the connection was unhealthy) instead of ",[36,68008,68009],{},"CONNECTION_CREATED",[22,68011,68012,68013,68015,68016,68018],{},"Re-authorizing without a ",[36,68014,16739],{}," parameter asks for the same permissions the connection already has, and keeps its permissions and categories unchanged. To change them (for example, to add a scope that was missing), include ",[36,68017,16739],{}," on the authorization URL with the full list you need.",[22,68020,68021,68022,68025],{},"The token is single-use and expires after 30 minutes, so create it right before you send your customer to the authorization URL. If the token is missing, expired, or already used, the failure URL receives ",[36,68023,68024],{},"error=authorization error: invalid or expired re-authorization link","; create a new token and try again.",[22,68027,68028],{},[41,68029,68031],{"href":16655,"rel":68030},[45],"Learn more about re-authorizing connections",[55,68033,68035],{"id":68034},"troubleshooting-by-connection-error-codes","Troubleshooting by connection error codes",[3629,68037,68039],{"id":68038},"authentication-401","Authentication (401)",[22,68041,68042],{},"A 401 error is likely indicative that the connection's credentials are no longer valid and the connection needs to be re-authorized.",[22,68044,68045],{},[31,68046,68047],{},"Possible causes:",[2354,68049,68050,68053],{},[2357,68051,68052],{},"Your app's access to the integration has been revoked.",[2357,68054,68055],{},"In non-OAuth flows that ask your customers to input an API key or other information, they may have input the wrong values.",[22,68057,68058],{},[31,68059,68060],{},"Solutions:",[2354,68062,68063,68066,68069,68078],{},[2357,68064,68065],{},"Double check that your app still has access to the integration's API.",[2357,68067,68068],{},"Ensure that your customers are entering the correct values during the authorization flow.",[2357,68070,68071,68072,68077],{},"After doing the above, ",[41,68073,68076],{"href":68074,"rel":68075},"https:\u002F\u002Fapp.notion.com\u002Fp\u002Funified-to\u002FHow-to-troubleshoot-unhealthy-connections-10c6207b838480ae8856d12205da8598#3-re-authorize-an-unhealthy-connection",[45],"re-authorize the connection"," to refresh the authentication.",[2357,68079,68080],{},"If the issue persists for specific endpoints, contact Unified.to support for assistance.",[3629,68082,68084],{"id":68083},"permissions-403","Permissions (403)",[22,68086,68087,68088,97],{},"A 403 error is likely indicative that one or more data objects is not working as expected, usually due to misconfigured ",[41,68089,16739],{"href":16407,"rel":68090},[45],[22,68092,68093],{},[31,68094,68047],{},[2354,68096,68097],{},[2357,68098,68099,68100,68103,68104],{},"Mismatch between the scopes that the integration expects and what ",[41,68101,123],{"href":121,"rel":68102},[45]," is requesting. This can happen when:\n",[2354,68105,68106,68109],{},[2357,68107,68108],{},"Scopes have been changed or disabled on the integration's end i.e. in your developer account, or",[2357,68110,68111,68112,68116,68117,97],{},"The proper scopes are not being requested when setting up the ",[41,68113,68115],{"href":36647,"rel":68114},[45],"Authorization embedded component"," or when generating an ",[41,68118,68121],{"href":68119,"rel":68120},"https:\u002F\u002Fdocs.unified.to\u002Funified\u002Fintegration\u002FAuthorize_or_re-authorize_a_connection",[45],"authorization URL",[22,68123,68124],{},[31,68125,68060],{},[2510,68127,68128,68145],{},[2357,68129,68130,68131],{},"Double check your scope settings in your developer account\n",[2510,68132,68133,68136,68139,68142],{},[2357,68134,68135],{},"Log into your developer account for the API you're trying to access.",[2357,68137,68138],{},"Navigate to the settings page where your app's authorization options are found.",[2357,68140,68141],{},"Ensure that all necessary scopes are enabled (see note below on different integrations and how they handle scopes)",[2357,68143,68144],{},"Make a note of the scopes that are enabled.",[2357,68146,68147],{},"Double check your scope settings on Unified.to",[22,68149,68150,68151,68154],{},"If you are using our embedded components to create connections, you'll need to ensure that the scopes on ",[41,68152,123],{"href":121,"rel":68153},[45]," match the ones you enabled in your developer account.",[2510,68156,68157,68162,68167,68170,68175],{},[2357,68158,16460,68159,16437],{},[41,68160,6862],{"href":22173,"rel":68161},[45],[2357,68163,16292,68164],{},[31,68165,68166],{},"Permission Scopes",[2357,68168,68169],{},"Select the scopes that match the scopes you enabled in the developer account (see note below on mappings)",[2357,68171,68172,68173,64555],{},"(Optional, only if you are using webhooks) Select the ",[31,68174,29627],{},[2357,68176,68177],{},"If the issue still persists, contact Unified.to support for assistance",[22,68179,68180,68181,68183,68184,68187],{},"If you are generating an auth URL to redirect your customers to our auth flow, include ",[36,68182,16739],{}," as a query parameter and list all the Unified scopes you need. Behind the scenes, ",[41,68185,123],{"href":121,"rel":68186},[45]," will map the Unified scopes you pass to the integration's scopes (see note below on mappings). For example:",[2584,68189,68191],{"className":16485,"code":68190,"language":16487,"meta":2433,"style":2433},"https:\u002F\u002Fapi.unified.to\u002Funified\u002Fintegration\u002Fauth\u002F\n{WORKSPACE_ID}\u002F{INTEGRATION e.g. hubspot}?redirect=true\n&scopes=webhook,{YOUR_SCOPES e.g. crm_deal_read, crm_event_read}\n",[36,68192,68193,68202,68226],{"__ignoreMap":2433},[414,68194,68195,68197,68199],{"class":2593,"line":2594},[414,68196,43699],{"class":2597},[414,68198,2646],{"class":2705},[414,68200,68201],{"class":3527},"\u002F\u002Fapi.unified.to\u002Funified\u002Fintegration\u002Fauth\u002F\n",[414,68203,68204,68206,68208,68210,68212,68214,68216,68218,68220,68222,68224],{"class":2593,"line":2434},[414,68205,28091],{"class":2705},[414,68207,28049],{"class":2607},[414,68209,38264],{"class":2705},[414,68211,23303],{"class":2698},[414,68213,28091],{"class":2705},[414,68215,67934],{"class":2607},[414,68217,67937],{"class":2705},[414,68219,3610],{"class":2698},[414,68221,67942],{"class":2705},[414,68223,2798],{"class":2698},[414,68225,10733],{"class":2607},[414,68227,68228,68230,68232,68234],{"class":2593,"line":2613},[414,68229,67951],{"class":2698},[414,68231,16739],{"class":2705},[414,68233,2798],{"class":2698},[414,68235,68236],{"class":2705},"webhook,{YOUR_SCOPES e.g. crm_deal_read, crm_event_read}\n",[22,68238,68239,34,68241],{},[31,68240,28958],{},[41,68242,68244],{"href":68119,"rel":68243},[45],"Create an authorization URL",[22,68246,68247,68248,68251,68252,68254,68255,68257],{},"After addressing these issues, ",[41,68249,68076],{"href":68074,"rel":68250},[45]," and include the full list of ",[36,68253,16739],{}," you need on the authorization URL. Re-authorizing without ",[36,68256,16739],{}," keeps the connection's current permissions, so a missing scope would stay missing. Re-create the webhook if needed, then try again.",[22,68259,68260],{},[31,68261,68262],{},"A note on mappings:",[22,68264,68265,68266,54407,68269,68272],{},"A mapping of the Unified scopes to the integration's scopes can be found on the integration details page under the ",[31,68267,68268],{},"OAuth 2 Credentials tab",[41,68270,28103],{"href":36611,"rel":68271},[45]," are the mappings for HubSpot scopes.",[22,68274,68275],{},[31,68276,68277],{},"A note on integration-specific scopes:",[22,68279,68280],{},"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.",[3629,68282,68284],{"id":68283},"not-found-404","Not found (404)",[22,68286,68287,68289],{},[31,68288,22779],{}," 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.",[22,68291,68292],{},[31,68293,68294],{},"Solution:",[2354,68296,68297],{},[2357,68298,68299],{},"Verify that the input data (e.g., email, company name) is correct.",[3629,68301,68303],{"id":68302},"rate-limiting-429","Rate limiting (429)",[22,68305,68306],{},"429 errors do not change connection health because they indicate the connection is active but temporarily limited.",[22,68308,68309],{},[31,68310,68311],{},"Possible cause:",[2354,68313,68314],{},[2357,68315,68316],{},"Exceeding the API rate limits of the third-party service",[22,68318,68319],{},[31,68320,68060],{},[2354,68322,68323,68330,68333],{},[2357,68324,68325,68326,68329],{},"(Recommended) Use ",[41,68327,45827],{"href":5731,"rel":68328},[45]," to read data and Unified.to will take care of rate limiting for you.",[2357,68331,68332],{},"Implement request throttling in your application.",[2357,68334,68335],{},"Contact the third-party service to request increased rate limits.",[3629,68337,68339],{"id":68338},"server-errors-500-series-eg-502-503-etc","Server errors (500 series e.g. 502, 503, etc)",[22,68341,68342],{},"500 series errors do not change connection health because 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.",[22,68344,68345],{},[31,68346,68047],{},[2354,68348,68349,68352],{},[2357,68350,68351],{},"Temporary issues with the third-party service",[2357,68353,68354],{},"Bugs",[22,68356,68357],{},[31,68358,68060],{},[2354,68360,68361,68364,68367],{},[2357,68362,68363],{},"Check the status page of the third-party service for any ongoing issues.",[2357,68365,68366],{},"Retry the request after a short delay.",[2357,68368,68369],{},"If the issue still persists or if you've discovered a bug, contact Unified.to support for assistance. Thank you!",[3629,68371,68373],{"id":68372},"not-implemented-501","Not implemented (501)",[22,68375,68376],{},"501 errors do not change connection health. They indicate that a specific functionality is not implemented for the integration, not that the connection is broken.",[22,68378,68379],{},[31,68380,68381],{},"Suggestion actions:",[2354,68383,68384,68387],{},[2357,68385,68386],{},"Check the Unified.to documentation for the specific integration to understand its supported features.",[2357,68388,68389],{},"If you believe the functionality should be supported, contact Unified.to support and we'd be happy to look into it.",[55,68391,68393],{"id":68392},"monitor-and-receive-updates-about-your-connections","Monitor and receive updates about your connections",[22,68395,68396],{},"To stay informed about changes to your connections:",[2510,68398,68399,68410,68416,68447],{},[2357,68400,16270,68401,34,68404,97],{},[31,68402,68403],{},"Settings >",[41,68405,68407],{"href":16643,"rel":68406},[45],[31,68408,68409],{},"Workspace",[2357,68411,20156,68412,68415],{},[31,68413,68414],{},"Notifications webhook URL",", enter the URL where you want to receive notifications (this should be an endpoint on your server that can receive POST requests).",[2357,68417,20156,68418,68421,68422],{},[31,68419,68420],{},"Notifications webhook events",", select events related to connections:\n",[2354,68423,68424,68428,68433,68437,68442],{},[2357,68425,68426],{},[36,68427,68005],{},[2357,68429,68430],{},[36,68431,68432],{},"CONNECTION_UNHEALTHY",[2357,68434,68435],{},[36,68436,68009],{},[2357,68438,68439,68441],{},[36,68440,68002],{},"  (also sent when a connection is re-authorized)",[2357,68443,68444],{},[36,68445,68446],{},"CONNECTION_DELETED",[2357,68448,68449],{},"Implement a handler for these events in your app to monitor connection health proactively.",[22,68451,68452,68453,68455,68456,68459,68460,68462],{},"Unified sends ",[36,68454,68432],{}," when an integration rejects a connection's credentials or access. For API requests, the event description includes the integration's HTTP status when available, such as ",[36,68457,68458],{},"HTTP 401",". If the issue continues, notifications are rate-limited to at most one per connection per hour. Unified sends ",[36,68461,68005],{}," when a previously unhealthy connection successfully completes an API call or OAuth token refresh, or is re-authorized.",[22,68464,68465,68466,68470,68471,68473],{},"Treat these events as signals to review credentials and permission scopes, then ",[41,68467,68076],{"href":68468,"rel":68469},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_troubleshoot_unhealthy_connections#3-re-authorize-an-unhealthy-connection",[45]," if needed. For example, when you receive ",[36,68472,68432],{},", show the affected customer a \"Reconnect\" button in your app that creates a re-authorization token and sends them through the authorization URL. Your handler should be idempotent because an unhealthy connection can continue to generate periodic notifications until it is fixed.",[55,68475,16755],{"id":16754},[2354,68477,68478,68485],{},[2357,68479,4359,68480,68484],{},[41,68481,4364],{"href":68482,"rel":68483},"https:\u002F\u002Fdiscord.gg\u002F2nsAPmbx",[45]," for support and updates.",[2357,68486,68487,68488,68492],{},"If issues persist, ",[41,68489,68491],{"href":20543,"rel":68490},[45],"contact our support team"," for further assistance.",[22,68494,68495],{},"Remember, connection health is dynamic and can change after an authentication failure or a subsequent successful API call or OAuth token refresh. Not all errors indicate a broken connection.",[4156,68497,68498],{},"html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":2433,"searchDepth":2434,"depth":2434,"links":68500},[68501,68502,68503,68504,68505,68510,68518,68519],{"id":4889,"depth":2434,"text":4890},{"id":67581,"depth":2434,"text":67582},{"id":67625,"depth":2434,"text":67626},{"id":67680,"depth":2434,"text":67613},{"id":67741,"depth":2434,"text":67742,"children":68506},[68507,68508,68509],{"id":67748,"depth":2613,"text":67749},{"id":67768,"depth":2613,"text":67769},{"id":67817,"depth":2613,"text":67818},{"id":68034,"depth":2434,"text":68035,"children":68511},[68512,68513,68514,68515,68516,68517],{"id":68038,"depth":2613,"text":68039},{"id":68083,"depth":2613,"text":68084},{"id":68283,"depth":2613,"text":68284},{"id":68302,"depth":2613,"text":68303},{"id":68338,"depth":2613,"text":68339},{"id":68372,"depth":2613,"text":68373},{"id":68392,"depth":2434,"text":68393},{"id":16754,"depth":2434,"text":16755},"Connections allow your application to securely access data from third-party API platforms. They serve as links between your Unified.to workspace, your...",{"img":7949,"date":68522,"updated":68523,"tag":2457,"integrations":3},"2024-09-25T00:00:00.000Z","2026-10-20T14:27:28.473Z","\u002Fguides\u002Fhow_to_troubleshoot_unhealthy_connections",{"title":16751,"description":68520},"guides\u002Fhow_to_troubleshoot_unhealthy_connections","qXLqNEIeaSIkTp-_s0z8Lx-xSHJ0toRLNr5k_4vmudM",{"id":68529,"title":45818,"body":68530,"description":69005,"extension":2452,"meta":69006,"navigation":2459,"path":69009,"seo":69010,"stem":69011,"__hash__":69012},"guides\u002Fguides\u002Fhow_to_troubleshoot_unhealthy_webhooks.md",{"type":12,"value":68531,"toc":68984},[68532,68535,68537,68541,68547,68549,68551,68566,68570,68573,68577,68595,68597,68633,68636,68647,68651,68655,68667,68671,68674,68677,68685,68689,68696,68846,68850,68853,68857,68860,68863,68867,68874,68877,68881,68884,68886,68890,68893,68900,68903,68913,68917,68920,68924,68930,68935,68943,68946,68951,68954,68959,68962,68964,68981],[15,68533,45818],{"id":68534},"how-to-troubleshoot-unhealthy-webhooks",[19,68536],{},[22,68538,68539],{},[25,68540,45797],{},[22,68542,68543,68544,97],{},"Webhooks deliver events 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 ",[41,68545,123],{"href":121,"rel":68546},[45],[55,68548,4890],{"id":4889},[22,68550,64125],{},[2354,68552,68553,68561],{},[2357,68554,68555,741,68558],{},[41,68556,46006],{"href":5717,"rel":68557},[45],[41,68559,22114],{"href":22112,"rel":68560},[45],[2357,68562,68563],{},[41,68564,36554],{"href":16407,"rel":68565},[45],[55,68567,68569],{"id":68568},"diagnose-the-webhook","Diagnose the webhook",[22,68571,68572],{},"The first place to look for debugging information is in the API call logs.",[3629,68574,68576],{"id":68575},"_1-check-the-webhook-status","1. Check the webhook status",[2510,68578,68579,68585,68590],{},[2357,68580,20923,68581,97],{},[41,68582,68584],{"href":4146,"rel":68583},[45],"Unified.to account",[2357,68586,16270,68587,97],{},[41,68588,46006],{"href":28005,"rel":68589},[45],[2357,68591,68592,68593,97],{},"Make note of the unhealthy webhook and its ",[31,68594,2915],{},[3629,68596,67769],{"id":67768},[2510,68598,68599,68606,68612,68618],{},[2357,68600,21005,68601,97],{},[41,68602,68604],{"href":16717,"rel":68603},[45],[31,68605,16719],{},[2357,68607,68608,68609,20056],{},"Filter by the connection ID of the webhook in question. You should see a list of API calls attempted by the webhook (retention depends on your plan; see ",[41,68610,23020],{"href":67784,"rel":68611},[45],[2357,68613,68614,68615,68617],{},"Click on the latest log entry that threw an error - the ",[31,68616,20261],{}," column will display an error code.",[2357,68619,68620,68621,68623,68624,68626,68627,68629],{},"Details about the API call will be shown. The ",[31,68622,8469],{}," field will detail the reason the webhook failed and the ",[31,68625,21119],{}," field will show the specific error code itself. For example:",[5888,68628],{},[4201,68630],{"alt":68631,"src":68632},"Screenshot_2024-09-05_at_1.33.44_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_troubleshoot_unhealthy_webhooks-0.png",[22,68634,68635],{},"You can also use the Unified API to retrieve a list of your webhooks and API call logs.",[22,68637,68638,34,68640,319,68644],{},[31,68639,28958],{},[41,68641,68643],{"href":46120,"rel":68642},[45],"List all webhooks",[41,68645,67814],{"href":23145,"rel":68646},[45],[55,68648,68650],{"id":68649},"troubleshooting-webhook-error-codes","Troubleshooting webhook error codes",[3629,68652,68654],{"id":68653},"bad-request-400-errors","Bad request (400) errors",[22,68656,68657,68658,68662,68663,68666],{},"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 ",[41,68659,68661],{"href":20543,"rel":68660},[45],"reach out to us"," or let us know in our ",[41,68664,21800],{"href":68482,"rel":68665},[45]," server. Thank you!",[3629,68668,68670],{"id":68669},"authentication-401-and-permission-403-errors","Authentication (401) and permission (403) errors",[22,68672,68673],{},"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.",[22,68675,68676],{},"A 403 error is often indicative of scope mismatches with the API provider, with Unified.to, or both.",[22,68678,68679,68680],{},"Both of these errors are indicative of an issue with the connection itself, rather than the webhook. Please see: ",[41,68681,68684],{"href":68682,"rel":68683},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_troubleshoot_unhealthy_connections#troubleshooting-the-error-codes",[45],"How to troubleshoot unhealthy connections ",[55,68686,68688],{"id":68687},"subscribe-to-the-notifications-webhook-to-be-alerted-when-your-webhooks-fail","Subscribe to the notifications webhook to be alerted when your webhooks fail",[22,68690,68691,68692,68695],{},"To learn about any webhook errors as soon as they occur, we recommend that you subscribe to our ",[31,68693,68694],{},"Notifications webhook"," to be notified as soon as a webhook's status changes.",[2510,68697,68698,68709,68835,68843],{},[2357,68699,16270,68700,45999,68702,68707],{},[31,68701,36643],{},[41,68703,68705],{"href":16643,"rel":68704},[45],[31,68706,68409],{},[31,68708,97],{},[2357,68710,20156,68711,68713,68714],{},[31,68712,68414],{},", enter the URL of the endpoint where you would like to receive notifications.",[2510,68715,68716],{},[2357,68717,68718,68719,68815,68817,68820,68821,27087,68823,68826,68827,68829,68830,68834],{},"The payload that will be sent to this endpoint contains:",[2584,68720,68722],{"className":16485,"code":68721,"language":16487,"meta":2433,"style":2433},"id: string \u002F\u002F the id of the object or the integration's type\nnonce: number \u002F\u002F random number\nsig: string \u002F\u002F @deprecated; use sig256. base64(hmac-sha1(id + nonce + event, workspace.secret))\nsig256: string \u002F\u002F v1 (existing validators): base64(hmac-sha256(id + nonce + event, workspace.secret))\ndata: object \u002F\u002F { id, event, description?, environment? }\nsig256v2: string \u002F\u002F v2: HMAC-SHA256(workspace.secret, JSON.stringify(data) + String(nonce)) — same formula as object \u002F data webhooks\nevent: enum \u002F\u002F the event that was triggered\ndescription?: string \u002F\u002F optional longer description\nenvironment?: string \u002F\u002F included for connection, webhook, or integration notifications\n",[36,68723,68724,68734,68744,68753,68762,68772,68782,68792,68804],{"__ignoreMap":2433},[414,68725,68726,68728,68731],{"class":2593,"line":2594},[414,68727,5072],{"class":2597},[414,68729,68730],{"class":2705},": string ",[414,68732,68733],{"class":3527},"\u002F\u002F the id of the object or the integration's type\n",[414,68735,68736,68738,68741],{"class":2593,"line":2434},[414,68737,22213],{"class":2597},[414,68739,68740],{"class":2705},": number ",[414,68742,68743],{"class":3527},"\u002F\u002F random number\n",[414,68745,68746,68748,68750],{"class":2593,"line":2613},[414,68747,22218],{"class":2597},[414,68749,68730],{"class":2705},[414,68751,68752],{"class":3527},"\u002F\u002F @deprecated; use sig256. base64(hmac-sha1(id + nonce + event, workspace.secret))\n",[414,68754,68755,68757,68759],{"class":2593,"line":2625},[414,68756,45956],{"class":2597},[414,68758,68730],{"class":2705},[414,68760,68761],{"class":3527},"\u002F\u002F v1 (existing validators): base64(hmac-sha256(id + nonce + event, workspace.secret))\n",[414,68763,68764,68766,68769],{"class":2593,"line":2677},[414,68765,5590],{"class":2597},[414,68767,68768],{"class":2705},": object ",[414,68770,68771],{"class":3527},"\u002F\u002F { id, event, description?, environment? }\n",[414,68773,68774,68777,68779],{"class":2593,"line":2751},[414,68775,68776],{"class":2597},"sig256v2",[414,68778,68730],{"class":2705},[414,68780,68781],{"class":3527},"\u002F\u002F v2: HMAC-SHA256(workspace.secret, JSON.stringify(data) + String(nonce)) — same formula as object \u002F data webhooks\n",[414,68783,68784,68786,68789],{"class":2593,"line":2760},[414,68785,5060],{"class":2597},[414,68787,68788],{"class":2705},": enum ",[414,68790,68791],{"class":3527},"\u002F\u002F the event that was triggered\n",[414,68793,68794,68796,68798,68801],{"class":2593,"line":2768},[414,68795,27096],{"class":2705},[414,68797,16892],{"class":2698},[414,68799,68800],{"class":2705}," string ",[414,68802,68803],{"class":3527},"\u002F\u002F optional longer description\n",[414,68805,68806,68808,68810,68812],{"class":2593,"line":2776},[414,68807,56512],{"class":2705},[414,68809,16892],{"class":2698},[414,68811,68800],{"class":2705},[414,68813,68814],{"class":3527},"\u002F\u002F included for connection, webhook, or integration notifications\n",[5888,68816],{},[31,68818,68819],{},"Signature validation:"," Existing integrations can keep verifying ",[36,68822,45956],{},[36,68824,68825],{},"id + nonce + event","; that formula is unchanged. To use the same check as object \u002F data webhooks, verify ",[36,68828,68776],{}," as HMAC-SHA256(workspace.secret, JSON.stringify(data) + String(nonce)). See ",[41,68831,68833],{"href":5717,"rel":68832},[45],"Best practices for signature validation"," in the Webhooks reference.",[2357,68836,20156,68837,68839,68840],{},[31,68838,68420],{},", select the events you want to be alerted to e.g. ",[36,68841,68842],{},"WEBHOOK_UNHEALTHY",[2357,68844,68845],{},"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.",[55,68847,68849],{"id":68848},"understanding-why-webhooks-fail","Understanding why webhooks fail",[22,68851,68852],{},"This section will go over why webhooks fail to provide a deeper understanding of how our webhooks work.",[3629,68854,68856],{"id":68855},"failed-to-subscribe","Failed to subscribe",[22,68858,68859],{},"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.",[22,68861,68862],{},"Note: This only applies to native webhooks.",[3629,68864,68866],{"id":68865},"failed-to-refresh-token","Failed to refresh token",[22,68868,68869,68870,68873],{},"Before checking for changes, subscribing, or processing a native event, ",[41,68871,123],{"href":121,"rel":68872},[45]," refreshes the connection's auth token when needed. If the refresh fails after retries, the webhook is marked unhealthy so no calls run against an expired token. This applies to both virtual and native webhooks. In this case, it is likely an error with the connection itself.",[22,68875,68876],{},"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.",[3629,68878,68880],{"id":68879},"failed-to-read","Failed to read",[22,68882,68883],{},"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.",[22,68885,68876],{},[3629,68887,68889],{"id":68888},"failed-to-dispatch-data","Failed to dispatch data",[22,68891,68892],{},"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.",[22,68894,68895,68896,68899],{},"Make sure your webhook URL is configured correctly when creating the webhook. Respond with a ",[36,68897,68898],{},"2xx"," status once your endpoint has accepted the data, and do heavy processing afterwards. Otherwise, retry behaviour depends on the webhook type. For virtual webhooks, we keep trying to POST to your server for up to approximately 2 weeks before marking the webhook as unhealthy. For native webhooks, delivery is attempted 3 times immediately; if those fail, the webhook is marked unhealthy and the event isn't redelivered unless the integration sends it again. Keep your endpoint reachable during deploys, or use a virtual webhook where longer recovery matters.",[22,68901,68902],{},"After checking the above, recreate the webhook and try again.",[22,68904,68905,68906,68909,68910,68912],{},"Monitoring webhook health and recreating unhealthy webhooks is your responsibility. ",[41,68907,123],{"href":121,"rel":68908},[45]," does not resume an unhealthy webhook on its own. Subscribe to the notifications webhook (above) for ",[36,68911,68842],{}," so you find out when it happens.",[3629,68914,68916],{"id":68915},"failed-to-process-data","Failed to process data",[22,68918,68919],{},"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.",[3629,68921,68923],{"id":68922},"a-note-on-our-webhook-retry-mechanism","A note on our webhook retry mechanism",[22,68925,68926,68929],{},[41,68927,123],{"href":121,"rel":68928},[45]," retries failed webhook deliveries automatically. Here's how it works.",[22,68931,68932],{},[31,68933,68934],{},"When your webhook endpoint is unavailable",[2510,68936,68937,68940],{},[2357,68938,68939],{},"If your endpoint is unavailable or returns an error, we'll retry up to 3 times immediately, with a 1-second delay between attempts.",[2357,68941,68942],{},"If the error persists, we back off progressively for up to about 2 weeks, maximizing the chance of successful delivery.",[22,68944,68945],{},"The backoff schedule applies to virtual webhooks. Each delayed retry re-reads the page from the API provider rather than resending a stored payload, and the read position advances only after a successful delivery. If retries are exhausted, the webhook is marked unhealthy and scheduling stops. Native webhooks stop after the 3 immediate retries and are marked unhealthy.",[22,68947,68948],{},[31,68949,68950],{},"When the API provider is unavailable",[22,68952,68953],{},"If we can't reach the API provider or have hit their rate limits, we will back off progressively and retry (outlined above). On virtual webhooks, we honour the provider's retry-after hints when it sends them.",[22,68955,68956],{},[31,68957,68958],{},"Billing for failed and empty runs",[22,68960,68961],{},"You aren't billed for failed reads from the API provider, failed dispatches to your webhook endpoint, or virtual webhook polling runs that find no new data.",[55,68963,37023],{"id":37022},[2354,68965,68966,68971,68976],{},[2357,68967,68968],{},[41,68969,5733],{"href":5731,"rel":68970},[45],[2357,68972,68973],{},[41,68974,16751],{"href":16749,"rel":68975},[45],[2357,68977,68978],{},[41,68979,46062],{"href":22112,"rel":68980},[45],[4156,68982,68983],{},"html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":2433,"searchDepth":2434,"depth":2434,"links":68985},[68986,68987,68991,68995,68996,69004],{"id":4889,"depth":2434,"text":4890},{"id":68568,"depth":2434,"text":68569,"children":68988},[68989,68990],{"id":68575,"depth":2613,"text":68576},{"id":67768,"depth":2613,"text":67769},{"id":68649,"depth":2434,"text":68650,"children":68992},[68993,68994],{"id":68653,"depth":2613,"text":68654},{"id":68669,"depth":2613,"text":68670},{"id":68687,"depth":2434,"text":68688},{"id":68848,"depth":2434,"text":68849,"children":68997},[68998,68999,69000,69001,69002,69003],{"id":68855,"depth":2613,"text":68856},{"id":68865,"depth":2613,"text":68866},{"id":68879,"depth":2613,"text":68880},{"id":68888,"depth":2613,"text":68889},{"id":68915,"depth":2613,"text":68916},{"id":68922,"depth":2613,"text":68923},{"id":37022,"depth":2434,"text":37023},"Webhooks deliver events about changes to the data you care about. When something goes wrong, however, we will mark those webhooks as unhealthy. This guide...",{"img":69007,"date":46555,"updated":69008,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_troubleshoot_unhealthy_webhooks-icon.png","2026-10-20T14:27:25.481Z","\u002Fguides\u002Fhow_to_troubleshoot_unhealthy_webhooks",{"title":45818,"description":69005},"guides\u002Fhow_to_troubleshoot_unhealthy_webhooks","_1XllLnu_DezfA88VtYy-66R7DuA03GavNpu89FuvN0",{"id":69014,"title":69015,"body":69016,"description":69287,"extension":2452,"meta":69288,"navigation":2459,"path":69292,"seo":69293,"stem":69294,"__hash__":69295},"guides\u002Fguides\u002Fhow_to_use_scim_with_the_unified_api.md","How to use SCIM with the Unified API",{"type":12,"value":69017,"toc":69276},[69018,69021,69023,69028,69034,69037,69039,69047,69055,69061,69100,69123,69126,69142,69145,69153,69156,69176,69179,69183,69200,69209,69213,69221,69225,69232,69243,69245,69274],[15,69019,69015],{"id":69020},"how-to-use-scim-with-the-unified-api",[19,69022],{},[22,69024,69025],{},[25,69026,69027],{},"October 3, 2024",[22,69029,69030,69033],{},[41,69031,123],{"href":121,"rel":69032},[45],"'s SCIM API gives you SCIM 2.0 Users and Groups endpoints over its HR & Directory integrations, so a SCIM client can list, create, update and delete users in a customer's HR system or directory, including systems with no SCIM support of their own. This guide is for developers who already use SCIM (System for Cross-domain Identity Management, the RFC 7643 and RFC 7644 standard for user and group provisioning).",[22,69035,69036],{},"If your product already provisions users over SCIM, you can reuse that client across more systems.",[55,69038,4890],{"id":4889},[22,69040,69041,69042,97],{},"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 ",[41,69043,69046],{"href":69044,"rel":69045},"https:\u002F\u002Fscim.cloud\u002F",[45],"official specification",[55,69048,69050,69051,69054],{"id":69049},"what-endpoints-does-unifiedtos-scim-api-provide","What endpoints does ",[41,69052,123],{"href":121,"rel":69053},[45],"'s SCIM API provide?",[22,69056,69057,69060],{},[41,69058,123],{"href":121,"rel":69059},[45],"'s SCIM endpoints are based on RFC 7644, and each is scoped to one connection:",[2354,69062,69063,69091],{},[2357,69064,69065,34,69068,69071,69072,69075,69076,69079,69080,4149,69083,69086,69087,69090],{},[31,69066,69067],{},"Users:",[36,69069,69070],{},"POST \u002Fscim\u002F{connection_id}\u002Fusers"," (create), ",[36,69073,69074],{},"GET \u002Fscim\u002F{connection_id}\u002Fusers"," (list), ",[36,69077,69078],{},"GET \u002Fscim\u002F{connection_id}\u002Fusers\u002F{id}"," (get), ",[36,69081,69082],{},"PUT",[36,69084,69085],{},"PATCH \u002Fscim\u002F{connection_id}\u002Fusers\u002F{id}"," (update), ",[36,69088,69089],{},"DELETE \u002Fscim\u002F{connection_id}\u002Fusers\u002F{id}"," (delete)",[2357,69092,69093,69096,69097],{},[31,69094,69095],{},"Groups:"," the same operations on ",[36,69098,69099],{},"\u002Fscim\u002F{connection_id}\u002Fgroups",[22,69101,69102,69103,319,69105,741,69108,69111,69112,741,69115,69118,69119,69122],{},"List requests accept ",[36,69104,25051],{},[36,69106,69107],{},"startIndex",[36,69109,69110],{},"count"," for paging, and ",[36,69113,69114],{},"sortBy",[36,69116,69117],{},"sortOrder",". Responses use the SCIM schemas; send ",[36,69120,69121],{},"Accept: application\u002Fscim+json"," for the SCIM media type.",[22,69124,69125],{},"View the API references for:",[2354,69127,69128,69135],{},[2357,69129,69130],{},[41,69131,69134],{"href":69132,"rel":69133},"https:\u002F\u002Fdocs.unified.to\u002Fscim\u002Fusers\u002Fmodel",[45],"Users",[2357,69136,69137],{},[41,69138,69141],{"href":69139,"rel":69140},"https:\u002F\u002Fdocs.unified.to\u002Fscim\u002Fgroups\u002Fmodel",[45],"Groups",[22,69143,69144],{},"An existing SCIM client can call these endpoints with the connection ID in the path. Which operations work depends on the integration (see below).",[55,69146,69148,69149,69152],{"id":69147},"which-scim-extensions-does-unifiedto-support","Which SCIM extensions does ",[41,69150,123],{"href":121,"rel":69151},[45]," support?",[22,69154,69155],{},"In addition to the core SCIM schema, Unified.to supports the following extensions:",[2584,69157,69159],{"className":2649,"code":69158,"language":2651,"meta":2652,"style":2433},"'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",[36,69160,69161,69166,69171],{"__ignoreMap":2433},[414,69162,69163],{"class":2593,"line":2594},[414,69164,69165],{},"'urn:ietf:params:scim:schemas:extension:enterprise:2.0:User'\n",[414,69167,69168],{"class":2593,"line":2434},[414,69169,69170],{},"'urn:ietf:params:scim:schemas:extension:lattice:attributes:1.0:User'\n",[414,69172,69173],{"class":2593,"line":2613},[414,69174,69175],{},"'urn:ietf:params:scim:schemas:extension:peakon:2.0:User'\n",[22,69177,69178],{},"The enterprise extension carries employee number, cost centre, organization, division, department and manager; the Lattice and Peakon extensions carry the attributes those tools expect.",[55,69180,69182],{"id":69181},"which-integrations-work-with-the-scim-api","Which integrations work with the SCIM API?",[22,69184,69185,69186,69189,69190,69193,69194,23343,69197,97],{},"Any HR & Directory integration that supports the Employee object works with ",[41,69187,123],{"href":121,"rel":69188},[45],"'s SCIM API, whether or not the vendor supports SCIM itself: ",[41,69191,123],{"href":121,"rel":69192},[45]," translates each SCIM call into that integration's own API. That covers most of ",[41,69195,123],{"href":121,"rel":69196},[45],[41,69198,23348],{"href":23346,"rel":69199},[45],[22,69201,69202,69203,69208],{},"Reads work wherever the integration lists employees; creates, updates and deletes work only where it writes them. As of 19 October 2026, Okta, Microsoft Entra ID, Google Workspace Directory, JumpCloud, Personio and Ceridian Dayforce create, update and remove employees; BambooHR and HiBob create and update them; Workday and ",[41,69204,69207],{"href":69205,"rel":69206},"https:\u002F\u002Fremote.com\u002F",[45],"Remote.com"," are read-only for employees. An operation an integration doesn't support returns 501. Each integration's Feature Support tab lists its methods.",[55,69210,69212],{"id":69211},"should-i-use-the-scim-api-or-the-hr-directory-api","Should I use the SCIM API or the HR & Directory API?",[22,69214,69215,69216,69220],{},"Use the SCIM API when your product already speaks SCIM and you want to create, update or remove accounts with it. Use the ",[41,69217,69219],{"href":23962,"rel":69218},[45],"HR & Directory API"," when you need more than identity: employment status, start and end dates, managers, locations, time off or payroll. Both read the same employee records.",[55,69222,69224],{"id":69223},"how-do-i-find-out-when-users-change","How do I find out when users change?",[22,69226,69227,69228,69231],{},"The SCIM API itself doesn't send webhooks. Subscribe to HR & Directory employee and group webhooks on supported integrations. They're native on integrations such as HiBob, Personio, Google Workspace Directory and Microsoft Entra ID, and come from ",[41,69229,22114],{"href":22112,"rel":69230},[45]," on integrations such as BambooHR, Workday and Okta, which check at an interval you set, as often as every minute on paid plans.",[22,69233,69234,69235,69238,69239,69242],{},"The SCIM API is on every plan. It isn't available to enterprise-managed (",[36,69236,69237],{},"ema_",") tokens. Each request goes to the source system; ",[41,69240,123],{"href":121,"rel":69241},[45]," keeps no customer records at rest, and connection credentials and operational metadata are encrypted at rest.",[55,69244,37023],{"id":37022},[2354,69246,69247,69253,69260,69267],{},[2357,69248,69249],{},[41,69250,69252],{"href":23962,"rel":69251},[45],"HR & Directory API overview",[2357,69254,69255],{},[41,69256,69259],{"href":69257,"rel":69258},"https:\u002F\u002Fdocs.unified.to\u002Fconcepts\u002Fglossary\u002Fscim",[45],"SCIM glossary entry",[2357,69261,69262],{},[41,69263,69266],{"href":69264,"rel":69265},"https:\u002F\u002Fdocs.unified.to\u002Fscim\u002Foverview",[45],"SCIM API overview",[2357,69268,69269],{},[41,69270,69273],{"href":69271,"rel":69272},"https:\u002F\u002Fdatatracker.ietf.org\u002Fdoc\u002Fhtml\u002Frfc7644",[45],"Official SCIM specifications",[4156,69275,5736],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":69277},[69278,69279,69281,69283,69284,69285,69286],{"id":4889,"depth":2434,"text":4890},{"id":69049,"depth":2434,"text":69280},"What endpoints does Unified.to's SCIM API provide?",{"id":69147,"depth":2434,"text":69282},"Which SCIM extensions does Unified.to support?",{"id":69181,"depth":2434,"text":69182},{"id":69211,"depth":2434,"text":69212},{"id":69223,"depth":2434,"text":69224},{"id":37022,"depth":2434,"text":37023},"Unified.to's SCIM API gives you SCIM 2.0 Users and Groups endpoints over its HR & Directory integrations, so a SCIM client can list, create, update and delete...",{"img":69289,"date":69290,"updated":69291,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_use_scim_with_the_unified_api-icon.jpg","2024-10-03T00:00:00.000Z","2026-10-21T14:41:39.912Z","\u002Fguides\u002Fhow_to_use_scim_with_the_unified_api",{"title":69015,"description":69287},"guides\u002Fhow_to_use_scim_with_the_unified_api","oruwerjCw17dBQWpGjWUBK1v3iBoiM3exHqULQeyMbI",{"id":69297,"title":69298,"body":69299,"description":69313,"extension":2452,"meta":70169,"navigation":2459,"path":70173,"seo":70174,"stem":70175,"__hash__":70176},"guides\u002Fguides\u002Fhow_to_use_the_passthrough_api.md","How to use the Passthrough API",{"type":12,"value":69300,"toc":70155},[69301,69304,69306,69311,69314,69316,69319,69327,69331,69334,69343,69347,69515,69523,69729,69733,69737,69740,69799,69808,69812,69815,69921,69930,69934,69937,70132,70141,70143,70152],[15,69302,69298],{"id":69303},"how-to-use-the-passthrough-api",[19,69305],{},[22,69307,69308],{},[25,69309,69310],{},"November 25, 2024",[22,69312,69313],{},"This guide shows you how to make requests using Unified.to's Passthrough API with practical examples.",[55,69315,4890],{"id":4889},[22,69317,69318],{},"You should have:",[2354,69320,69321,69324],{},[2357,69322,69323],{},"At least one active connection for an integration",[2357,69325,69326],{},"The connection ID for the integration you want to access",[55,69328,69330],{"id":69329},"making-passthrough-requests","Making Passthrough requests",[22,69332,69333],{},"The following examples demonstrate calls to mock endpoints with the Passthrough API.",[22,69335,69336,69338,69339,69342],{},[31,69337,5952],{}," There is only one reserved URL parameter, and that is ",[36,69340,69341],{},"__domain",". Use it to override the default API URL for that integration.",[3629,69344,69346],{"id":69345},"using-the-rest-api-directly","Using the REST API directly",[2584,69348,69350],{"className":16485,"code":69349,"language":16487,"meta":2433,"style":2433},"\u002F\u002F GET request example\nconst response = await fetch('https:\u002F\u002Fapi.unified.to\u002Fpassthrough\u002F{connection_id}\u002Fv2\u002Fcustomers', {\n  method: 'GET',\n  headers: {\n    'Authorization': 'Bearer YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson'\n  }\n});\n\n\u002F\u002F POST request example\nconst response = await fetch('https:\u002F\u002Fapi.unified.to\u002Fpassthrough\u002F{connection_id}\u002Fv2\u002Fcustomers', {\n  method: 'POST',\n  headers: {\n    'Authorization': 'Bearer YOUR_API_KEY',\n    'Content-Type': 'application\u002Fjson'\n  },\n  body: JSON.stringify({\n    name: 'John Doe',\n    email: 'john@example.com'\n  })\n});\n",[36,69351,69352,69357,69376,69384,69388,69399,69408,69412,69416,69420,69425,69443,69451,69455,69465,69473,69477,69490,69499,69506,69511],{"__ignoreMap":2433},[414,69353,69354],{"class":2593,"line":2594},[414,69355,69356],{"class":3527},"\u002F\u002F GET request example\n",[414,69358,69359,69361,69363,69365,69367,69369,69371,69374],{"class":2593,"line":2434},[414,69360,2745],{"class":2698},[414,69362,28445],{"class":2607},[414,69364,2817],{"class":2698},[414,69366,3002],{"class":2698},[414,69368,28452],{"class":2597},[414,69370,2968],{"class":2705},[414,69372,69373],{"class":2601},"'https:\u002F\u002Fapi.unified.to\u002Fpassthrough\u002F{connection_id}\u002Fv2\u002Fcustomers'",[414,69375,40219],{"class":2705},[414,69377,69378,69380,69382],{"class":2593,"line":2613},[414,69379,24497],{"class":2705},[414,69381,24500],{"class":2601},[414,69383,2757],{"class":2705},[414,69385,69386],{"class":2593,"line":2625},[414,69387,24517],{"class":2705},[414,69389,69390,69392,69394,69397],{"class":2593,"line":2677},[414,69391,55532],{"class":2601},[414,69393,7340],{"class":2705},[414,69395,69396],{"class":2601},"'Bearer YOUR_API_KEY'",[414,69398,2757],{"class":2705},[414,69400,69401,69404,69406],{"class":2593,"line":2751},[414,69402,69403],{"class":2601},"    'Content-Type'",[414,69405,7340],{"class":2705},[414,69407,29419],{"class":2601},[414,69409,69410],{"class":2593,"line":2760},[414,69411,4032],{"class":2705},[414,69413,69414],{"class":2593,"line":2768},[414,69415,2846],{"class":2705},[414,69417,69418],{"class":2593,"line":2776},[414,69419,2740],{"emptyLinePlaceholder":2459},[414,69421,69422],{"class":2593,"line":2784},[414,69423,69424],{"class":3527},"\u002F\u002F POST request example\n",[414,69426,69427,69429,69431,69433,69435,69437,69439,69441],{"class":2593,"line":2792},[414,69428,2745],{"class":2698},[414,69430,28445],{"class":2607},[414,69432,2817],{"class":2698},[414,69434,3002],{"class":2698},[414,69436,28452],{"class":2597},[414,69438,2968],{"class":2705},[414,69440,69373],{"class":2601},[414,69442,40219],{"class":2705},[414,69444,69445,69447,69449],{"class":2593,"line":2804},[414,69446,24497],{"class":2705},[414,69448,29388],{"class":2601},[414,69450,2757],{"class":2705},[414,69452,69453],{"class":2593,"line":2809},[414,69454,24517],{"class":2705},[414,69456,69457,69459,69461,69463],{"class":2593,"line":2829},[414,69458,55532],{"class":2601},[414,69460,7340],{"class":2705},[414,69462,69396],{"class":2601},[414,69464,2757],{"class":2705},[414,69466,69467,69469,69471],{"class":2593,"line":2843},[414,69468,69403],{"class":2601},[414,69470,7340],{"class":2705},[414,69472,29419],{"class":2601},[414,69474,69475],{"class":2593,"line":2849},[414,69476,16052],{"class":2705},[414,69478,69479,69482,69484,69486,69488],{"class":2593,"line":2854},[414,69480,69481],{"class":2705},"  body: ",[414,69483,24222],{"class":2607},[414,69485,97],{"class":2705},[414,69487,24227],{"class":2597},[414,69489,2826],{"class":2705},[414,69491,69492,69494,69497],{"class":2593,"line":2880},[414,69493,28908],{"class":2705},[414,69495,69496],{"class":2601},"'John Doe'",[414,69498,2757],{"class":2705},[414,69500,69501,69503],{"class":2593,"line":3253},[414,69502,18250],{"class":2705},[414,69504,69505],{"class":2601},"'john@example.com'\n",[414,69507,69508],{"class":2593,"line":3261},[414,69509,69510],{"class":2705},"  })\n",[414,69512,69513],{"class":2593,"line":3279},[414,69514,2846],{"class":2705},[3629,69516,69518,69519,69522],{"id":69517},"using-the-unifiedto-sdk","Using the ",[41,69520,123],{"href":121,"rel":69521},[45]," SDK",[2584,69524,69526],{"className":16485,"code":69525,"language":16487,"meta":2433,"style":2433},"\u002F\u002F GET request\nconst response = await unified.passthrough.listPassthroughs({\n  connectionId: 'YOUR_CONNECTION_ID',\n  path: '\u002Fv2\u002Fcustomers'\n});\n\n\u002F\u002F POST request\nconst response = await unified.passthrough.createPassthrough({\n  connectionId: 'YOUR_CONNECTION_ID',\n  path: '\u002Fv2\u002Fcustomers',\n  data: {\n    name: 'John Doe',\n    email: 'john@example.com'\n  }\n});\n\n\u002F\u002F With custom headers\nconst response = await unified.passthrough.listPassthroughs(\n  {\n    connectionId: 'YOUR_CONNECTION_ID',\n    path: '\u002Fv2\u002Fcustomers'\n  },\n  {\n    fetchOptions: {\n      headers: {\n        'x-api-version': '2023-06-01'\n      }\n    }\n  }\n);\n",[36,69527,69528,69533,69551,69561,69569,69573,69577,69582,69599,69607,69616,69620,69628,69634,69638,69642,69646,69651,69667,69671,69679,69686,69690,69694,69699,69703,69713,69717,69721,69725],{"__ignoreMap":2433},[414,69529,69530],{"class":2593,"line":2594},[414,69531,69532],{"class":3527},"\u002F\u002F GET request\n",[414,69534,69535,69537,69539,69541,69543,69546,69549],{"class":2593,"line":2434},[414,69536,2745],{"class":2698},[414,69538,28445],{"class":2607},[414,69540,2817],{"class":2698},[414,69542,3002],{"class":2698},[414,69544,69545],{"class":2705}," unified.passthrough.",[414,69547,69548],{"class":2597},"listPassthroughs",[414,69550,2826],{"class":2705},[414,69552,69553,69556,69559],{"class":2593,"line":2613},[414,69554,69555],{"class":2705},"  connectionId: ",[414,69557,69558],{"class":2601},"'YOUR_CONNECTION_ID'",[414,69560,2757],{"class":2705},[414,69562,69563,69566],{"class":2593,"line":2625},[414,69564,69565],{"class":2705},"  path: ",[414,69567,69568],{"class":2601},"'\u002Fv2\u002Fcustomers'\n",[414,69570,69571],{"class":2593,"line":2677},[414,69572,2846],{"class":2705},[414,69574,69575],{"class":2593,"line":2751},[414,69576,2740],{"emptyLinePlaceholder":2459},[414,69578,69579],{"class":2593,"line":2760},[414,69580,69581],{"class":3527},"\u002F\u002F POST request\n",[414,69583,69584,69586,69588,69590,69592,69594,69597],{"class":2593,"line":2768},[414,69585,2745],{"class":2698},[414,69587,28445],{"class":2607},[414,69589,2817],{"class":2698},[414,69591,3002],{"class":2698},[414,69593,69545],{"class":2705},[414,69595,69596],{"class":2597},"createPassthrough",[414,69598,2826],{"class":2705},[414,69600,69601,69603,69605],{"class":2593,"line":2776},[414,69602,69555],{"class":2705},[414,69604,69558],{"class":2601},[414,69606,2757],{"class":2705},[414,69608,69609,69611,69614],{"class":2593,"line":2784},[414,69610,69565],{"class":2705},[414,69612,69613],{"class":2601},"'\u002Fv2\u002Fcustomers'",[414,69615,2757],{"class":2705},[414,69617,69618],{"class":2593,"line":2792},[414,69619,47518],{"class":2705},[414,69621,69622,69624,69626],{"class":2593,"line":2804},[414,69623,28908],{"class":2705},[414,69625,69496],{"class":2601},[414,69627,2757],{"class":2705},[414,69629,69630,69632],{"class":2593,"line":2809},[414,69631,18250],{"class":2705},[414,69633,69505],{"class":2601},[414,69635,69636],{"class":2593,"line":2829},[414,69637,4032],{"class":2705},[414,69639,69640],{"class":2593,"line":2843},[414,69641,2846],{"class":2705},[414,69643,69644],{"class":2593,"line":2849},[414,69645,2740],{"emptyLinePlaceholder":2459},[414,69647,69648],{"class":2593,"line":2854},[414,69649,69650],{"class":3527},"\u002F\u002F With custom headers\n",[414,69652,69653,69655,69657,69659,69661,69663,69665],{"class":2593,"line":2880},[414,69654,2745],{"class":2698},[414,69656,28445],{"class":2607},[414,69658,2817],{"class":2698},[414,69660,3002],{"class":2698},[414,69662,69545],{"class":2705},[414,69664,69548],{"class":2597},[414,69666,18230],{"class":2705},[414,69668,69669],{"class":2593,"line":3253},[414,69670,18235],{"class":2705},[414,69672,69673,69675,69677],{"class":2593,"line":3261},[414,69674,3487],{"class":2705},[414,69676,69558],{"class":2601},[414,69678,2757],{"class":2705},[414,69680,69681,69684],{"class":2593,"line":3279},[414,69682,69683],{"class":2705},"    path: ",[414,69685,69568],{"class":2601},[414,69687,69688],{"class":2593,"line":3313},[414,69689,16052],{"class":2705},[414,69691,69692],{"class":2593,"line":3326},[414,69693,18235],{"class":2705},[414,69695,69696],{"class":2593,"line":3339},[414,69697,69698],{"class":2705},"    fetchOptions: {\n",[414,69700,69701],{"class":2593,"line":3359},[414,69702,28475],{"class":2705},[414,69704,69705,69708,69710],{"class":2593,"line":6453},[414,69706,69707],{"class":2601},"        'x-api-version'",[414,69709,7340],{"class":2705},[414,69711,69712],{"class":2601},"'2023-06-01'\n",[414,69714,69715],{"class":2593,"line":6459},[414,69716,28493],{"class":2705},[414,69718,69719],{"class":2593,"line":6465},[414,69720,10535],{"class":2705},[414,69722,69723],{"class":2593,"line":6471},[414,69724,4032],{"class":2705},[414,69726,69727],{"class":2593,"line":6477},[414,69728,3156],{"class":2705},[55,69730,69732],{"id":69731},"real-world-examples","Real-world examples",[3629,69734,69736],{"id":69735},"example-1-fetching-hubspot-properties","Example 1: Fetching HubSpot properties",[22,69738,69739],{},"This example demonstrates how to fetch custom properties for HubSpot contacts.",[2584,69741,69743],{"className":16485,"code":69742,"language":16487,"meta":2433,"style":2433},"const response = await unified.passthrough.listPassthroughs({\n  connectionId: HUBSPOT_CONNECTION_ID,\n  path: '\u002Fcrm\u002Fv3\u002Fproperties\u002F{objectType}\u002Fbatch\u002Fread'\n});\n\n\u002F\u002F Response will contain raw HubSpot property definitions\nconsole.log(response.data);\n",[36,69744,69745,69761,69770,69777,69781,69785,69790],{"__ignoreMap":2433},[414,69746,69747,69749,69751,69753,69755,69757,69759],{"class":2593,"line":2594},[414,69748,2745],{"class":2698},[414,69750,28445],{"class":2607},[414,69752,2817],{"class":2698},[414,69754,3002],{"class":2698},[414,69756,69545],{"class":2705},[414,69758,69548],{"class":2597},[414,69760,2826],{"class":2705},[414,69762,69763,69765,69768],{"class":2593,"line":2434},[414,69764,69555],{"class":2705},[414,69766,69767],{"class":2607},"HUBSPOT_CONNECTION_ID",[414,69769,2757],{"class":2705},[414,69771,69772,69774],{"class":2593,"line":2613},[414,69773,69565],{"class":2705},[414,69775,69776],{"class":2601},"'\u002Fcrm\u002Fv3\u002Fproperties\u002F{objectType}\u002Fbatch\u002Fread'\n",[414,69778,69779],{"class":2593,"line":2625},[414,69780,2846],{"class":2705},[414,69782,69783],{"class":2593,"line":2677},[414,69784,2740],{"emptyLinePlaceholder":2459},[414,69786,69787],{"class":2593,"line":2751},[414,69788,69789],{"class":3527},"\u002F\u002F Response will contain raw HubSpot property definitions\n",[414,69791,69792,69794,69796],{"class":2593,"line":2760},[414,69793,39099],{"class":2705},[414,69795,4064],{"class":2597},[414,69797,69798],{"class":2705},"(response.data);\n",[22,69800,69801,34,69803],{},[31,69802,28958],{},[41,69804,69807],{"href":69805,"rel":69806},"https:\u002F\u002Fdevelopers.hubspot.com\u002Fbeta-docs\u002Freference\u002Fapi\u002Fcrm\u002Fproperties#get-%2Fcrm%2Fv3%2Fproperties%2F%7Bobjecttype%7D",[45],"Hubspot CRM Properties",[3629,69809,69811],{"id":69810},"example-2-creating-a-slack-channel","Example 2: Creating a Slack channel",[22,69813,69814],{},"This example demonstrates creating a channel in Slack.",[2584,69816,69818],{"className":16485,"code":69817,"language":16487,"meta":2433,"style":2433},"\u002F\u002F Create a private Slack channel\nconst response = await unified.passthrough.createPassthrough({\n  connectionId: SLACK_CONNECTION_ID,\n  path: '\u002Fconversations.create',\n  data: {\n    name: 'project-discussion',\n    is_private: true\n  }\n});\n\n\u002F\u002F Check the response\nif (response.data.ok) {\n  console.log('Channel created:', response.data.channel.id);\n}\n",[36,69819,69820,69825,69841,69850,69859,69863,69872,69879,69883,69887,69891,69896,69903,69917],{"__ignoreMap":2433},[414,69821,69822],{"class":2593,"line":2594},[414,69823,69824],{"class":3527},"\u002F\u002F Create a private Slack channel\n",[414,69826,69827,69829,69831,69833,69835,69837,69839],{"class":2593,"line":2434},[414,69828,2745],{"class":2698},[414,69830,28445],{"class":2607},[414,69832,2817],{"class":2698},[414,69834,3002],{"class":2698},[414,69836,69545],{"class":2705},[414,69838,69596],{"class":2597},[414,69840,2826],{"class":2705},[414,69842,69843,69845,69848],{"class":2593,"line":2613},[414,69844,69555],{"class":2705},[414,69846,69847],{"class":2607},"SLACK_CONNECTION_ID",[414,69849,2757],{"class":2705},[414,69851,69852,69854,69857],{"class":2593,"line":2625},[414,69853,69565],{"class":2705},[414,69855,69856],{"class":2601},"'\u002Fconversations.create'",[414,69858,2757],{"class":2705},[414,69860,69861],{"class":2593,"line":2677},[414,69862,47518],{"class":2705},[414,69864,69865,69867,69870],{"class":2593,"line":2751},[414,69866,28908],{"class":2705},[414,69868,69869],{"class":2601},"'project-discussion'",[414,69871,2757],{"class":2705},[414,69873,69874,69877],{"class":2593,"line":2760},[414,69875,69876],{"class":2705},"    is_private: ",[414,69878,10733],{"class":2607},[414,69880,69881],{"class":2593,"line":2768},[414,69882,4032],{"class":2705},[414,69884,69885],{"class":2593,"line":2776},[414,69886,2846],{"class":2705},[414,69888,69889],{"class":2593,"line":2784},[414,69890,2740],{"emptyLinePlaceholder":2459},[414,69892,69893],{"class":2593,"line":2792},[414,69894,69895],{"class":3527},"\u002F\u002F Check the response\n",[414,69897,69898,69900],{"class":2593,"line":2804},[414,69899,38417],{"class":2698},[414,69901,69902],{"class":2705}," (response.data.ok) {\n",[414,69904,69905,69907,69909,69911,69914],{"class":2593,"line":2809},[414,69906,4061],{"class":2705},[414,69908,4064],{"class":2597},[414,69910,2968],{"class":2705},[414,69912,69913],{"class":2601},"'Channel created:'",[414,69915,69916],{"class":2705},", response.data.channel.id);\n",[414,69918,69919],{"class":2593,"line":2829},[414,69920,3035],{"class":2705},[22,69922,69923,7340,69925],{},[31,69924,28763],{},[41,69926,69929],{"href":69927,"rel":69928},"https:\u002F\u002Fapi.slack.com\u002Fmethods\u002Fconversations.create",[45],"conversations.create",[3629,69931,69933],{"id":69932},"example-3-creating-a-salesforce-record","Example 3: Creating a Salesforce record",[22,69935,69936],{},"This example demonstrates two ways of creating a new Account record in Salesforce using their sObject API.",[2584,69938,69940],{"className":16485,"code":69939,"language":16487,"meta":2433,"style":2433},"\u002F\u002F Using the SDK\nconst response = await unified.passthrough.createPassthrough({\n  connectionId: SALESFORCE_CONNECTION_ID,\n\u002F\u002F Note: path starts with 'services\u002Fdata\u002Fv62.0' as required by Salesforce\n  path: 'services\u002Fdata\u002Fv62.0\u002Fsobjects\u002FAccount\u002F',\n  data: {\n    \"Name\": \"Express Logistics and Transport\"\n  }\n});\n\n\nconst response = await fetch('https:\u002F\u002Fapi.unified.to\u002Fpassthrough\u002F{connection_id}\u002Fservices\u002Fdata\u002Fv62.0\u002Fsobjects\u002FAccount\u002F', {\n  method: 'POST',\n  headers: {\n    'Authorization': 'Bearer YOUR_UNIFIED_API_KEY',\n    'Content-Type': 'application\u002Fjson'\n  },\n  body: JSON.stringify({\n    \"Name\": \"Express Logistics and Transport\"\n  })\n});\n\n\u002F\u002F The response will contain the new record ID if successful:\n\u002F\u002F {\n\u002F\u002F   \"id\": \"001D000000IqhSLIAZ\",\n\u002F\u002F   \"errors\": [],\n\u002F\u002F   \"success\": true\n\u002F\u002F }\n",[36,69941,69942,69947,69963,69972,69977,69986,69990,70000,70004,70008,70012,70016,70035,70043,70047,70058,70066,70070,70082,70090,70094,70098,70102,70107,70112,70117,70122,70127],{"__ignoreMap":2433},[414,69943,69944],{"class":2593,"line":2594},[414,69945,69946],{"class":3527},"\u002F\u002F Using the SDK\n",[414,69948,69949,69951,69953,69955,69957,69959,69961],{"class":2593,"line":2434},[414,69950,2745],{"class":2698},[414,69952,28445],{"class":2607},[414,69954,2817],{"class":2698},[414,69956,3002],{"class":2698},[414,69958,69545],{"class":2705},[414,69960,69596],{"class":2597},[414,69962,2826],{"class":2705},[414,69964,69965,69967,69970],{"class":2593,"line":2613},[414,69966,69555],{"class":2705},[414,69968,69969],{"class":2607},"SALESFORCE_CONNECTION_ID",[414,69971,2757],{"class":2705},[414,69973,69974],{"class":2593,"line":2625},[414,69975,69976],{"class":3527},"\u002F\u002F Note: path starts with 'services\u002Fdata\u002Fv62.0' as required by Salesforce\n",[414,69978,69979,69981,69984],{"class":2593,"line":2677},[414,69980,69565],{"class":2705},[414,69982,69983],{"class":2601},"'services\u002Fdata\u002Fv62.0\u002Fsobjects\u002FAccount\u002F'",[414,69985,2757],{"class":2705},[414,69987,69988],{"class":2593,"line":2751},[414,69989,47518],{"class":2705},[414,69991,69992,69995,69997],{"class":2593,"line":2760},[414,69993,69994],{"class":2601},"    \"Name\"",[414,69996,7340],{"class":2705},[414,69998,69999],{"class":2601},"\"Express Logistics and Transport\"\n",[414,70001,70002],{"class":2593,"line":2768},[414,70003,4032],{"class":2705},[414,70005,70006],{"class":2593,"line":2776},[414,70007,2846],{"class":2705},[414,70009,70010],{"class":2593,"line":2784},[414,70011,2740],{"emptyLinePlaceholder":2459},[414,70013,70014],{"class":2593,"line":2792},[414,70015,2740],{"emptyLinePlaceholder":2459},[414,70017,70018,70020,70022,70024,70026,70028,70030,70033],{"class":2593,"line":2804},[414,70019,2745],{"class":2698},[414,70021,28445],{"class":2607},[414,70023,2817],{"class":2698},[414,70025,3002],{"class":2698},[414,70027,28452],{"class":2597},[414,70029,2968],{"class":2705},[414,70031,70032],{"class":2601},"'https:\u002F\u002Fapi.unified.to\u002Fpassthrough\u002F{connection_id}\u002Fservices\u002Fdata\u002Fv62.0\u002Fsobjects\u002FAccount\u002F'",[414,70034,40219],{"class":2705},[414,70036,70037,70039,70041],{"class":2593,"line":2809},[414,70038,24497],{"class":2705},[414,70040,29388],{"class":2601},[414,70042,2757],{"class":2705},[414,70044,70045],{"class":2593,"line":2829},[414,70046,24517],{"class":2705},[414,70048,70049,70051,70053,70056],{"class":2593,"line":2843},[414,70050,55532],{"class":2601},[414,70052,7340],{"class":2705},[414,70054,70055],{"class":2601},"'Bearer YOUR_UNIFIED_API_KEY'",[414,70057,2757],{"class":2705},[414,70059,70060,70062,70064],{"class":2593,"line":2849},[414,70061,69403],{"class":2601},[414,70063,7340],{"class":2705},[414,70065,29419],{"class":2601},[414,70067,70068],{"class":2593,"line":2854},[414,70069,16052],{"class":2705},[414,70071,70072,70074,70076,70078,70080],{"class":2593,"line":2880},[414,70073,69481],{"class":2705},[414,70075,24222],{"class":2607},[414,70077,97],{"class":2705},[414,70079,24227],{"class":2597},[414,70081,2826],{"class":2705},[414,70083,70084,70086,70088],{"class":2593,"line":3253},[414,70085,69994],{"class":2601},[414,70087,7340],{"class":2705},[414,70089,69999],{"class":2601},[414,70091,70092],{"class":2593,"line":3261},[414,70093,69510],{"class":2705},[414,70095,70096],{"class":2593,"line":3279},[414,70097,2846],{"class":2705},[414,70099,70100],{"class":2593,"line":3313},[414,70101,2740],{"emptyLinePlaceholder":2459},[414,70103,70104],{"class":2593,"line":3326},[414,70105,70106],{"class":3527},"\u002F\u002F The response will contain the new record ID if successful:\n",[414,70108,70109],{"class":2593,"line":3339},[414,70110,70111],{"class":3527},"\u002F\u002F {\n",[414,70113,70114],{"class":2593,"line":3359},[414,70115,70116],{"class":3527},"\u002F\u002F   \"id\": \"001D000000IqhSLIAZ\",\n",[414,70118,70119],{"class":2593,"line":6453},[414,70120,70121],{"class":3527},"\u002F\u002F   \"errors\": [],\n",[414,70123,70124],{"class":2593,"line":6459},[414,70125,70126],{"class":3527},"\u002F\u002F   \"success\": true\n",[414,70128,70129],{"class":2593,"line":6465},[414,70130,70131],{"class":3527},"\u002F\u002F }\n",[22,70133,70134,34,70136],{},[31,70135,28958],{},[41,70137,70140],{"href":70138,"rel":70139},"https:\u002F\u002Fdeveloper.salesforce.com\u002Fdocs\u002Fatlas.en-us.api_rest.meta\u002Fapi_rest\u002Fdome_sobject_create.htm",[45],"Create a Record",[55,70142,37023],{"id":37022},[2354,70144,70145],{},[2357,70146,70147],{},[41,70148,70151],{"href":70149,"rel":70150},"https:\u002F\u002Fdocs.unified.to\u002Fpassthrough\u002Foverview",[45],"Passthrough API Overview",[4156,70153,70154],{},"html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}",{"title":2433,"searchDepth":2434,"depth":2434,"links":70156},[70157,70158,70163,70168],{"id":4889,"depth":2434,"text":4890},{"id":69329,"depth":2434,"text":69330,"children":70159},[70160,70161],{"id":69345,"depth":2613,"text":69346},{"id":69517,"depth":2613,"text":70162},"Using the Unified.to SDK",{"id":69731,"depth":2434,"text":69732,"children":70164},[70165,70166,70167],{"id":69735,"depth":2613,"text":69736},{"id":69810,"depth":2613,"text":69811},{"id":69932,"depth":2613,"text":69933},{"id":37022,"depth":2434,"text":37023},{"img":70170,"date":70171,"updated":70172,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_use_the_passthrough_api-icon.png","2024-11-25T00:00:00.000Z","2026-10-21T00:01:34.579Z","\u002Fguides\u002Fhow_to_use_the_passthrough_api",{"title":69298,"description":69313},"guides\u002Fhow_to_use_the_passthrough_api","WWJ-Q1HqLhKrGeyt7erCvczbjYRaNSI1NVZJEcJ6un0",{"id":70178,"title":70179,"body":70180,"description":73278,"extension":2452,"meta":73279,"navigation":2459,"path":73284,"seo":73285,"stem":73286,"__hash__":73287},"guides\u002Fguides\u002Fhow_to_use_unified_generative_ai_api_with_openai_and_claude.md","How to Use Unified.to's Generative AI API with OpenAI and Claude",{"type":12,"value":70181,"toc":73266},[70182,70185,70187,70192,70198,70205,70249,70252,70255,70310,70314,70330,70336,70345,70350,70356,70369,70375,70381,70387,70398,70404,70408,70419,70425,70434,70440,70446,70452,70458,70461,70472,70478,70489,70495,70501,70507,70510,70514,70525,70531,70535,70538,70544,70573,70582,70586,70599,70613,70617,70620,70628,70633,70639,70787,70793,70798,70801,70948,71037,71040,71177,71180,71192,71195,71208,71213,71216,71232,71235,71251,71254,71379,71381,71503,71506,71516,71519,71532,71537,71543,71710,71712,71834,71847,71852,71855,71869,71871,71885,71887,72050,72052,72174,72177,72181,72188,72196,72210,72387,72390,72398,72402,72405,72410,72413,72471,72482,72717,72726,72779,72784,72787,72962,72969,72972,73022,73040,73085,73088,73133,73143,73199,73201,73215,73241,73245,73255,73263],[15,70183,70179],{"id":70184},"how-to-use-unifiedtos-generative-ai-api-with-openai-and-claude",[19,70186],{},[22,70188,70189],{},[25,70190,70191],{},"May 29, 2024",[22,70193,70194],{},[4201,70195],{"alt":70196,"src":70197},"Unified.to_-_Unified_GenAI_API.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_use_unified_generative_ai_api_with_openai_and_claude-0.png",[22,70199,70200,70201,70204],{},"This guide shows you how to get started with ",[41,70202,123],{"href":121,"rel":70203},[45],"'s GenAI (generative AI) API, which gives you one model and API for large language models (LLMs) across 56 AI integrations, including:",[2354,70206,70207,70214,70221,70228,70235,70242],{},[2357,70208,70209],{},[41,70210,70213],{"href":70211,"rel":70212},"https:\u002F\u002Fwww.anthropic.com\u002Fapi",[45],"Anthropic Claude",[2357,70215,70216],{},[41,70217,70220],{"href":70218,"rel":70219},"https:\u002F\u002Fwww.anyscale.com\u002Fplatform",[45],"Anyscale",[2357,70222,70223],{},[41,70224,70227],{"href":70225,"rel":70226},"https:\u002F\u002Fai.google.dev\u002F",[45],"Google Gemini",[2357,70229,70230],{},[41,70231,70234],{"href":70232,"rel":70233},"https:\u002F\u002Fconsole.groq.com\u002Fdocs\u002F",[45],"Groq",[2357,70236,70237],{},[41,70238,70241],{"href":70239,"rel":70240},"https:\u002F\u002Fdocs.mistral.ai\u002Fapi\u002F",[45],"Mistral AI",[2357,70243,70244],{},[41,70245,70248],{"href":70246,"rel":70247},"https:\u002F\u002Fopenai.com\u002Fapi\u002F",[45],"OpenAI GPT",[22,70250,70251],{},"To illustrate its power, we will work through a sample application using your own GenAI API credentials, although Unified.to's use cases always target a SaaS company's customer accounts.",[22,70253,70254],{},"To follow the steps in this guide, you'll need the following:",[2354,70256,70257,70276,70289,70292],{},[2357,70258,70259,34,70262,34,70267,70270,70271,70275],{},[31,70260,70261],{},"A",[41,70263,70265],{"href":121,"rel":70264},[45],[31,70266,123],{},[31,70268,70269],{},"account."," If you don't have one, start a ",[41,70272,70274],{"href":21420,"rel":70273},[45],"30-day free trial"," on Grow or Pro.",[2357,70277,70278,70279,70284,70285,97],{},"Accounts for the ",[41,70280,70283],{"href":70281,"rel":70282},"https:\u002F\u002Fplatform.openai.com\u002Fdocs\u002Foverview",[45],"OpenAI API"," and the ",[41,70286,70288],{"href":70211,"rel":70287},[45],"Anthropic Claude API",[2357,70290,70291],{},"Python (preferably version 3.10 or later).",[2357,70293,70294,70299,70300,70305,70306,70309],{},[41,70295,70298],{"href":70296,"rel":70297},"https:\u002F\u002Fjupyter.org\u002F",[45],"Jupyter Notebook"," (included with the ",[41,70301,70304],{"href":70302,"rel":70303},"https:\u002F\u002Fwww.anaconda.com\u002Fdownload",[45],"Anaconda Python distribution"," or easily installed with the command ",[36,70307,70308],{},"pip install notebook",". It's a great tool for experimenting with Python and exploring APIs and libraries.",[55,70311,70313],{"id":70312},"activate-the-integrations","Activate the integrations",[22,70315,70316,70317,70321,70322,70324,70325,20790,70327,70329],{},"The first step is to activate the Claude and OpenAI integrations. ",[41,70318,70320],{"href":21420,"rel":70319},[45],"Log in to Unified.to"," and navigate to the ",[31,70323,4433],{}," page by selecting ",[31,70326,4433],{},[31,70328,57457],{}," from the menu bar in the Unified.to dashboard:",[22,70331,70332],{},[4201,70333],{"alt":70334,"src":70335},"Initial_GenAI_integrations_page.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_use_unified_generative_ai_api_with_openai_and_claude-1.png",[22,70337,70338,70339,26207,70342,70344],{},"Narrow down the integrations to only the generative AI ones by selecting ",[31,70340,70341],{},"GENAI",[31,70343,23364],{}," menu.",[22,70346,28015,70347,70349],{},[31,70348,70213],{}," item, which will take you to its integration page:",[22,70351,70352],{},[4201,70353],{"alt":70354,"src":70355},"Integrate_Anthropic_Claude.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_use_unified_generative_ai_api_with_openai_and_claude-2.png",[22,70357,70358,70359,70362,70363,70365,70366,70368],{},"Activate the Claude integration by clicking the ",[31,70360,70361],{},"ACTIVATE"," button. This will return you to the ",[31,70364,4433],{}," page, where you'll see that the ",[31,70367,70213],{}," item is now marked 'active:'",[22,70370,70371],{},[4201,70372],{"alt":70373,"src":70374},"Updated_GenAI_integrations_page.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_use_unified_generative_ai_api_with_openai_and_claude-3.png",[22,70376,70377,70378,70349],{},"Now click on the ",[31,70379,70380],{},"OpenAI",[22,70382,70383],{},[4201,70384],{"alt":70385,"src":70386},"Integrate_OpenAI.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_use_unified_generative_ai_api_with_openai_and_claude-4.png",[22,70388,70389,70390,70392,70393,70365,70395,70397],{},"Activate the OpenAI integration by clicking the ",[31,70391,70361],{}," button. Once again, you'll return to the ",[31,70394,4433],{},[31,70396,70380],{}," item is also marked 'active:'",[22,70399,70400],{},[4201,70401],{"alt":70402,"src":70403},"Final_GenAI_integrations_page.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_use_unified_generative_ai_api_with_openai_and_claude-5.png",[55,70405,70407],{"id":70406},"create-the-connections-and-copy-the-connection-ids","Create the connections and copy the connection IDs",[22,70409,70410,70411,70324,70413,20790,70415,70418],{},"The next step is to create connections for Claude and OpenAI. Navigate to the ",[31,70412,16467],{},[31,70414,36643],{},[31,70416,70417],{},"Embedded Authorizations"," from the menu bar:",[22,70420,70421],{},[4201,70422],{"alt":70423,"src":70424},"Embedded_authorization_page_1.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_use_unified_generative_ai_api_with_openai_and_claude-6.png",[22,70426,70427,70428,70430,70431],{},"First, create a Claude connection by clicking the ",[31,70429,70213],{}," item in the ",[31,70432,70433],{},"End-User Preview.",[22,70435,70436,70437,70439],{},"When you arrive at the Claude authorization page, paste your Claude API key into the text field provided, then click the ",[31,70438,6955],{}," button:",[22,70441,70442],{},[4201,70443],{"alt":70444,"src":70445},"Paste_Anthropic_API_token.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_use_unified_generative_ai_api_with_openai_and_claude-7.png",[22,70447,70448,70449,70451],{},"This will create a Claude connection and send you to the ",[31,70450,16241],{}," page, where you'll see a list of your connections, with the newly-created Claude connection at the top:",[22,70453,70454],{},[4201,70455],{"alt":70456,"src":70457},"New_Claude_connection.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_use_unified_generative_ai_api_with_openai_and_claude-8.png",[22,70459,70460],{},"Copy the ID value for the Claude connection you just created; you'll need it after creating the connections.",[22,70462,70463,70464,70466,70467,20790,70469,70471],{},"Return to the ",[31,70465,16467],{}," page (",[31,70468,36643],{},[31,70470,70417],{},")…",[22,70473,70474],{},[4201,70475],{"alt":70476,"src":70477},"Embedded_authorization_page_2.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_use_unified_generative_ai_api_with_openai_and_claude-9.png",[22,70479,70480,70481,70430,70483,70485,70486,70488],{},"…then create an OpenAI connection by clicking the ",[31,70482,70380],{},[31,70484,70433],{}," 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 ",[31,70487,6955],{}," to create the connection:",[22,70490,70491],{},[4201,70492],{"alt":70493,"src":70494},"Paste_OpenAI_API_token.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_use_unified_generative_ai_api_with_openai_and_claude-10.png",[22,70496,70497,70498,70500],{},"This will create an OpenAI connection and once again, you will be sent to the ",[31,70499,16241],{}," page, where you'll see the newly-created OpenAI connection at the top of the list:",[22,70502,70503],{},[4201,70504],{"alt":70505,"src":70506},"New_OpenAI_connection.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_use_unified_generative_ai_api_with_openai_and_claude-11.png",[22,70508,70509],{},"As you did with the Claude connection, copy the ID value for the new OpenAI connection.",[55,70511,70513],{"id":70512},"copy-your-unifiedto-api-token","Copy your Unified.to API token",[22,70515,70516,70517,70520,70521,70524],{},"In order to access the ",[41,70518,123],{"href":121,"rel":70519},[45]," API, you need the Unified.to API token for your account. You can copy this value from the ",[31,70522,70523],{},"API Information"," page, which you can navigate to by selecting Settings → API Information from the Unified.to menu bar:",[22,70526,70527],{},[4201,70528],{"alt":70529,"src":70530},"settings_page.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_use_unified_generative_ai_api_with_openai_and_claude-12.png",[55,70532,70534],{"id":70533},"create-an-env-file-with-your-unifiedto-api-token-and-generative-ai-connection-ids","Create an .env file with your Unified.to API token and generative AI connection IDs",[22,70536,70537],{},"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.",[22,70539,70540,70541,70543],{},"Create a file named ",[31,70542,2645],{}," in a new directory with the following content:",[2584,70545,70547],{"className":2649,"code":70546,"language":2651,"meta":2652,"style":2433},"# .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",[36,70548,70549,70554,70558,70563,70568],{"__ignoreMap":2433},[414,70550,70551],{"class":2593,"line":2594},[414,70552,70553],{},"# .env file\n",[414,70555,70556],{"class":2593,"line":2434},[414,70557,2740],{"emptyLinePlaceholder":2459},[414,70559,70560],{"class":2593,"line":2613},[414,70561,70562],{},"UNIFIED_API_TOKEN={Paste your Unified.to API token here}\n",[414,70564,70565],{"class":2593,"line":2625},[414,70566,70567],{},"OPENAI_CONNECTION_ID={Paste your OpenAI connection ID here}\n",[414,70569,70570],{"class":2593,"line":2677},[414,70571,70572],{},"CLAUDE_CONNECTION_ID={Paste your Claude connection ID here}\n",[22,70574,70575,70576,70578,70579,70581],{},"Replace the text in ",[36,70577,28091],{}," braces ",[36,70580,38264],{}," with the appropriate values.",[55,70583,70585],{"id":70584},"install-the-unifiedto-python-sdk-package","Install the Unified.to Python SDK package",[22,70587,70588,70589,70594,70595,70598],{},"While it's possible to call the unified API 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. ",[41,70590,70593],{"href":70591,"rel":70592},"https:\u002F\u002Fgithub.com\u002Funified-to\u002Funified-python-sdk",[45],"You can find its code on GitHub",", and you can install it with ",[36,70596,70597],{},"pip",", the Python package installer, using the following command:",[2584,70600,70602],{"className":17934,"code":70601,"language":17936,"meta":2433,"style":2433},"pip install Unified-python-sdk\n",[36,70603,70604],{"__ignoreMap":2433},[414,70605,70606,70608,70610],{"class":2593,"line":2594},[414,70607,70597],{"class":2597},[414,70609,2630],{"class":2601},[414,70611,70612],{"class":2601}," Unified-python-sdk\n",[55,70614,70616],{"id":70615},"chat-with-claude-and-openai-via-unifiedtos-unified-api","Chat with Claude and OpenAI via Unified.to's unified API",[22,70618,70619],{},"Now that all the preliminary work is done, you can start coding. You have a couple of options at this point:",[2354,70621,70622,70625],{},[2357,70623,70624],{},"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",[2357,70626,70627],{},"you can create a new Python file, adding each bit of code presented below into the file.",[22,70629,70630],{},[31,70631,70632],{},"Define constants and the API object",[22,70634,70635,70636,70638],{},"Create a new Jupyter Notebook in the directory where you saved the ",[31,70637,2645],{}," 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:",[2584,70640,70642],{"className":37862,"code":70641,"language":37864,"meta":2433,"style":2433},"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",[36,70643,70644,70650,70657,70669,70673,70678,70686,70693,70697,70712,70726,70740,70744,70754,70764,70778,70783],{"__ignoreMap":2433},[414,70645,70646,70648],{"class":2593,"line":2594},[414,70647,2699],{"class":2698},[414,70649,37873],{"class":2705},[414,70651,70652,70654],{"class":2593,"line":2434},[414,70653,2699],{"class":2698},[414,70655,70656],{"class":2705}," unified_to\n",[414,70658,70659,70661,70664,70666],{"class":2593,"line":2613},[414,70660,2716],{"class":2698},[414,70662,70663],{"class":2705}," unified_to.models ",[414,70665,2699],{"class":2698},[414,70667,70668],{"class":2705}," operations, shared\n",[414,70670,70671],{"class":2593,"line":2625},[414,70672,2740],{"emptyLinePlaceholder":2459},[414,70674,70675],{"class":2593,"line":2677},[414,70676,70677],{"class":3527},"# Load the contents of the .env file\n",[414,70679,70680,70683],{"class":2593,"line":2751},[414,70681,70682],{"class":2698},"%",[414,70684,70685],{"class":2705},"reload_ext dotenv\n",[414,70687,70688,70690],{"class":2593,"line":2760},[414,70689,70682],{"class":2698},[414,70691,70692],{"class":2705},"dotenv\n",[414,70694,70695],{"class":2593,"line":2768},[414,70696,2740],{"emptyLinePlaceholder":2459},[414,70698,70699,70702,70705,70707,70710],{"class":2593,"line":2776},[414,70700,70701],{"class":2607},"UNIFIED_API_TOKEN",[414,70703,70704],{"class":2698},"    =",[414,70706,37937],{"class":2705},[414,70708,70709],{"class":2601},"'UNIFIED_API_TOKEN'",[414,70711,3141],{"class":2705},[414,70713,70714,70717,70719,70721,70724],{"class":2593,"line":2784},[414,70715,70716],{"class":2607},"OPENAI_CONNECTION_ID",[414,70718,2817],{"class":2698},[414,70720,37937],{"class":2705},[414,70722,70723],{"class":2601},"'OPENAI_CONNECTION_ID'",[414,70725,3141],{"class":2705},[414,70727,70728,70731,70733,70735,70738],{"class":2593,"line":2792},[414,70729,70730],{"class":2607},"CLAUDE_CONNECTION_ID",[414,70732,2817],{"class":2698},[414,70734,37937],{"class":2705},[414,70736,70737],{"class":2601},"'CLAUDE_CONNECTION_ID'",[414,70739,3141],{"class":2705},[414,70741,70742],{"class":2593,"line":2804},[414,70743,2740],{"emptyLinePlaceholder":2459},[414,70745,70746,70749,70751],{"class":2593,"line":2809},[414,70747,70748],{"class":2705},"api ",[414,70750,2798],{"class":2698},[414,70752,70753],{"class":2705}," unified_to.UnifiedTo(\n",[414,70755,70756,70759,70761],{"class":2593,"line":2829},[414,70757,70758],{"class":2971},"    security",[414,70760,2798],{"class":2698},[414,70762,70763],{"class":2705},"shared.Security(\n",[414,70765,70766,70769,70771,70774,70776],{"class":2593,"line":2843},[414,70767,70768],{"class":2971},"        jwt",[414,70770,2798],{"class":2698},[414,70772,70773],{"class":2705},"os.environ.get(",[414,70775,70709],{"class":2601},[414,70777,18305],{"class":2705},[414,70779,70780],{"class":2593,"line":2849},[414,70781,70782],{"class":2705},"    ),\n",[414,70784,70785],{"class":2593,"line":2854},[414,70786,3141],{"class":2705},[22,70788,70789,70790,70792],{},"You'll use the ",[36,70791,34178],{}," object to send requests to and receive responses from the Unified.to API.",[22,70794,70795],{},[31,70796,70797],{},"Create a prompt and send it to Claude",[22,70799,70800],{},"Enter the following into its own Jupyter notebook cell. This code builds a prompt and sends it to Claude, then displays the resulting response:",[2584,70802,70804],{"className":37862,"code":70803,"language":37864,"meta":2433,"style":2433},"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",[36,70805,70806,70816,70827,70836,70844,70849,70860,70870,70874,70879,70883,70887,70903,70907,70924,70931,70937],{"__ignoreMap":2433},[414,70807,70808,70811,70813],{"class":2593,"line":2594},[414,70809,70810],{"class":2705},"my_request ",[414,70812,2798],{"class":2698},[414,70814,70815],{"class":2705}," operations.CreateGenaiPromptRequest(\n",[414,70817,70818,70820,70822,70825],{"class":2593,"line":2434},[414,70819,25325],{"class":2971},[414,70821,2817],{"class":2698},[414,70823,70824],{"class":2607}," CLAUDE_CONNECTION_ID",[414,70826,2757],{"class":2705},[414,70828,70829,70832,70834],{"class":2593,"line":2613},[414,70830,70831],{"class":2971},"    genai_prompt",[414,70833,2817],{"class":2698},[414,70835,2748],{"class":2705},[414,70837,70838,70841],{"class":2593,"line":2625},[414,70839,70840],{"class":2601},"        'messages'",[414,70842,70843],{"class":2705}," : [\n",[414,70845,70846],{"class":2593,"line":2677},[414,70847,70848],{"class":2705},"            {\n",[414,70850,70851,70854,70856,70858],{"class":2593,"line":2751},[414,70852,70853],{"class":2601},"                'role'",[414,70855,7340],{"class":2705},[414,70857,30893],{"class":2601},[414,70859,2757],{"class":2705},[414,70861,70862,70865,70867],{"class":2593,"line":2760},[414,70863,70864],{"class":2601},"                'content'",[414,70866,7340],{"class":2705},[414,70868,70869],{"class":2601},"\"Which LLM model am I talking to right now?\"\n",[414,70871,70872],{"class":2593,"line":2768},[414,70873,65438],{"class":2705},[414,70875,70876],{"class":2593,"line":2776},[414,70877,70878],{"class":2705},"        ]\n",[414,70880,70881],{"class":2593,"line":2784},[414,70882,10535],{"class":2705},[414,70884,70885],{"class":2593,"line":2792},[414,70886,3141],{"class":2705},[414,70888,70889,70891,70893,70896,70898,70900],{"class":2593,"line":2804},[414,70890,39519],{"class":2705},[414,70892,2798],{"class":2698},[414,70894,70895],{"class":2705}," api.genai.create_genai_prompt(",[414,70897,47570],{"class":2971},[414,70899,2798],{"class":2698},[414,70901,70902],{"class":2705},"my_request)\n",[414,70904,70905],{"class":2593,"line":2809},[414,70906,2740],{"emptyLinePlaceholder":2459},[414,70908,70909,70911,70914,70916,70919,70922],{"class":2593,"line":2829},[414,70910,38417],{"class":2698},[414,70912,70913],{"class":2705}," response.genai_prompt ",[414,70915,64997],{"class":2698},[414,70917,70918],{"class":2698}," not",[414,70920,70921],{"class":2607}," None",[414,70923,38099],{"class":2705},[414,70925,70926,70928],{"class":2593,"line":2843},[414,70927,41999],{"class":2607},[414,70929,70930],{"class":2705},"(response)\n",[414,70932,70933,70935],{"class":2593,"line":2849},[414,70934,25123],{"class":2698},[414,70936,38099],{"class":2705},[414,70938,70939,70941,70943,70946],{"class":2593,"line":2854},[414,70940,41999],{"class":2607},[414,70942,2968],{"class":2705},[414,70944,70945],{"class":2601},"\"No response.\"",[414,70947,3141],{"class":2705},[2354,70949,70950,70960,70978,71027],{},[2357,70951,8879,70952,70955,70956,70959],{},[36,70953,70954],{},"my_request"," variable is assigned a request object using the ",[36,70957,70958],{},"CreateGenaiPromptRequest()"," method of the operations class, which contains methods for creating requests and responses for the Unified API.",[2357,70961,70962,70964,70965],{},[36,70963,70958],{}," takes two arguments:\n",[2354,70966,70967,70972],{},[2357,70968,70969,70971],{},[36,70970,85],{},": The ID of the connection for the generative AI that will receive the prompt",[2357,70973,70974,70977],{},[36,70975,70976],{},"genai_prompt",": A dictionary containing the parameters defining the prompt to be sent to the generative AI",[2357,70979,70980,70981,70983,70984,70987,70988],{},"At the very least, the ",[36,70982,70976],{}," dictionary must contain a key named ",[36,70985,70986],{},"'messages'",". The corresponding value must be an array of dictionaries with the following keys:\n",[2354,70989,70990,71003],{},[2357,70991,70992,70995,70996,70998,70999,71002],{},[36,70993,70994],{},"'role'",":  The corresponding value can be either ",[36,70997,30893],{},", which means that the message is from the human interacting with the AI, or ",[36,71000,71001],{},"'system'",", which means that the message is meant as instructions for the AI.",[2357,71004,71005,71008,71009,71011,71012,71014,71015,71018,71019,71011,71021,71014,71023,71026],{},[36,71006,71007],{},"'content'",":  The corresponding value is the actual content of the message. If the ",[36,71010,70994],{}," value is ",[36,71013,30893],{},", this value is the text of the ",[25,71016,71017],{},"user's"," message to the AI. If the ",[36,71020,70994],{},[36,71022,71001],{},[25,71024,71025],{},"application's"," message to the AI.",[2357,71028,71029,71030,71033,71034,71036],{},"The response variable gets the AI's response using the ",[36,71031,71032],{},"genai.create_genai_prompt()"," method, which takes the request contained in ",[36,71035,70954],{},", sends it to Unified.to, and returns Unified.to's response.",[22,71038,71039],{},"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):",[2584,71041,71043],{"className":37862,"code":71042,"language":37864,"meta":2433,"style":2433},"CreateGenaiPromptResponse(\n    content_type='application\u002Fjson; 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",[36,71044,71045,71050,71062,71073,71092,71101,71111,71121,71132,71143,71159,71169,71173],{"__ignoreMap":2433},[414,71046,71047],{"class":2593,"line":2594},[414,71048,71049],{"class":2705},"CreateGenaiPromptResponse(\n",[414,71051,71052,71055,71057,71060],{"class":2593,"line":2434},[414,71053,71054],{"class":2971},"    content_type",[414,71056,2798],{"class":2698},[414,71058,71059],{"class":2601},"'application\u002Fjson; charset=utf-8'",[414,71061,32627],{"class":2705},[414,71063,71064,71067,71069,71071],{"class":2593,"line":2613},[414,71065,71066],{"class":2971},"    status_code",[414,71068,2798],{"class":2698},[414,71070,29784],{"class":2607},[414,71072,32627],{"class":2705},[414,71074,71075,71078,71081,71084,71086,71088,71090],{"class":2593,"line":2625},[414,71076,71077],{"class":2971},"    raw_response",[414,71079,71080],{"class":2698},"=\u003C",[414,71082,71083],{"class":2705},"Response [",[414,71085,29784],{"class":2607},[414,71087,17035],{"class":2705},[414,71089,54166],{"class":2698},[414,71091,32627],{"class":2705},[414,71093,71094,71096,71098],{"class":2593,"line":2677},[414,71095,70831],{"class":2971},[414,71097,2798],{"class":2698},[414,71099,71100],{"class":2705},"GenaiPrompt(\n",[414,71102,71103,71105,71107,71109],{"class":2593,"line":2751},[414,71104,38126],{"class":2971},[414,71106,2798],{"class":2698},[414,71108,21964],{"class":2607},[414,71110,32627],{"class":2705},[414,71112,71113,71115,71117,71119],{"class":2593,"line":2760},[414,71114,38148],{"class":2971},[414,71116,2798],{"class":2698},[414,71118,21964],{"class":2607},[414,71120,32627],{"class":2705},[414,71122,71123,71126,71128,71130],{"class":2593,"line":2768},[414,71124,71125],{"class":2971},"        model_id",[414,71127,2798],{"class":2698},[414,71129,21964],{"class":2607},[414,71131,32627],{"class":2705},[414,71133,71134,71137,71139,71141],{"class":2593,"line":2776},[414,71135,71136],{"class":2971},"        raw",[414,71138,2798],{"class":2698},[414,71140,21964],{"class":2607},[414,71142,32627],{"class":2705},[414,71144,71145,71148,71150,71153,71156],{"class":2593,"line":2784},[414,71146,71147],{"class":2971},"        responses",[414,71149,2798],{"class":2698},[414,71151,71152],{"class":2705},"[",[414,71154,71155],{"class":2601},"'I am an AI assistant called Claude. I was created by Anthropic, PBC to be helpful, harmless, and honest.'",[414,71157,71158],{"class":2705},"], \n",[414,71160,71161,71164,71166],{"class":2593,"line":2792},[414,71162,71163],{"class":2971},"        temperature",[414,71165,2798],{"class":2698},[414,71167,71168],{"class":2607},"None\n",[414,71170,71171],{"class":2593,"line":2804},[414,71172,38158],{"class":2705},[414,71174,71175],{"class":2593,"line":2809},[414,71176,3141],{"class":2705},[22,71178,71179],{},"To get only the responses, access the responses property of the GenAiPrompt object. Here's a quick example:",[2584,71181,71183],{"className":37862,"code":71182,"language":37864,"meta":2433,"style":2433},"print(response.genai_prompt.responses)\n",[36,71184,71185],{"__ignoreMap":2433},[414,71186,71187,71189],{"class":2593,"line":2594},[414,71188,38395],{"class":2607},[414,71190,71191],{"class":2705},"(response.genai_prompt.responses)\n",[22,71193,71194],{},"You should a result similar to this:",[2584,71196,71198],{"className":37862,"code":71197,"language":37864,"meta":2433,"style":2433},"['I am an AI assistant called Claude. I was created by Anthropic, PBC to be helpful, harmless, and honest.']\n",[36,71199,71200],{"__ignoreMap":2433},[414,71201,71202,71204,71206],{"class":2593,"line":2594},[414,71203,71152],{"class":2705},[414,71205,71155],{"class":2601},[414,71207,9376],{"class":2705},[22,71209,71210],{},[31,71211,71212],{},"Create a prompt and send it to OpenAI",[22,71214,71215],{},"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…",[2584,71217,71219],{"className":37862,"code":71218,"language":37864,"meta":2433,"style":2433},"connection_id = CLAUDE_CONNECTION_ID,\n",[36,71220,71221],{"__ignoreMap":2433},[414,71222,71223,71226,71228,71230],{"class":2593,"line":2594},[414,71224,71225],{"class":2705},"connection_id ",[414,71227,2798],{"class":2698},[414,71229,70824],{"class":2607},[414,71231,2757],{"class":2705},[22,71233,71234],{},"…to this:",[2584,71236,71238],{"className":37862,"code":71237,"language":37864,"meta":2433,"style":2433},"connection_id = OPENAI_CONNECTION_ID,\n",[36,71239,71240],{"__ignoreMap":2433},[414,71241,71242,71244,71246,71249],{"class":2593,"line":2594},[414,71243,71225],{"class":2705},[414,71245,2798],{"class":2698},[414,71247,71248],{"class":2607}," OPENAI_CONNECTION_ID",[414,71250,2757],{"class":2705},[22,71252,71253],{},"The new cell should now look like this:",[2584,71255,71257],{"className":37862,"code":71256,"language":37864,"meta":2433,"style":2433},"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",[36,71258,71259,71268,71278,71286,71292,71296,71306,71314,71318,71322,71326,71330,71339,71343,71357,71363,71369],{"__ignoreMap":2433},[414,71260,71261,71264,71266],{"class":2593,"line":2594},[414,71262,71263],{"class":2705},"request ",[414,71265,2798],{"class":2698},[414,71267,70815],{"class":2705},[414,71269,71270,71272,71274,71276],{"class":2593,"line":2434},[414,71271,25325],{"class":2971},[414,71273,2817],{"class":2698},[414,71275,71248],{"class":2607},[414,71277,2757],{"class":2705},[414,71279,71280,71282,71284],{"class":2593,"line":2613},[414,71281,70831],{"class":2971},[414,71283,2817],{"class":2698},[414,71285,2748],{"class":2705},[414,71287,71288,71290],{"class":2593,"line":2625},[414,71289,70840],{"class":2601},[414,71291,70843],{"class":2705},[414,71293,71294],{"class":2593,"line":2677},[414,71295,70848],{"class":2705},[414,71297,71298,71300,71302,71304],{"class":2593,"line":2751},[414,71299,70853],{"class":2601},[414,71301,7340],{"class":2705},[414,71303,30893],{"class":2601},[414,71305,2757],{"class":2705},[414,71307,71308,71310,71312],{"class":2593,"line":2760},[414,71309,70864],{"class":2601},[414,71311,7340],{"class":2705},[414,71313,70869],{"class":2601},[414,71315,71316],{"class":2593,"line":2768},[414,71317,65438],{"class":2705},[414,71319,71320],{"class":2593,"line":2776},[414,71321,70878],{"class":2705},[414,71323,71324],{"class":2593,"line":2784},[414,71325,10535],{"class":2705},[414,71327,71328],{"class":2593,"line":2792},[414,71329,3141],{"class":2705},[414,71331,71332,71334,71336],{"class":2593,"line":2804},[414,71333,39519],{"class":2705},[414,71335,2798],{"class":2698},[414,71337,71338],{"class":2705}," api.genai.create_genai_prompt(request)\n",[414,71340,71341],{"class":2593,"line":2809},[414,71342,2740],{"emptyLinePlaceholder":2459},[414,71344,71345,71347,71349,71351,71353,71355],{"class":2593,"line":2829},[414,71346,38417],{"class":2698},[414,71348,70913],{"class":2705},[414,71350,64997],{"class":2698},[414,71352,70918],{"class":2698},[414,71354,70921],{"class":2607},[414,71356,38099],{"class":2705},[414,71358,71359,71361],{"class":2593,"line":2843},[414,71360,41999],{"class":2607},[414,71362,70930],{"class":2705},[414,71364,71365,71367],{"class":2593,"line":2849},[414,71366,25123],{"class":2698},[414,71368,38099],{"class":2705},[414,71370,71371,71373,71375,71377],{"class":2593,"line":2854},[414,71372,41999],{"class":2607},[414,71374,2968],{"class":2705},[414,71376,70945],{"class":2601},[414,71378,3141],{"class":2705},[22,71380,71039],{},[2584,71382,71384],{"className":37862,"code":71383,"language":37864,"meta":2433,"style":2433},"CreateGenaiPromptResponse(\n    content_type='application\u002Fjson; 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",[36,71385,71386,71390,71400,71410,71426,71434,71444,71454,71464,71474,71487,71495,71499],{"__ignoreMap":2433},[414,71387,71388],{"class":2593,"line":2594},[414,71389,71049],{"class":2705},[414,71391,71392,71394,71396,71398],{"class":2593,"line":2434},[414,71393,71054],{"class":2971},[414,71395,2798],{"class":2698},[414,71397,71059],{"class":2601},[414,71399,32627],{"class":2705},[414,71401,71402,71404,71406,71408],{"class":2593,"line":2613},[414,71403,71066],{"class":2971},[414,71405,2798],{"class":2698},[414,71407,29784],{"class":2607},[414,71409,32627],{"class":2705},[414,71411,71412,71414,71416,71418,71420,71422,71424],{"class":2593,"line":2625},[414,71413,71077],{"class":2971},[414,71415,71080],{"class":2698},[414,71417,71083],{"class":2705},[414,71419,29784],{"class":2607},[414,71421,17035],{"class":2705},[414,71423,54166],{"class":2698},[414,71425,32627],{"class":2705},[414,71427,71428,71430,71432],{"class":2593,"line":2677},[414,71429,70831],{"class":2971},[414,71431,2798],{"class":2698},[414,71433,71100],{"class":2705},[414,71435,71436,71438,71440,71442],{"class":2593,"line":2751},[414,71437,38126],{"class":2971},[414,71439,2798],{"class":2698},[414,71441,21964],{"class":2607},[414,71443,32627],{"class":2705},[414,71445,71446,71448,71450,71452],{"class":2593,"line":2760},[414,71447,38148],{"class":2971},[414,71449,2798],{"class":2698},[414,71451,21964],{"class":2607},[414,71453,32627],{"class":2705},[414,71455,71456,71458,71460,71462],{"class":2593,"line":2768},[414,71457,71125],{"class":2971},[414,71459,2798],{"class":2698},[414,71461,21964],{"class":2607},[414,71463,32627],{"class":2705},[414,71465,71466,71468,71470,71472],{"class":2593,"line":2776},[414,71467,71136],{"class":2971},[414,71469,2798],{"class":2698},[414,71471,21964],{"class":2607},[414,71473,32627],{"class":2705},[414,71475,71476,71478,71480,71482,71485],{"class":2593,"line":2784},[414,71477,71147],{"class":2971},[414,71479,2798],{"class":2698},[414,71481,71152],{"class":2705},[414,71483,71484],{"class":2601},"\"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.\"",[414,71486,71158],{"class":2705},[414,71488,71489,71491,71493],{"class":2593,"line":2792},[414,71490,71163],{"class":2971},[414,71492,2798],{"class":2698},[414,71494,71168],{"class":2607},[414,71496,71497],{"class":2593,"line":2804},[414,71498,38158],{"class":2705},[414,71500,71501],{"class":2593,"line":2809},[414,71502,3141],{"class":2705},[22,71504,71505],{},"As with the Claude version, you can get only the responses with code like this…",[2584,71507,71508],{"className":37862,"code":71182,"language":37864,"meta":2433,"style":2433},[36,71509,71510],{"__ignoreMap":2433},[414,71511,71512,71514],{"class":2593,"line":2594},[414,71513,38395],{"class":2607},[414,71515,71191],{"class":2705},[22,71517,71518],{},"…which will produce results like this:",[2584,71520,71522],{"className":37862,"code":71521,"language":37864,"meta":2433,"style":2433},"[\"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",[36,71523,71524],{"__ignoreMap":2433},[414,71525,71526,71528,71530],{"class":2593,"line":2594},[414,71527,71152],{"class":2705},[414,71529,71484],{"class":2601},[414,71531,9376],{"class":2705},[22,71533,71534],{},[31,71535,71536],{},"Add a system prompt for OpenAI",[22,71538,71539,71540,71542],{},"Copy the cell above (the one that sent a prompt to OpenAI) and update the code as shown below so that the ",[36,71541,70986],{}," array contains a system prompt:",[2584,71544,71546],{"className":37862,"code":71545,"language":37864,"meta":2433,"style":2433},"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",[36,71547,71548,71556,71566,71574,71580,71585,71589,71599,71608,71612,71617,71621,71631,71639,71643,71647,71651,71655,71670,71674,71688,71694,71700],{"__ignoreMap":2433},[414,71549,71550,71552,71554],{"class":2593,"line":2594},[414,71551,71263],{"class":2705},[414,71553,2798],{"class":2698},[414,71555,70815],{"class":2705},[414,71557,71558,71560,71562,71564],{"class":2593,"line":2434},[414,71559,25325],{"class":2971},[414,71561,2817],{"class":2698},[414,71563,71248],{"class":2607},[414,71565,2757],{"class":2705},[414,71567,71568,71570,71572],{"class":2593,"line":2613},[414,71569,70831],{"class":2971},[414,71571,2817],{"class":2698},[414,71573,2748],{"class":2705},[414,71575,71576,71578],{"class":2593,"line":2625},[414,71577,70840],{"class":2601},[414,71579,70843],{"class":2705},[414,71581,71582],{"class":2593,"line":2677},[414,71583,71584],{"class":3527},"            # New code 👇\n",[414,71586,71587],{"class":2593,"line":2751},[414,71588,70848],{"class":2705},[414,71590,71591,71593,71595,71597],{"class":2593,"line":2760},[414,71592,70853],{"class":2601},[414,71594,7340],{"class":2705},[414,71596,71001],{"class":2601},[414,71598,2757],{"class":2705},[414,71600,71601,71603,71605],{"class":2593,"line":2768},[414,71602,70864],{"class":2601},[414,71604,7340],{"class":2705},[414,71606,71607],{"class":2601},"\"Provide answers as if you were a carnival barker.\"\n",[414,71609,71610],{"class":2593,"line":2776},[414,71611,39647],{"class":2705},[414,71613,71614],{"class":2593,"line":2784},[414,71615,71616],{"class":3527},"            # New code 👆\n",[414,71618,71619],{"class":2593,"line":2792},[414,71620,70848],{"class":2705},[414,71622,71623,71625,71627,71629],{"class":2593,"line":2804},[414,71624,70853],{"class":2601},[414,71626,7340],{"class":2705},[414,71628,30893],{"class":2601},[414,71630,2757],{"class":2705},[414,71632,71633,71635,71637],{"class":2593,"line":2809},[414,71634,70864],{"class":2601},[414,71636,7340],{"class":2705},[414,71638,70869],{"class":2601},[414,71640,71641],{"class":2593,"line":2829},[414,71642,65438],{"class":2705},[414,71644,71645],{"class":2593,"line":2843},[414,71646,70878],{"class":2705},[414,71648,71649],{"class":2593,"line":2849},[414,71650,10535],{"class":2705},[414,71652,71653],{"class":2593,"line":2854},[414,71654,3141],{"class":2705},[414,71656,71657,71659,71661,71663,71665,71667],{"class":2593,"line":2880},[414,71658,39519],{"class":2705},[414,71660,2798],{"class":2698},[414,71662,70895],{"class":2705},[414,71664,47570],{"class":2971},[414,71666,2798],{"class":2698},[414,71668,71669],{"class":2705},"request)\n",[414,71671,71672],{"class":2593,"line":3253},[414,71673,2740],{"emptyLinePlaceholder":2459},[414,71675,71676,71678,71680,71682,71684,71686],{"class":2593,"line":3261},[414,71677,38417],{"class":2698},[414,71679,70913],{"class":2705},[414,71681,64997],{"class":2698},[414,71683,70918],{"class":2698},[414,71685,70921],{"class":2607},[414,71687,38099],{"class":2705},[414,71689,71690,71692],{"class":2593,"line":3279},[414,71691,41999],{"class":2607},[414,71693,70930],{"class":2705},[414,71695,71696,71698],{"class":2593,"line":3313},[414,71697,25123],{"class":2698},[414,71699,38099],{"class":2705},[414,71701,71702,71704,71706,71708],{"class":2593,"line":3326},[414,71703,41999],{"class":2607},[414,71705,2968],{"class":2705},[414,71707,70945],{"class":2601},[414,71709,3141],{"class":2705},[22,71711,71039],{},[2584,71713,71715],{"className":37862,"code":71714,"language":37864,"meta":2433,"style":2433},"CreateGenaiPromptResponse(\n    content_type='application\u002Fjson; 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",[36,71716,71717,71721,71731,71741,71757,71765,71775,71785,71795,71805,71818,71826,71830],{"__ignoreMap":2433},[414,71718,71719],{"class":2593,"line":2594},[414,71720,71049],{"class":2705},[414,71722,71723,71725,71727,71729],{"class":2593,"line":2434},[414,71724,71054],{"class":2971},[414,71726,2798],{"class":2698},[414,71728,71059],{"class":2601},[414,71730,32627],{"class":2705},[414,71732,71733,71735,71737,71739],{"class":2593,"line":2613},[414,71734,71066],{"class":2971},[414,71736,2798],{"class":2698},[414,71738,29784],{"class":2607},[414,71740,32627],{"class":2705},[414,71742,71743,71745,71747,71749,71751,71753,71755],{"class":2593,"line":2625},[414,71744,71077],{"class":2971},[414,71746,71080],{"class":2698},[414,71748,71083],{"class":2705},[414,71750,29784],{"class":2607},[414,71752,17035],{"class":2705},[414,71754,54166],{"class":2698},[414,71756,32627],{"class":2705},[414,71758,71759,71761,71763],{"class":2593,"line":2677},[414,71760,70831],{"class":2971},[414,71762,2798],{"class":2698},[414,71764,71100],{"class":2705},[414,71766,71767,71769,71771,71773],{"class":2593,"line":2751},[414,71768,38126],{"class":2971},[414,71770,2798],{"class":2698},[414,71772,21964],{"class":2607},[414,71774,32627],{"class":2705},[414,71776,71777,71779,71781,71783],{"class":2593,"line":2760},[414,71778,38148],{"class":2971},[414,71780,2798],{"class":2698},[414,71782,21964],{"class":2607},[414,71784,32627],{"class":2705},[414,71786,71787,71789,71791,71793],{"class":2593,"line":2768},[414,71788,71125],{"class":2971},[414,71790,2798],{"class":2698},[414,71792,21964],{"class":2607},[414,71794,32627],{"class":2705},[414,71796,71797,71799,71801,71803],{"class":2593,"line":2776},[414,71798,71136],{"class":2971},[414,71800,2798],{"class":2698},[414,71802,21964],{"class":2607},[414,71804,32627],{"class":2705},[414,71806,71807,71809,71811,71813,71816],{"class":2593,"line":2784},[414,71808,71147],{"class":2971},[414,71810,2798],{"class":2698},[414,71812,71152],{"class":2705},[414,71814,71815],{"class":2601},"\"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!\"",[414,71817,71158],{"class":2705},[414,71819,71820,71822,71824],{"class":2593,"line":2792},[414,71821,71163],{"class":2971},[414,71823,2798],{"class":2698},[414,71825,71168],{"class":2607},[414,71827,71828],{"class":2593,"line":2804},[414,71829,38158],{"class":2705},[414,71831,71832],{"class":2593,"line":2809},[414,71833,3141],{"class":2705},[22,71835,71836,71837,71840,71841,71846],{},"As you can see from the value of ",[36,71838,71839],{},"response.genai_prompt.responses",", OpenAI's response sounds like a ",[41,71842,71845],{"href":71843,"rel":71844},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FBarker_(occupation)",[45],"carnival barker"," instead of its default style.",[22,71848,71849],{},[31,71850,71851],{},"Add a system prompt for Claude",[22,71853,71854],{},"Copy the code from the previous cell, paste it into a new cell and change this line…",[2584,71856,71857],{"className":37862,"code":71237,"language":37864,"meta":2433,"style":2433},[36,71858,71859],{"__ignoreMap":2433},[414,71860,71861,71863,71865,71867],{"class":2593,"line":2594},[414,71862,71225],{"class":2705},[414,71864,2798],{"class":2698},[414,71866,71248],{"class":2607},[414,71868,2757],{"class":2705},[22,71870,71234],{},[2584,71872,71873],{"className":37862,"code":71218,"language":37864,"meta":2433,"style":2433},[36,71874,71875],{"__ignoreMap":2433},[414,71876,71877,71879,71881,71883],{"class":2593,"line":2594},[414,71878,71225],{"class":2705},[414,71880,2798],{"class":2698},[414,71882,70824],{"class":2607},[414,71884,2757],{"class":2705},[22,71886,71253],{},[2584,71888,71890],{"className":37862,"code":71889,"language":37864,"meta":2433,"style":2433},"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",[36,71891,71892,71900,71910,71918,71924,71928,71932,71942,71950,71954,71958,71962,71972,71980,71984,71988,71992,71996,72010,72014,72028,72034,72040],{"__ignoreMap":2433},[414,71893,71894,71896,71898],{"class":2593,"line":2594},[414,71895,71263],{"class":2705},[414,71897,2798],{"class":2698},[414,71899,70815],{"class":2705},[414,71901,71902,71904,71906,71908],{"class":2593,"line":2434},[414,71903,25325],{"class":2971},[414,71905,2817],{"class":2698},[414,71907,70824],{"class":2607},[414,71909,2757],{"class":2705},[414,71911,71912,71914,71916],{"class":2593,"line":2613},[414,71913,70831],{"class":2971},[414,71915,2817],{"class":2698},[414,71917,2748],{"class":2705},[414,71919,71920,71922],{"class":2593,"line":2625},[414,71921,70840],{"class":2601},[414,71923,70843],{"class":2705},[414,71925,71926],{"class":2593,"line":2677},[414,71927,71584],{"class":3527},[414,71929,71930],{"class":2593,"line":2751},[414,71931,70848],{"class":2705},[414,71933,71934,71936,71938,71940],{"class":2593,"line":2760},[414,71935,70853],{"class":2601},[414,71937,7340],{"class":2705},[414,71939,71001],{"class":2601},[414,71941,2757],{"class":2705},[414,71943,71944,71946,71948],{"class":2593,"line":2768},[414,71945,70864],{"class":2601},[414,71947,7340],{"class":2705},[414,71949,71607],{"class":2601},[414,71951,71952],{"class":2593,"line":2776},[414,71953,39647],{"class":2705},[414,71955,71956],{"class":2593,"line":2784},[414,71957,71616],{"class":3527},[414,71959,71960],{"class":2593,"line":2792},[414,71961,70848],{"class":2705},[414,71963,71964,71966,71968,71970],{"class":2593,"line":2804},[414,71965,70853],{"class":2601},[414,71967,7340],{"class":2705},[414,71969,30893],{"class":2601},[414,71971,2757],{"class":2705},[414,71973,71974,71976,71978],{"class":2593,"line":2809},[414,71975,70864],{"class":2601},[414,71977,7340],{"class":2705},[414,71979,70869],{"class":2601},[414,71981,71982],{"class":2593,"line":2829},[414,71983,65438],{"class":2705},[414,71985,71986],{"class":2593,"line":2843},[414,71987,70878],{"class":2705},[414,71989,71990],{"class":2593,"line":2849},[414,71991,10535],{"class":2705},[414,71993,71994],{"class":2593,"line":2854},[414,71995,3141],{"class":2705},[414,71997,71998,72000,72002,72004,72006,72008],{"class":2593,"line":2880},[414,71999,39519],{"class":2705},[414,72001,2798],{"class":2698},[414,72003,70895],{"class":2705},[414,72005,47570],{"class":2971},[414,72007,2798],{"class":2698},[414,72009,71669],{"class":2705},[414,72011,72012],{"class":2593,"line":3253},[414,72013,2740],{"emptyLinePlaceholder":2459},[414,72015,72016,72018,72020,72022,72024,72026],{"class":2593,"line":3261},[414,72017,38417],{"class":2698},[414,72019,70913],{"class":2705},[414,72021,64997],{"class":2698},[414,72023,70918],{"class":2698},[414,72025,70921],{"class":2607},[414,72027,38099],{"class":2705},[414,72029,72030,72032],{"class":2593,"line":3279},[414,72031,41999],{"class":2607},[414,72033,70930],{"class":2705},[414,72035,72036,72038],{"class":2593,"line":3313},[414,72037,25123],{"class":2698},[414,72039,38099],{"class":2705},[414,72041,72042,72044,72046,72048],{"class":2593,"line":3326},[414,72043,41999],{"class":2607},[414,72045,2968],{"class":2705},[414,72047,70945],{"class":2601},[414,72049,3141],{"class":2705},[22,72051,71039],{},[2584,72053,72055],{"className":37862,"code":72054,"language":37864,"meta":2433,"style":2433},"CreateGenaiPromptResponse(\n    content_type='application\u002Fjson; 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",[36,72056,72057,72061,72071,72081,72097,72105,72115,72125,72135,72145,72158,72166,72170],{"__ignoreMap":2433},[414,72058,72059],{"class":2593,"line":2594},[414,72060,71049],{"class":2705},[414,72062,72063,72065,72067,72069],{"class":2593,"line":2434},[414,72064,71054],{"class":2971},[414,72066,2798],{"class":2698},[414,72068,71059],{"class":2601},[414,72070,32627],{"class":2705},[414,72072,72073,72075,72077,72079],{"class":2593,"line":2613},[414,72074,71066],{"class":2971},[414,72076,2798],{"class":2698},[414,72078,29784],{"class":2607},[414,72080,32627],{"class":2705},[414,72082,72083,72085,72087,72089,72091,72093,72095],{"class":2593,"line":2625},[414,72084,71077],{"class":2971},[414,72086,71080],{"class":2698},[414,72088,71083],{"class":2705},[414,72090,29784],{"class":2607},[414,72092,17035],{"class":2705},[414,72094,54166],{"class":2698},[414,72096,32627],{"class":2705},[414,72098,72099,72101,72103],{"class":2593,"line":2677},[414,72100,70831],{"class":2971},[414,72102,2798],{"class":2698},[414,72104,71100],{"class":2705},[414,72106,72107,72109,72111,72113],{"class":2593,"line":2751},[414,72108,38126],{"class":2971},[414,72110,2798],{"class":2698},[414,72112,21964],{"class":2607},[414,72114,32627],{"class":2705},[414,72116,72117,72119,72121,72123],{"class":2593,"line":2760},[414,72118,38148],{"class":2971},[414,72120,2798],{"class":2698},[414,72122,21964],{"class":2607},[414,72124,32627],{"class":2705},[414,72126,72127,72129,72131,72133],{"class":2593,"line":2768},[414,72128,71125],{"class":2971},[414,72130,2798],{"class":2698},[414,72132,21964],{"class":2607},[414,72134,32627],{"class":2705},[414,72136,72137,72139,72141,72143],{"class":2593,"line":2776},[414,72138,71136],{"class":2971},[414,72140,2798],{"class":2698},[414,72142,21964],{"class":2607},[414,72144,32627],{"class":2705},[414,72146,72147,72149,72151,72153,72156],{"class":2593,"line":2784},[414,72148,71147],{"class":2971},[414,72150,2798],{"class":2698},[414,72152,71152],{"class":2705},[414,72154,72155],{"class":2601},"\"*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!\"",[414,72157,71158],{"class":2705},[414,72159,72160,72162,72164],{"class":2593,"line":2792},[414,72161,71163],{"class":2971},[414,72163,2798],{"class":2698},[414,72165,71168],{"class":2607},[414,72167,72168],{"class":2593,"line":2804},[414,72169,38158],{"class":2705},[414,72171,72172],{"class":2593,"line":2809},[414,72173,3141],{"class":2705},[22,72175,72176],{},"Note that Claude is now 'speaking' like a carnival barker.",[55,72178,72180],{"id":72179},"turn-up-the-temperature","Turn up the temperature",[22,72182,72183,72184,72187],{},"One of the key parameters of a large language model is ",[25,72185,72186],{},"temperature",", which controls the randomness of the model's output. It's a value that ranges from 0 to 1 where:",[2354,72189,72190,72193],{},[2357,72191,72192],{},"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.",[2357,72194,72195],{},"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.",[22,72197,72198,72199,72202,72203,72205,72206,72209],{},"Copy the previous cell and add a ",[36,72200,72201],{},"'temperature'"," key to the ",[36,72204,70976],{}," dictionary with a value of ",[36,72207,72208],{},"1.0",". The code in the cell should look like this:",[2584,72211,72213],{"className":37862,"code":72212,"language":37864,"meta":2433,"style":2433},"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",[36,72214,72215,72223,72233,72241,72246,72258,72263,72269,72273,72283,72291,72295,72299,72309,72317,72321,72325,72329,72333,72347,72351,72365,72371,72377],{"__ignoreMap":2433},[414,72216,72217,72219,72221],{"class":2593,"line":2594},[414,72218,71263],{"class":2705},[414,72220,2798],{"class":2698},[414,72222,70815],{"class":2705},[414,72224,72225,72227,72229,72231],{"class":2593,"line":2434},[414,72226,25325],{"class":2971},[414,72228,2817],{"class":2698},[414,72230,70824],{"class":2607},[414,72232,2757],{"class":2705},[414,72234,72235,72237,72239],{"class":2593,"line":2613},[414,72236,70831],{"class":2971},[414,72238,2817],{"class":2698},[414,72240,2748],{"class":2705},[414,72242,72243],{"class":2593,"line":2625},[414,72244,72245],{"class":3527},"        # New code 👇\n",[414,72247,72248,72251,72254,72256],{"class":2593,"line":2677},[414,72249,72250],{"class":2601},"        'temperature'",[414,72252,72253],{"class":2705}," : ",[414,72255,72208],{"class":2607},[414,72257,2757],{"class":2705},[414,72259,72260],{"class":2593,"line":2751},[414,72261,72262],{"class":3527},"        # New code 👆\n",[414,72264,72265,72267],{"class":2593,"line":2760},[414,72266,70840],{"class":2601},[414,72268,70843],{"class":2705},[414,72270,72271],{"class":2593,"line":2768},[414,72272,70848],{"class":2705},[414,72274,72275,72277,72279,72281],{"class":2593,"line":2776},[414,72276,70853],{"class":2601},[414,72278,7340],{"class":2705},[414,72280,71001],{"class":2601},[414,72282,2757],{"class":2705},[414,72284,72285,72287,72289],{"class":2593,"line":2784},[414,72286,70864],{"class":2601},[414,72288,7340],{"class":2705},[414,72290,71607],{"class":2601},[414,72292,72293],{"class":2593,"line":2792},[414,72294,39647],{"class":2705},[414,72296,72297],{"class":2593,"line":2804},[414,72298,70848],{"class":2705},[414,72300,72301,72303,72305,72307],{"class":2593,"line":2809},[414,72302,70853],{"class":2601},[414,72304,7340],{"class":2705},[414,72306,30893],{"class":2601},[414,72308,2757],{"class":2705},[414,72310,72311,72313,72315],{"class":2593,"line":2829},[414,72312,70864],{"class":2601},[414,72314,7340],{"class":2705},[414,72316,70869],{"class":2601},[414,72318,72319],{"class":2593,"line":2843},[414,72320,65438],{"class":2705},[414,72322,72323],{"class":2593,"line":2849},[414,72324,70878],{"class":2705},[414,72326,72327],{"class":2593,"line":2854},[414,72328,10535],{"class":2705},[414,72330,72331],{"class":2593,"line":2880},[414,72332,3141],{"class":2705},[414,72334,72335,72337,72339,72341,72343,72345],{"class":2593,"line":3253},[414,72336,39519],{"class":2705},[414,72338,2798],{"class":2698},[414,72340,70895],{"class":2705},[414,72342,47570],{"class":2971},[414,72344,2798],{"class":2698},[414,72346,71669],{"class":2705},[414,72348,72349],{"class":2593,"line":3261},[414,72350,2740],{"emptyLinePlaceholder":2459},[414,72352,72353,72355,72357,72359,72361,72363],{"class":2593,"line":3279},[414,72354,38417],{"class":2698},[414,72356,70913],{"class":2705},[414,72358,64997],{"class":2698},[414,72360,70918],{"class":2698},[414,72362,70921],{"class":2607},[414,72364,38099],{"class":2705},[414,72366,72367,72369],{"class":2593,"line":3313},[414,72368,41999],{"class":2607},[414,72370,70930],{"class":2705},[414,72372,72373,72375],{"class":2593,"line":3326},[414,72374,25123],{"class":2698},[414,72376,38099],{"class":2705},[414,72378,72379,72381,72383,72385],{"class":2593,"line":3339},[414,72380,41999],{"class":2607},[414,72382,2968],{"class":2705},[414,72384,70945],{"class":2601},[414,72386,3141],{"class":2705},[22,72388,72389],{},"With a temperature of 1.0, Claude should produce a differently-worded response each time you run the cell.",[22,72391,72392,72393,72395,72396,97],{},"You can try the same thing with OpenAI simply by changing the value of the ",[36,72394,85],{}," parameter to ",[36,72397,70716],{},[55,72399,72401],{"id":72400},"work-with-different-llm-models","Work with different LLM models",[22,72403,72404],{},"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.",[22,72406,72407],{},[31,72408,72409],{},"Get a list of the current LLM model IDs",[22,72411,72412],{},"Create a new cell, enter the following code into it, and run it:",[2584,72414,72416],{"className":37862,"code":72415,"language":37864,"meta":2433,"style":2433},"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",[36,72417,72418,72427,72436,72440,72449],{"__ignoreMap":2433},[414,72419,72420,72422,72424],{"class":2593,"line":2594},[414,72421,71263],{"class":2705},[414,72423,2798],{"class":2698},[414,72425,72426],{"class":2705}," operations.ListGenaiModelsRequest(\n",[414,72428,72429,72431,72433],{"class":2593,"line":2434},[414,72430,25325],{"class":2971},[414,72432,2817],{"class":2698},[414,72434,72435],{"class":2607}," OPENAI_CONNECTION_ID\n",[414,72437,72438],{"class":2593,"line":2613},[414,72439,3141],{"class":2705},[414,72441,72442,72444,72446],{"class":2593,"line":2625},[414,72443,39519],{"class":2705},[414,72445,2798],{"class":2698},[414,72447,72448],{"class":2705}," api.genai.list_genai_models(request)\n",[414,72450,72451,72453,72455,72458,72461,72463,72466,72468],{"class":2593,"line":2677},[414,72452,38395],{"class":2607},[414,72454,2968],{"class":2705},[414,72456,72457],{"class":2607},"sorted",[414,72459,72460],{"class":2705},"([model.id ",[414,72462,38406],{"class":2698},[414,72464,72465],{"class":2705}," model ",[414,72467,38217],{"class":2698},[414,72469,72470],{"class":2705}," response.genai_models]))\n",[22,72472,72473,72474,72477,72478,72481],{},"This code uses the ",[41,72475,123],{"href":121,"rel":72476},[45]," Python SDK's ",[36,72479,72480],{},"genai.list_genai_models()"," 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):",[2584,72483,72485],{"className":37862,"code":72484,"language":37864,"meta":2433,"style":2433},"[\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",[36,72486,72487,72491,72498,72505,72512,72519,72526,72533,72540,72547,72554,72561,72568,72575,72582,72589,72596,72603,72610,72617,72624,72631,72638,72645,72652,72659,72666,72673,72680,72687,72694,72701,72708,72713],{"__ignoreMap":2433},[414,72488,72489],{"class":2593,"line":2594},[414,72490,9310],{"class":2705},[414,72492,72493,72496],{"class":2593,"line":2434},[414,72494,72495],{"class":2601},"    'babbage-002'",[414,72497,32627],{"class":2705},[414,72499,72500,72503],{"class":2593,"line":2613},[414,72501,72502],{"class":2601},"    'dall-e-2'",[414,72504,32627],{"class":2705},[414,72506,72507,72510],{"class":2593,"line":2625},[414,72508,72509],{"class":2601},"    'dall-e-3'",[414,72511,32627],{"class":2705},[414,72513,72514,72517],{"class":2593,"line":2677},[414,72515,72516],{"class":2601},"    'davinci-002'",[414,72518,32627],{"class":2705},[414,72520,72521,72524],{"class":2593,"line":2751},[414,72522,72523],{"class":2601},"    'gpt-3.5-turbo'",[414,72525,32627],{"class":2705},[414,72527,72528,72531],{"class":2593,"line":2760},[414,72529,72530],{"class":2601},"    'gpt-3.5-turbo-0125'",[414,72532,32627],{"class":2705},[414,72534,72535,72538],{"class":2593,"line":2768},[414,72536,72537],{"class":2601},"    'gpt-3.5-turbo-0301'",[414,72539,32627],{"class":2705},[414,72541,72542,72545],{"class":2593,"line":2776},[414,72543,72544],{"class":2601},"    'gpt-3.5-turbo-0613'",[414,72546,32627],{"class":2705},[414,72548,72549,72552],{"class":2593,"line":2784},[414,72550,72551],{"class":2601},"    'gpt-3.5-turbo-1106'",[414,72553,32627],{"class":2705},[414,72555,72556,72559],{"class":2593,"line":2792},[414,72557,72558],{"class":2601},"    'gpt-3.5-turbo-16k'",[414,72560,32627],{"class":2705},[414,72562,72563,72566],{"class":2593,"line":2804},[414,72564,72565],{"class":2601},"    'gpt-3.5-turbo-16k-0613'",[414,72567,32627],{"class":2705},[414,72569,72570,72573],{"class":2593,"line":2809},[414,72571,72572],{"class":2601},"    'gpt-3.5-turbo-instruct'",[414,72574,32627],{"class":2705},[414,72576,72577,72580],{"class":2593,"line":2829},[414,72578,72579],{"class":2601},"    'gpt-3.5-turbo-instruct-0914'",[414,72581,32627],{"class":2705},[414,72583,72584,72587],{"class":2593,"line":2843},[414,72585,72586],{"class":2601},"    'gpt-4'",[414,72588,32627],{"class":2705},[414,72590,72591,72594],{"class":2593,"line":2849},[414,72592,72593],{"class":2601},"    'gpt-4-0125-preview'",[414,72595,32627],{"class":2705},[414,72597,72598,72601],{"class":2593,"line":2854},[414,72599,72600],{"class":2601},"    'gpt-4-0613'",[414,72602,32627],{"class":2705},[414,72604,72605,72608],{"class":2593,"line":2880},[414,72606,72607],{"class":2601},"    'gpt-4-1106-preview'",[414,72609,32627],{"class":2705},[414,72611,72612,72615],{"class":2593,"line":3253},[414,72613,72614],{"class":2601},"    'gpt-4-1106-vision-preview'",[414,72616,32627],{"class":2705},[414,72618,72619,72622],{"class":2593,"line":3261},[414,72620,72621],{"class":2601},"    'gpt-4-turbo'",[414,72623,32627],{"class":2705},[414,72625,72626,72629],{"class":2593,"line":3279},[414,72627,72628],{"class":2601},"    'gpt-4-turbo-2024-04-09'",[414,72630,32627],{"class":2705},[414,72632,72633,72636],{"class":2593,"line":3313},[414,72634,72635],{"class":2601},"    'gpt-4-turbo-preview'",[414,72637,32627],{"class":2705},[414,72639,72640,72643],{"class":2593,"line":3326},[414,72641,72642],{"class":2601},"    'gpt-4-vision-preview'",[414,72644,32627],{"class":2705},[414,72646,72647,72650],{"class":2593,"line":3339},[414,72648,72649],{"class":2601},"    'gpt-4o'",[414,72651,32627],{"class":2705},[414,72653,72654,72657],{"class":2593,"line":3359},[414,72655,72656],{"class":2601},"    'gpt-4o-2024-05-13'",[414,72658,32627],{"class":2705},[414,72660,72661,72664],{"class":2593,"line":6453},[414,72662,72663],{"class":2601},"    'text-embedding-3-large'",[414,72665,32627],{"class":2705},[414,72667,72668,72671],{"class":2593,"line":6459},[414,72669,72670],{"class":2601},"    'text-embedding-3-small'",[414,72672,32627],{"class":2705},[414,72674,72675,72678],{"class":2593,"line":6465},[414,72676,72677],{"class":2601},"    'text-embedding-ada-002'",[414,72679,32627],{"class":2705},[414,72681,72682,72685],{"class":2593,"line":6471},[414,72683,72684],{"class":2601},"    'tts-1'",[414,72686,32627],{"class":2705},[414,72688,72689,72692],{"class":2593,"line":6477},[414,72690,72691],{"class":2601},"    'tts-1-1106'",[414,72693,32627],{"class":2705},[414,72695,72696,72699],{"class":2593,"line":6483},[414,72697,72698],{"class":2601},"    'tts-1-hd'",[414,72700,32627],{"class":2705},[414,72702,72703,72706],{"class":2593,"line":6489},[414,72704,72705],{"class":2601},"    'tts-1-hd-1106'",[414,72707,32627],{"class":2705},[414,72709,72710],{"class":2593,"line":6495},[414,72711,72712],{"class":2601},"    'whisper-1'\n",[414,72714,72715],{"class":2593,"line":6501},[414,72716,9376],{"class":2705},[22,72718,72719,72720,72722,72723,72725],{},"You can do the same for Claude simply by changing ",[36,72721,85],{},"'s value to ",[36,72724,70730],{},". The resulting output looks like this (formatted for easier reading):",[2584,72727,72729],{"className":37862,"code":72728,"language":37864,"meta":2433,"style":2433},"[\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",[36,72730,72731,72735,72742,72749,72756,72763,72770,72775],{"__ignoreMap":2433},[414,72732,72733],{"class":2593,"line":2594},[414,72734,9310],{"class":2705},[414,72736,72737,72740],{"class":2593,"line":2434},[414,72738,72739],{"class":2601},"    'claude-2.0'",[414,72741,32627],{"class":2705},[414,72743,72744,72747],{"class":2593,"line":2613},[414,72745,72746],{"class":2601},"    'claude-2.1'",[414,72748,32627],{"class":2705},[414,72750,72751,72754],{"class":2593,"line":2625},[414,72752,72753],{"class":2601},"    'claude-3-haiku-20240307'",[414,72755,32627],{"class":2705},[414,72757,72758,72761],{"class":2593,"line":2677},[414,72759,72760],{"class":2601},"    'claude-3-opus-20240229'",[414,72762,32627],{"class":2705},[414,72764,72765,72768],{"class":2593,"line":2751},[414,72766,72767],{"class":2601},"    'claude-3-sonnet-20240229'",[414,72769,32627],{"class":2705},[414,72771,72772],{"class":2593,"line":2760},[414,72773,72774],{"class":2601},"    'claude-instant-1.2'\n",[414,72776,72777],{"class":2593,"line":2768},[414,72778,9376],{"class":2705},[22,72780,72781],{},[31,72782,72783],{},"Talk to different OpenAI models",[22,72785,72786],{},"Run this code in a new cell:",[2584,72788,72790],{"className":37862,"code":72789,"language":37864,"meta":2433,"style":2433},"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",[36,72791,72792,72803,72812,72822,72831,72839,72846,72851,72862,72871,72875,72880,72884,72888,72896,72900,72914,72945,72952],{"__ignoreMap":2433},[414,72793,72794,72797,72800],{"class":2593,"line":2594},[414,72795,72796],{"class":2698},"def",[414,72798,72799],{"class":2597}," ask_ai_which_model",[414,72801,72802],{"class":2705},"(my_connection_id, my_model_id):\n",[414,72804,72805,72808,72810],{"class":2593,"line":2434},[414,72806,72807],{"class":2705},"    request ",[414,72809,2798],{"class":2698},[414,72811,70815],{"class":2705},[414,72813,72814,72817,72819],{"class":2593,"line":2613},[414,72815,72816],{"class":2971},"        connection_id",[414,72818,2817],{"class":2698},[414,72820,72821],{"class":2705}," my_connection_id,\n",[414,72823,72824,72827,72829],{"class":2593,"line":2625},[414,72825,72826],{"class":2971},"        genai_prompt",[414,72828,2817],{"class":2698},[414,72830,2748],{"class":2705},[414,72832,72833,72836],{"class":2593,"line":2677},[414,72834,72835],{"class":2601},"            'model_id'",[414,72837,72838],{"class":2705}," : my_model_id,\n",[414,72840,72841,72844],{"class":2593,"line":2751},[414,72842,72843],{"class":2601},"            'messages'",[414,72845,70843],{"class":2705},[414,72847,72848],{"class":2593,"line":2760},[414,72849,72850],{"class":2705},"                {\n",[414,72852,72853,72856,72858,72860],{"class":2593,"line":2768},[414,72854,72855],{"class":2601},"                    'role'",[414,72857,7340],{"class":2705},[414,72859,30893],{"class":2601},[414,72861,2757],{"class":2705},[414,72863,72864,72867,72869],{"class":2593,"line":2776},[414,72865,72866],{"class":2601},"                    'content'",[414,72868,7340],{"class":2705},[414,72870,70869],{"class":2601},[414,72872,72873],{"class":2593,"line":2784},[414,72874,65433],{"class":2705},[414,72876,72877],{"class":2593,"line":2792},[414,72878,72879],{"class":2705},"            ]\n",[414,72881,72882],{"class":2593,"line":2804},[414,72883,10641],{"class":2705},[414,72885,72886],{"class":2593,"line":2809},[414,72887,38158],{"class":2705},[414,72889,72890,72892,72894],{"class":2593,"line":2829},[414,72891,39755],{"class":2705},[414,72893,2798],{"class":2698},[414,72895,71338],{"class":2705},[414,72897,72898],{"class":2593,"line":2843},[414,72899,2740],{"emptyLinePlaceholder":2459},[414,72901,72902,72904,72906,72908,72910,72912],{"class":2593,"line":2849},[414,72903,25828],{"class":2698},[414,72905,70913],{"class":2705},[414,72907,64997],{"class":2698},[414,72909,70918],{"class":2698},[414,72911,70921],{"class":2607},[414,72913,38099],{"class":2705},[414,72915,72916,72919,72921,72923,72925,72927,72930,72932,72934,72936,72938,72941,72943],{"class":2593,"line":2854},[414,72917,72918],{"class":2607},"        print",[414,72920,2968],{"class":2705},[414,72922,37993],{"class":2698},[414,72924,7395],{"class":2601},[414,72926,28091],{"class":2607},[414,72928,72929],{"class":2705},"model_id",[414,72931,38264],{"class":2607},[414,72933,7340],{"class":2601},[414,72935,28091],{"class":2607},[414,72937,71839],{"class":2705},[414,72939,72940],{"class":2607},"}\\n",[414,72942,7395],{"class":2601},[414,72944,3141],{"class":2705},[414,72946,72947,72950],{"class":2593,"line":2880},[414,72948,72949],{"class":2698},"    else",[414,72951,38099],{"class":2705},[414,72953,72954,72956,72958,72960],{"class":2593,"line":3253},[414,72955,72918],{"class":2607},[414,72957,2968],{"class":2705},[414,72959,70945],{"class":2601},[414,72961,3141],{"class":2705},[22,72963,72964,72965,72968],{},"This defines the ",[36,72966,72967],{},"ask_ai_which_model()"," method, which will make it simpler to send the same prompt to different AIs and models.",[22,72970,72971],{},"Enter the following into a new cell:",[2584,72973,72975],{"className":37862,"code":72974,"language":37864,"meta":2433,"style":2433},"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",[36,72976,72977,72996,73000,73012],{"__ignoreMap":2433},[414,72978,72979,72982,72984,72986,72989,72991,72994],{"class":2593,"line":2594},[414,72980,72981],{"class":2705},"model_ids ",[414,72983,2798],{"class":2698},[414,72985,38752],{"class":2705},[414,72987,72988],{"class":2601},"'gpt-3.5-turbo'",[414,72990,319],{"class":2705},[414,72992,72993],{"class":2601},"'gpt-4o'",[414,72995,9376],{"class":2705},[414,72997,72998],{"class":2593,"line":2434},[414,72999,2740],{"emptyLinePlaceholder":2459},[414,73001,73002,73004,73007,73009],{"class":2593,"line":2613},[414,73003,38406],{"class":2698},[414,73005,73006],{"class":2705}," model_id ",[414,73008,38217],{"class":2698},[414,73010,73011],{"class":2705}," model_ids:\n",[414,73013,73014,73017,73019],{"class":2593,"line":2625},[414,73015,73016],{"class":2705},"    ask_ai_which_model(",[414,73018,70716],{"class":2607},[414,73020,73021],{"class":2705},", model_id)\n",[22,73023,73024,73025,73028,73029,73032,73033,73036,73037,73039],{},"This code sends the same prompt, 'Which LLM model am I talking to right now?' to two different OpenAI models, ",[31,73026,73027],{},"gpt-3.5-turbo"," and the new ",[31,73030,73031],{},"gpt-4o",". It specifies which model to use with the ",[36,73034,73035],{},"'model_id'"," key in the ",[36,73038,70976],{}," dictionary. Here's its output:",[2584,73041,73043],{"className":37862,"code":73042,"language":37864,"meta":2433,"style":2433},"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",[36,73044,73045,73065,73069],{"__ignoreMap":2433},[414,73046,73047,73050,73052,73055,73057,73060,73063],{"class":2593,"line":2594},[414,73048,73049],{"class":2705},"gpt",[414,73051,34146],{"class":2698},[414,73053,73054],{"class":2607},"3.5",[414,73056,34146],{"class":2698},[414,73058,73059],{"class":2705},"turbo: [",[414,73061,73062],{"class":2601},"'I am GPT-3, a language model developed by OpenAI.'",[414,73064,9376],{"class":2705},[414,73066,73067],{"class":2593,"line":2434},[414,73068,2740],{"emptyLinePlaceholder":2459},[414,73070,73071,73073,73075,73078,73080,73083],{"class":2593,"line":2613},[414,73072,73049],{"class":2705},[414,73074,34146],{"class":2698},[414,73076,73077],{"class":7401},"4o",[414,73079,10492],{"class":2705},[414,73081,73082],{"class":2601},"\"You are interacting with a model based on OpenAI's GPT-4. How can I assist you today?\"",[414,73084,9376],{"class":2705},[22,73086,73087],{},"Let's try it with Claude. Enter the following into a new cell:",[2584,73089,73091],{"className":37862,"code":73090,"language":37864,"meta":2433,"style":2433},"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",[36,73092,73093,73111,73115,73125],{"__ignoreMap":2433},[414,73094,73095,73097,73099,73101,73104,73106,73109],{"class":2593,"line":2594},[414,73096,72981],{"class":2705},[414,73098,2798],{"class":2698},[414,73100,38752],{"class":2705},[414,73102,73103],{"class":2601},"'claude-3-sonnet-20240229'",[414,73105,319],{"class":2705},[414,73107,73108],{"class":2601},"'claude-3-opus-20240229'",[414,73110,9376],{"class":2705},[414,73112,73113],{"class":2593,"line":2434},[414,73114,2740],{"emptyLinePlaceholder":2459},[414,73116,73117,73119,73121,73123],{"class":2593,"line":2613},[414,73118,38406],{"class":2698},[414,73120,73006],{"class":2705},[414,73122,38217],{"class":2698},[414,73124,73011],{"class":2705},[414,73126,73127,73129,73131],{"class":2593,"line":2625},[414,73128,73016],{"class":2705},[414,73130,70730],{"class":2607},[414,73132,73021],{"class":2705},[22,73134,73135,73136,741,73139,73142],{},"This code sends the 'Which LLM model am I talking to right now?' to two different Claude models, the currently available ",[31,73137,73138],{},"sonnet",[31,73140,73141],{},"opus"," models. Here's its output:",[2584,73144,73146],{"className":37862,"code":73145,"language":37864,"meta":2433,"style":2433},"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",[36,73147,73148,73173,73177],{"__ignoreMap":2433},[414,73149,73150,73153,73155,73157,73159,73161,73163,73166,73168,73171],{"class":2593,"line":2594},[414,73151,73152],{"class":2705},"claude",[414,73154,34146],{"class":2698},[414,73156,35871],{"class":2607},[414,73158,34146],{"class":2698},[414,73160,73138],{"class":2705},[414,73162,34146],{"class":2698},[414,73164,73165],{"class":2607},"20240229",[414,73167,10492],{"class":2705},[414,73169,73170],{"class":2601},"\"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.\"",[414,73172,9376],{"class":2705},[414,73174,73175],{"class":2593,"line":2434},[414,73176,2740],{"emptyLinePlaceholder":2459},[414,73178,73179,73181,73183,73185,73187,73189,73191,73193,73195,73197],{"class":2593,"line":2613},[414,73180,73152],{"class":2705},[414,73182,34146],{"class":2698},[414,73184,35871],{"class":2607},[414,73186,34146],{"class":2698},[414,73188,73141],{"class":2705},[414,73190,34146],{"class":2698},[414,73192,73165],{"class":2607},[414,73194,10492],{"class":2705},[414,73196,71155],{"class":2601},[414,73198,9376],{"class":2705},[55,73200,16755],{"id":16754},[22,73202,73203,73206,73207,73210,73211,73214],{},[41,73204,123],{"href":121,"rel":73205},[45],"'s GenAI API calls each AI vendor with your customer's own API key. Pair it with ",[41,73208,123],{"href":121,"rel":73209},[45],"'s other APIs to process your customers' SaaS data, or pass a Unified MCP URL in a prompt's ",[36,73212,73213],{},"mcp_url"," field on supported integrations so the model can call tools itself. Categories include:",[2354,73216,73217,73223,73229,73235],{},[2357,73218,73219,73222],{},[31,73220,73221],{},"ATS (Applicant Tracking System):"," Use AI to analyze documents that job applicants provide, such as their resume or cover letter, as well interviewer notes and scorecard comments.",[2357,73224,73225,73228],{},[31,73226,73227],{},"KMS (Knowledge Management System):"," 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.",[2357,73230,73231,73234],{},[31,73232,73233],{},"Messaging:"," Our Messaging API 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.",[2357,73236,73237,73240],{},[31,73238,73239],{},"Storage:"," Get files and documents from popular cloud storage systems and combine them with an LLM to generate reports, documentation, how-to guides, etc.",[55,73242,73244],{"id":73243},"try-our-genai-api-now","Try our GenAI API now",[22,73246,73247,73250,73251,73254],{},[41,73248,123],{"href":121,"rel":73249},[45],"'s GenAI API is on every plan, Grow included. Once you've created your ",[41,73252,123],{"href":121,"rel":73253},[45]," account, activate integrations from the dashboard and start building with the GenAI integrations.",[22,73256,73257,73258,70275],{},"Start a ",[41,73259,73261],{"href":21420,"rel":73260},[45],[31,73262,70274],{},[4156,73264,73265],{},"html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html pre.shiki code .sgQC_, html code.shiki .sgQC_{--shiki-default:#FDAEB7;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic;--shiki-light:#B31D28;--shiki-light-font-style:italic}",{"title":2433,"searchDepth":2434,"depth":2434,"links":73267},[73268,73269,73270,73271,73272,73273,73274,73275,73276,73277],{"id":70312,"depth":2434,"text":70313},{"id":70406,"depth":2434,"text":70407},{"id":70512,"depth":2434,"text":70513},{"id":70533,"depth":2434,"text":70534},{"id":70584,"depth":2434,"text":70585},{"id":70615,"depth":2434,"text":70616},{"id":72179,"depth":2434,"text":72180},{"id":72400,"depth":2434,"text":72401},{"id":16754,"depth":2434,"text":16755},{"id":73243,"depth":2434,"text":73244},"This guide shows you how to get started with Unified.to's GenAI (generative AI) API, which gives you one model and API for large language models (LLMs) across...",{"img":73280,"date":73281,"updated":73282,"tag":2457,"integrations":73283},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_use_unified_generative_ai_api_with_openai_and_claude-icon.png","2024-05-29T00:00:00.000Z","2026-10-21T00:01:41.531Z","openai, anthropic","\u002Fguides\u002Fhow_to_use_unified_generative_ai_api_with_openai_and_claude",{"title":70179,"description":73278},"guides\u002Fhow_to_use_unified_generative_ai_api_with_openai_and_claude","7zayf1llAaamQIaDvGJOE8Wno-Jn61PFU_iT1g_iOME",{"id":73289,"title":73290,"body":73291,"description":74288,"extension":2452,"meta":74289,"navigation":2459,"path":74293,"seo":74294,"stem":74295,"__hash__":74296},"guides\u002Fguides\u002Fhow_to_use_user_provisioning_and_verification_with_unified.md","How to use User Provisioning and Verification with Unified",{"type":12,"value":73292,"toc":74275},[73293,73296,73298,73303,73307,73310,73313,73315,73327,73331,73334,73340,73347,73349,73351,73387,73391,73410,73412,73414,73499,73501,73503,73506,73509,73511,73515,73659,73661,73665,73739,73741,73745,73843,73845,73849,73937,73939,73943,73946,74023,74025,74027,74268,74270,74273],[15,73294,73290],{"id":73295},"how-to-use-user-provisioning-and-verification-with-unified",[19,73297],{},[22,73299,73300],{},[25,73301,73302],{},"August 10, 2025",[15,73304,73306],{"id":73305},"user-provisioning-and-verification-with-unified","User Provisioning and Verification with Unified",[22,73308,73309],{},"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 Unified connects to. You can create, update, list and delete users in your customers employee directories.",[22,73311,73312],{},"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.",[55,73314,2542],{"id":2541},[2354,73316,73317,73319,73322,73324],{},[2357,73318,31360],{},[2357,73320,73321],{},"Unified account with at least one HR integration enabled (e.g. for this example we are using BambooHR)",[2357,73323,31366],{},[2357,73325,73326],{},"Your customer's HR connection ID",[55,73328,73330],{"id":73329},"supported-integrations","Supported Integrations",[22,73332,73333],{},"Unified's API works with 697 HR integrations (BambooHR, Workday, HiBob, Gusto, etc.) and 22 verification providers (including Certn, Checkr, First Advantage, Socure, Verifiable, Yardstik).",[22,73335,73336],{},[41,73337,73339],{"href":23346,"rel":73338},[45],"See all HR integrations",[22,73341,73342],{},[41,73343,73346],{"href":73344,"rel":73345},"https:\u002F\u002Fdocs.unified.to\u002Fverification\u002Fintegrations",[45],"See all verification integrations",[19,73348],{},[55,73350,31375],{"id":31374},[2584,73352,73354],{"className":2586,"code":73353,"language":2588,"meta":2433,"style":2433},"mkdir user-verification-demo\ncd user-verification-demo\nnpm init -y\nnpm install @unified-api\u002Ftypescript-sdk dotenv\n",[36,73355,73356,73363,73369,73377],{"__ignoreMap":2433},[414,73357,73358,73360],{"class":2593,"line":2594},[414,73359,2598],{"class":2597},[414,73361,73362],{"class":2601}," user-verification-demo\n",[414,73364,73365,73367],{"class":2593,"line":2434},[414,73366,2608],{"class":2607},[414,73368,73362],{"class":2601},[414,73370,73371,73373,73375],{"class":2593,"line":2613},[414,73372,2616],{"class":2597},[414,73374,2619],{"class":2601},[414,73376,2622],{"class":2607},[414,73378,73379,73381,73383,73385],{"class":2593,"line":2625},[414,73380,2616],{"class":2597},[414,73382,2630],{"class":2601},[414,73384,2633],{"class":2601},[414,73386,31415],{"class":2601},[22,73388,2642,73389,2646],{},[36,73390,2645],{},[2584,73392,73394],{"className":2649,"code":73393,"language":2651,"meta":2652,"style":2433},"UNIFIED_API_KEY=your_unified_api_key\nCONNECTION_BAMBOOHR=your_customer_bamboohr_connection_id\nCONNECTION_VERIFICATION=your_customer_verification_connection_id\n",[36,73395,73396,73400,73405],{"__ignoreMap":2433},[414,73397,73398],{"class":2593,"line":2594},[414,73399,2659],{},[414,73401,73402],{"class":2593,"line":2434},[414,73403,73404],{},"CONNECTION_BAMBOOHR=your_customer_bamboohr_connection_id\n",[414,73406,73407],{"class":2593,"line":2613},[414,73408,73409],{},"CONNECTION_VERIFICATION=your_customer_verification_connection_id\n",[19,73411],{},[55,73413,31439],{"id":31438},[2584,73415,73417],{"className":2689,"code":73416,"language":2691,"meta":2433,"style":2433},"import 'dotenv\u002Fconfig';\nimport { UnifiedTo } from '@unified-api\u002Ftypescript-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",[36,73418,73419,73427,73439,73443,73467,73471,73485,73495],{"__ignoreMap":2433},[414,73420,73421,73423,73425],{"class":2593,"line":2594},[414,73422,2699],{"class":2698},[414,73424,2702],{"class":2601},[414,73426,2706],{"class":2705},[414,73428,73429,73431,73433,73435,73437],{"class":2593,"line":2434},[414,73430,2699],{"class":2698},[414,73432,2713],{"class":2705},[414,73434,2716],{"class":2698},[414,73436,2719],{"class":2601},[414,73438,2706],{"class":2705},[414,73440,73441],{"class":2593,"line":2613},[414,73442,2740],{"emptyLinePlaceholder":2459},[414,73444,73445,73447,73449,73451,73453,73456,73458,73461,73463,73465],{"class":2593,"line":2625},[414,73446,2745],{"class":2698},[414,73448,26738],{"class":2705},[414,73450,2560],{"class":2607},[414,73452,319],{"class":2705},[414,73454,73455],{"class":2607},"CONNECTION_BAMBOOHR",[414,73457,319],{"class":2705},[414,73459,73460],{"class":2607},"CONNECTION_VERIFICATION",[414,73462,29638],{"class":2705},[414,73464,2798],{"class":2698},[414,73466,2801],{"class":2705},[414,73468,73469],{"class":2593,"line":2677},[414,73470,2740],{"emptyLinePlaceholder":2459},[414,73472,73473,73475,73477,73479,73481,73483],{"class":2593,"line":2751},[414,73474,2745],{"class":2698},[414,73476,2814],{"class":2607},[414,73478,2817],{"class":2698},[414,73480,2820],{"class":2698},[414,73482,2823],{"class":2597},[414,73484,2826],{"class":2705},[414,73486,73487,73489,73491,73493],{"class":2593,"line":2760},[414,73488,2832],{"class":2705},[414,73490,2560],{"class":2607},[414,73492,2837],{"class":2698},[414,73494,2840],{"class":2705},[414,73496,73497],{"class":2593,"line":2768},[414,73498,2846],{"class":2705},[19,73500],{},[55,73502,31525],{"id":31524},[22,73504,73505],{},"Before you get started, your end customer must authorize your app to access their HRIs integration via Unified's auth flow.",[22,73507,73508],{},"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.",[19,73510],{},[55,73512,73514],{"id":73513},"step-4-creating-a-user-provisioning","Step 4: Creating a User (Provisioning)",[2584,73516,73518],{"className":2689,"code":73517,"language":2691,"meta":2433,"style":2433},"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; \u002F\u002F HrisEmployee\n}\n",[36,73519,73520,73567,73585,73589,73594,73612,73617,73622,73627,73637,73641,73645,73655],{"__ignoreMap":2433},[414,73521,73522,73524,73526,73528,73531,73533,73535,73537,73539,73541,73543,73545,73547,73549,73552,73554,73556,73558,73561,73563,73565],{"class":2593,"line":2594},[414,73523,2956],{"class":2698},[414,73525,2959],{"class":2698},[414,73527,2962],{"class":2698},[414,73529,73530],{"class":2597}," createUser",[414,73532,2968],{"class":2705},[414,73534,2972],{"class":2971},[414,73536,2646],{"class":2698},[414,73538,2977],{"class":2607},[414,73540,319],{"class":2705},[414,73542,7282],{"class":2971},[414,73544,2646],{"class":2698},[414,73546,2977],{"class":2607},[414,73548,319],{"class":2705},[414,73550,73551],{"class":2971},"firstName",[414,73553,2646],{"class":2698},[414,73555,2977],{"class":2607},[414,73557,319],{"class":2705},[414,73559,73560],{"class":2971},"lastName",[414,73562,2646],{"class":2698},[414,73564,2977],{"class":2607},[414,73566,3826],{"class":2705},[414,73568,73569,73571,73574,73576,73578,73580,73583],{"class":2593,"line":2434},[414,73570,3071],{"class":2698},[414,73572,73573],{"class":2607}," employee",[414,73575,2817],{"class":2698},[414,73577,3002],{"class":2698},[414,73579,26600],{"class":2705},[414,73581,73582],{"class":2597},"createHrisEmployee",[414,73584,2826],{"class":2705},[414,73586,73587],{"class":2593,"line":2613},[414,73588,3015],{"class":2705},[414,73590,73591],{"class":2593,"line":2625},[414,73592,73593],{"class":2705},"    hrisEmployee: {\n",[414,73595,73596,73599,73601,73603,73606,73608,73610],{"class":2593,"line":2677},[414,73597,73598],{"class":2705},"      name: ",[414,73600,40200],{"class":2601},[414,73602,73551],{"class":2705},[414,73604,73605],{"class":2601},"} ${",[414,73607,73560],{"class":2705},[414,73609,3308],{"class":2601},[414,73611,2757],{"class":2705},[414,73613,73614],{"class":2593,"line":2751},[414,73615,73616],{"class":2705},"      emails: [{ email }],\n",[414,73618,73619],{"class":2593,"line":2760},[414,73620,73621],{"class":2705},"      firstName,\n",[414,73623,73624],{"class":2593,"line":2768},[414,73625,73626],{"class":2705},"      lastName,\n",[414,73628,73629,73632,73635],{"class":2593,"line":2776},[414,73630,73631],{"class":2705},"      employmentStatus: ",[414,73633,73634],{"class":2601},"\"ACTIVE\"",[414,73636,2757],{"class":2705},[414,73638,73639],{"class":2593,"line":2784},[414,73640,3548],{"class":2705},[414,73642,73643],{"class":2593,"line":2792},[414,73644,3030],{"class":2705},[414,73646,73647,73649,73652],{"class":2593,"line":2804},[414,73648,2999],{"class":2698},[414,73650,73651],{"class":2705}," employee; ",[414,73653,73654],{"class":3527},"\u002F\u002F HrisEmployee\n",[414,73656,73657],{"class":2593,"line":2809},[414,73658,3035],{"class":2705},[19,73660],{},[55,73662,73664],{"id":73663},"step-5-listing-users","Step 5: Listing Users",[2584,73666,73668],{"className":2689,"code":73667,"language":2691,"meta":2433,"style":2433},"export async function listUsers(connectionId: string) {\n  const employees = await sdk.hris.listHrisEmployees({\n    connectionId,\n    limit: 10,\n  });\n  return employees; \u002F\u002F HrisEmployee[]\n}\n",[36,73669,73670,73691,73709,73713,73721,73725,73735],{"__ignoreMap":2433},[414,73671,73672,73674,73676,73678,73681,73683,73685,73687,73689],{"class":2593,"line":2594},[414,73673,2956],{"class":2698},[414,73675,2959],{"class":2698},[414,73677,2962],{"class":2698},[414,73679,73680],{"class":2597}," listUsers",[414,73682,2968],{"class":2705},[414,73684,2972],{"class":2971},[414,73686,2646],{"class":2698},[414,73688,2977],{"class":2607},[414,73690,3826],{"class":2705},[414,73692,73693,73695,73698,73700,73702,73704,73707],{"class":2593,"line":2434},[414,73694,3071],{"class":2698},[414,73696,73697],{"class":2607}," employees",[414,73699,2817],{"class":2698},[414,73701,3002],{"class":2698},[414,73703,26600],{"class":2705},[414,73705,73706],{"class":2597},"listHrisEmployees",[414,73708,2826],{"class":2705},[414,73710,73711],{"class":2593,"line":2613},[414,73712,3015],{"class":2705},[414,73714,73715,73717,73719],{"class":2593,"line":2625},[414,73716,3020],{"class":2705},[414,73718,31591],{"class":2607},[414,73720,2757],{"class":2705},[414,73722,73723],{"class":2593,"line":2677},[414,73724,3030],{"class":2705},[414,73726,73727,73729,73732],{"class":2593,"line":2751},[414,73728,2999],{"class":2698},[414,73730,73731],{"class":2705}," employees; ",[414,73733,73734],{"class":3527},"\u002F\u002F HrisEmployee[]\n",[414,73736,73737],{"class":2593,"line":2760},[414,73738,3035],{"class":2705},[19,73740],{},[55,73742,73744],{"id":73743},"step-6-updating-a-user","Step 6: Updating a User",[2584,73746,73748],{"className":2689,"code":73747,"language":2691,"meta":2433,"style":2433},"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; \u002F\u002F HrisEmployee\n}\n",[36,73749,73750,73794,73812,73816,73821,73826,73830,73839],{"__ignoreMap":2433},[414,73751,73752,73754,73756,73758,73761,73763,73765,73767,73769,73771,73774,73776,73778,73780,73782,73784,73787,73789,73792],{"class":2593,"line":2594},[414,73753,2956],{"class":2698},[414,73755,2959],{"class":2698},[414,73757,2962],{"class":2698},[414,73759,73760],{"class":2597}," updateUserStatus",[414,73762,2968],{"class":2705},[414,73764,2972],{"class":2971},[414,73766,2646],{"class":2698},[414,73768,2977],{"class":2607},[414,73770,319],{"class":2705},[414,73772,73773],{"class":2971},"userId",[414,73775,2646],{"class":2698},[414,73777,2977],{"class":2607},[414,73779,319],{"class":2705},[414,73781,20261],{"class":2971},[414,73783,2646],{"class":2698},[414,73785,73786],{"class":2601}," \"ACTIVE\"",[414,73788,3447],{"class":2698},[414,73790,73791],{"class":2601}," \"INACTIVE\"",[414,73793,3826],{"class":2705},[414,73795,73796,73798,73801,73803,73805,73807,73810],{"class":2593,"line":2434},[414,73797,3071],{"class":2698},[414,73799,73800],{"class":2607}," updated",[414,73802,2817],{"class":2698},[414,73804,3002],{"class":2698},[414,73806,26600],{"class":2705},[414,73808,73809],{"class":2597},"updateHrisEmployee",[414,73811,2826],{"class":2705},[414,73813,73814],{"class":2593,"line":2613},[414,73815,3015],{"class":2705},[414,73817,73818],{"class":2593,"line":2625},[414,73819,73820],{"class":2705},"    id: userId,\n",[414,73822,73823],{"class":2593,"line":2677},[414,73824,73825],{"class":2705},"    hrisEmployee: { employmentStatus: status },\n",[414,73827,73828],{"class":2593,"line":2751},[414,73829,3030],{"class":2705},[414,73831,73832,73834,73837],{"class":2593,"line":2760},[414,73833,2999],{"class":2698},[414,73835,73836],{"class":2705}," updated; ",[414,73838,73654],{"class":3527},[414,73840,73841],{"class":2593,"line":2768},[414,73842,3035],{"class":2705},[19,73844],{},[55,73846,73848],{"id":73847},"step-7-deactivating-a-user-recommended","Step 7: Deactivating a User (Recommended)",[2584,73850,73852],{"className":2689,"code":73851,"language":2691,"meta":2433,"style":2433},"export async function deactivateUser(connectionId: string, userId: string) {\n  \u002F\u002F 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",[36,73853,73854,73883,73888,73904,73908,73912,73922,73926,73933],{"__ignoreMap":2433},[414,73855,73856,73858,73860,73862,73865,73867,73869,73871,73873,73875,73877,73879,73881],{"class":2593,"line":2594},[414,73857,2956],{"class":2698},[414,73859,2959],{"class":2698},[414,73861,2962],{"class":2698},[414,73863,73864],{"class":2597}," deactivateUser",[414,73866,2968],{"class":2705},[414,73868,2972],{"class":2971},[414,73870,2646],{"class":2698},[414,73872,2977],{"class":2607},[414,73874,319],{"class":2705},[414,73876,73773],{"class":2971},[414,73878,2646],{"class":2698},[414,73880,2977],{"class":2607},[414,73882,3826],{"class":2705},[414,73884,73885],{"class":2593,"line":2434},[414,73886,73887],{"class":3527},"  \u002F\u002F Some providers (e.g., BambooHR) do not support delete; set status to INACTIVE instead\n",[414,73889,73890,73892,73894,73896,73898,73900,73902],{"class":2593,"line":2613},[414,73891,3071],{"class":2698},[414,73893,73800],{"class":2607},[414,73895,2817],{"class":2698},[414,73897,3002],{"class":2698},[414,73899,26600],{"class":2705},[414,73901,73809],{"class":2597},[414,73903,2826],{"class":2705},[414,73905,73906],{"class":2593,"line":2625},[414,73907,3015],{"class":2705},[414,73909,73910],{"class":2593,"line":2677},[414,73911,73820],{"class":2705},[414,73913,73914,73917,73920],{"class":2593,"line":2751},[414,73915,73916],{"class":2705},"    hrisEmployee: { employmentStatus: ",[414,73918,73919],{"class":2601},"\"INACTIVE\"",[414,73921,2840],{"class":2705},[414,73923,73924],{"class":2593,"line":2760},[414,73925,3030],{"class":2705},[414,73927,73928,73930],{"class":2593,"line":2768},[414,73929,2999],{"class":2698},[414,73931,73932],{"class":2705}," updated;\n",[414,73934,73935],{"class":2593,"line":2776},[414,73936,3035],{"class":2705},[19,73938],{},[55,73940,73942],{"id":73941},"step-8-verifying-a-user-background-check-license-etc","Step 8: Verifying a User (Background Check, License, etc.)",[22,73944,73945],{},"Unified's new Verification API lets you trigger background checks, license verifications, and more, using providers like Certn, Checkr, and others.",[2584,73947,73949],{"className":2689,"code":73948,"language":2691,"meta":2433,"style":2433},"export async function listVerificationRequests(connectionId: string) {\n  \u002F\u002F Listing requests is supported across providers; creation may vary by provider\u002Fpackage\n  const requests = await sdk.verification.listVerificationRequests({\n    connectionId,\n    limit: 10,\n  });\n  return requests;\n}\n",[36,73950,73951,73972,73977,73996,74000,74008,74012,74019],{"__ignoreMap":2433},[414,73952,73953,73955,73957,73959,73962,73964,73966,73968,73970],{"class":2593,"line":2594},[414,73954,2956],{"class":2698},[414,73956,2959],{"class":2698},[414,73958,2962],{"class":2698},[414,73960,73961],{"class":2597}," listVerificationRequests",[414,73963,2968],{"class":2705},[414,73965,2972],{"class":2971},[414,73967,2646],{"class":2698},[414,73969,2977],{"class":2607},[414,73971,3826],{"class":2705},[414,73973,73974],{"class":2593,"line":2434},[414,73975,73976],{"class":3527},"  \u002F\u002F Listing requests is supported across providers; creation may vary by provider\u002Fpackage\n",[414,73978,73979,73981,73984,73986,73988,73991,73994],{"class":2593,"line":2613},[414,73980,3071],{"class":2698},[414,73982,73983],{"class":2607}," requests",[414,73985,2817],{"class":2698},[414,73987,3002],{"class":2698},[414,73989,73990],{"class":2705}," sdk.verification.",[414,73992,73993],{"class":2597},"listVerificationRequests",[414,73995,2826],{"class":2705},[414,73997,73998],{"class":2593,"line":2625},[414,73999,3015],{"class":2705},[414,74001,74002,74004,74006],{"class":2593,"line":2677},[414,74003,3020],{"class":2705},[414,74005,31591],{"class":2607},[414,74007,2757],{"class":2705},[414,74009,74010],{"class":2593,"line":2751},[414,74011,3030],{"class":2705},[414,74013,74014,74016],{"class":2593,"line":2760},[414,74015,2999],{"class":2698},[414,74017,74018],{"class":2705}," requests;\n",[414,74020,74021],{"class":2593,"line":2768},[414,74022,3035],{"class":2705},[19,74024],{},[55,74026,32044],{"id":32043},[2584,74028,74030],{"className":2689,"code":74029,"language":2691,"meta":2433,"style":2433},"async function main() {\n  \u002F\u002F 1. Create a user\n  const user = await createUser(CONNECTION_BAMBOOHR!, \"jane.doe@example.com\", \"Jane\", \"Doe\");\n\n  \u002F\u002F 2. List users\n  const users = await listUsers(CONNECTION_BAMBOOHR!);\n\n  \u002F\u002F 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  \u002F\u002F 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",[36,74031,74032,74042,74047,74083,74087,74092,74112,74116,74121,74128,74153,74167,74171,74175,74180,74190,74210,74228,74232,74236,74254,74258,74262],{"__ignoreMap":2433},[414,74033,74034,74036,74038,74040],{"class":2593,"line":2594},[414,74035,3928],{"class":2698},[414,74037,2962],{"class":2698},[414,74039,3933],{"class":2597},[414,74041,3936],{"class":2705},[414,74043,74044],{"class":2593,"line":2434},[414,74045,74046],{"class":3527},"  \u002F\u002F 1. Create a user\n",[414,74048,74049,74051,74054,74056,74058,74060,74062,74064,74066,74068,74071,74073,74076,74078,74081],{"class":2593,"line":2613},[414,74050,3071],{"class":2698},[414,74052,74053],{"class":2607}," user",[414,74055,2817],{"class":2698},[414,74057,3002],{"class":2698},[414,74059,73530],{"class":2597},[414,74061,2968],{"class":2705},[414,74063,73455],{"class":2607},[414,74065,2837],{"class":2698},[414,74067,319],{"class":2705},[414,74069,74070],{"class":2601},"\"jane.doe@example.com\"",[414,74072,319],{"class":2705},[414,74074,74075],{"class":2601},"\"Jane\"",[414,74077,319],{"class":2705},[414,74079,74080],{"class":2601},"\"Doe\"",[414,74082,3156],{"class":2705},[414,74084,74085],{"class":2593,"line":2625},[414,74086,2740],{"emptyLinePlaceholder":2459},[414,74088,74089],{"class":2593,"line":2677},[414,74090,74091],{"class":3527},"  \u002F\u002F 2. List users\n",[414,74093,74094,74096,74098,74100,74102,74104,74106,74108,74110],{"class":2593,"line":2751},[414,74095,3071],{"class":2698},[414,74097,20270],{"class":2607},[414,74099,2817],{"class":2698},[414,74101,3002],{"class":2698},[414,74103,73680],{"class":2597},[414,74105,2968],{"class":2705},[414,74107,73455],{"class":2607},[414,74109,2837],{"class":2698},[414,74111,3156],{"class":2705},[414,74113,74114],{"class":2593,"line":2760},[414,74115,2740],{"emptyLinePlaceholder":2459},[414,74117,74118],{"class":2593,"line":2768},[414,74119,74120],{"class":3527},"  \u002F\u002F 3. Update (deactivate) user\n",[414,74122,74123,74125],{"class":2593,"line":2776},[414,74124,24386],{"class":2698},[414,74126,74127],{"class":2705}," (user?.id) {\n",[414,74129,74130,74132,74134,74136,74138,74140,74142,74144,74146,74149,74151],{"class":2593,"line":2784},[414,74131,3986],{"class":2698},[414,74133,73800],{"class":2607},[414,74135,2817],{"class":2698},[414,74137,3002],{"class":2698},[414,74139,73760],{"class":2597},[414,74141,2968],{"class":2705},[414,74143,73455],{"class":2607},[414,74145,2837],{"class":2698},[414,74147,74148],{"class":2705},", user.id, ",[414,74150,73919],{"class":2601},[414,74152,3156],{"class":2705},[414,74154,74155,74157,74159,74161,74164],{"class":2593,"line":2792},[414,74156,28184],{"class":2705},[414,74158,4064],{"class":2597},[414,74160,2968],{"class":2705},[414,74162,74163],{"class":2601},"\"Updated user:\"",[414,74165,74166],{"class":2705},", updated);\n",[414,74168,74169],{"class":2593,"line":2804},[414,74170,4032],{"class":2705},[414,74172,74173],{"class":2593,"line":2809},[414,74174,2740],{"emptyLinePlaceholder":2459},[414,74176,74177],{"class":2593,"line":2829},[414,74178,74179],{"class":3527},"  \u002F\u002F 4. List verification requests (optional)\n",[414,74181,74182,74184,74186,74188],{"class":2593,"line":2843},[414,74183,24386],{"class":2698},[414,74185,3970],{"class":2705},[414,74187,73460],{"class":2607},[414,74189,3826],{"class":2705},[414,74191,74192,74194,74196,74198,74200,74202,74204,74206,74208],{"class":2593,"line":2849},[414,74193,3986],{"class":2698},[414,74195,73983],{"class":2607},[414,74197,2817],{"class":2698},[414,74199,3002],{"class":2698},[414,74201,73961],{"class":2597},[414,74203,2968],{"class":2705},[414,74205,73460],{"class":2607},[414,74207,2837],{"class":2698},[414,74209,3156],{"class":2705},[414,74211,74212,74214,74216,74218,74221,74224,74226],{"class":2593,"line":2854},[414,74213,28184],{"class":2705},[414,74215,4064],{"class":2597},[414,74217,2968],{"class":2705},[414,74219,74220],{"class":2601},"\"Verification requests:\"",[414,74222,74223],{"class":2705},", requests.",[414,74225,25098],{"class":2607},[414,74227,3156],{"class":2705},[414,74229,74230],{"class":2593,"line":2880},[414,74231,4032],{"class":2705},[414,74233,74234],{"class":2593,"line":3253},[414,74235,2740],{"emptyLinePlaceholder":2459},[414,74237,74238,74240,74242,74244,74247,74250,74252],{"class":2593,"line":3261},[414,74239,4061],{"class":2705},[414,74241,4064],{"class":2597},[414,74243,2968],{"class":2705},[414,74245,74246],{"class":2601},"\"Users:\"",[414,74248,74249],{"class":2705},", users.",[414,74251,25098],{"class":2607},[414,74253,3156],{"class":2705},[414,74255,74256],{"class":2593,"line":3279},[414,74257,3035],{"class":2705},[414,74259,74260],{"class":2593,"line":3313},[414,74261,2740],{"emptyLinePlaceholder":2459},[414,74263,74264,74266],{"class":2593,"line":3326},[414,74265,4085],{"class":2597},[414,74267,4088],{"class":2705},[19,74269],{},[22,74271,74272],{},"And that's it - **Happy Building ** 🎉",[4156,74274,4158],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":74276},[74277,74278,74279,74280,74281,74282,74283,74284,74285,74286,74287],{"id":2541,"depth":2434,"text":2542},{"id":73329,"depth":2434,"text":73330},{"id":31374,"depth":2434,"text":31375},{"id":31438,"depth":2434,"text":31439},{"id":31524,"depth":2434,"text":31525},{"id":73513,"depth":2434,"text":73514},{"id":73663,"depth":2434,"text":73664},{"id":73743,"depth":2434,"text":73744},{"id":73847,"depth":2434,"text":73848},{"id":73941,"depth":2434,"text":73942},{"id":32043,"depth":2434,"text":32044},"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...",{"img":74290,"date":74291,"updated":74292,"tag":2457,"integrations":7030},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_to_use_user_provisioning_and_verification_with_unified-icon.png","2025-08-10T00:00:00.000Z","2026-10-09T01:59:44.910Z","\u002Fguides\u002Fhow_to_use_user_provisioning_and_verification_with_unified",{"title":73290,"description":74288},"guides\u002Fhow_to_use_user_provisioning_and_verification_with_unified","joM2h0a3TGej8xduKkasxEngFB8cLFUzb1gBN_v3MKE",{"id":74298,"title":74299,"body":74300,"description":74654,"extension":2452,"meta":74655,"navigation":2459,"path":74659,"seo":74660,"stem":74661,"__hash__":74662},"guides\u002Fguides\u002Fhow_virtual_webhook_retry_and_recovery_works.md","How virtual webhook retry and recovery works",{"type":12,"value":74301,"toc":74643},[74302,74305,74307,74312,74327,74330,74340,74344,74347,74362,74365,74369,74374,74377,74407,74410,74414,74417,74420,74443,74446,74453,74457,74460,74468,74471,74475,74535,74539,74542,74546,74573,74577,74580,74610,74613,74617],[15,74303,74299],{"id":74304},"how-virtual-webhook-retry-and-recovery-works",[19,74306],{},[22,74308,74309],{},[25,74310,74311],{},"September 16, 2026",[22,74313,74314,74315,74318,74319,74322,74323,74326],{},"Virtual webhooks give you a consistent event stream on supported integrations, even when an integration does not offer native webhooks. This page describes recovery for virtual webhooks. Native webhooks get 3 immediate delivery retries and no extended backoff, then the webhook is marked unhealthy; see ",[41,74316,45818],{"href":45816,"rel":74317},[45],". Behind that experience is a recovery system that treats ",[31,74320,74321],{},"reading"," from the integration and ",[31,74324,74325],{},"delivering"," to your endpoint as two separate concerns, so a temporary problem on one side does not burn the retry budget of the other.",[22,74328,74329],{},"This guide explains how that recovery works at a high level, what you can expect when something fails, and how health monitoring fits in.",[22,74331,74332,74333,74336,74337,97],{},"If you are new to virtual webhooks, start with ",[41,74334,46062],{"href":22112,"rel":74335},[45],". For diagnosing an unhealthy webhook, see ",[41,74338,45818],{"href":45816,"rel":74339},[45],[55,74341,74343],{"id":74342},"two-sides-of-every-virtual-webhook","Two sides of every virtual webhook",[22,74345,74346],{},"Every virtual webhook cycle has two stages:",[2510,74348,74349,74354],{},[2357,74350,74351,74353],{},[31,74352,8031],{}," Unified checks the connected integration for new or updated data (according to your subscription and interval).",[2357,74355,74356,74359,74360,97],{},[31,74357,74358],{},"Dispatch:"," When there is something to send, Unified POSTs that data to your ",[36,74361,5053],{},[22,74363,74364],{},"Failures can happen in either stage: the integration may be slow, rate-limited, or briefly unavailable; your endpoint may time out, return an error, or be down for a deploy. Unified recovers each stage independently so integration instability and your endpoint's availability do not share a single retry budget.",[55,74366,74368],{"id":74367},"when-your-endpoint-is-unavailable-dispatch-recovery","When your endpoint is unavailable (dispatch recovery)",[22,74370,74371,74372,28557],{},"Delivery only succeeds when your server acknowledges the POST, typically with a ",[36,74373,68898],{},[22,74375,74376],{},"If your endpoint is unreachable or returns an error:",[2510,74378,74379,74385,74391,74397],{},[2357,74380,74381,74384],{},[31,74382,74383],{},"Short immediate retries:"," Unified retries the same delivery up to 3 times right away, 1 second apart, to ride out blips (cold starts, brief network glitches).",[2357,74386,74387,74390],{},[31,74388,74389],{},"Progressive backoff:"," If those attempts still fail, Unified backs off progressively, spacing later retries further apart. A backoff retry re-reads the same page from the integration rather than resending a stored payload; no customer records are held in a delivery queue. The read position only advances after a successful delivery.",[2357,74392,74393,74396],{},[31,74394,74395],{},"Sustained recovery window:"," For consecutive failures, that schedule can continue for an extended recovery window — currently up to roughly two weeks — so longer outages (maintenance windows, weekend incidents) still have a chance to recover automatically. A successful delivery resets the retry schedule; the next failure starts recovery from the beginning again.",[2357,74398,74399,74402,74403,74406],{},[31,74400,74401],{},"Health signal:"," If delivery cannot succeed across that consecutive-failure window, the webhook is marked unhealthy (",[36,74404,74405],{},"is_healthy: false",") and scheduling stops until you fix the endpoint or the connection's auth, then recreate the webhook.",[22,74408,74409],{},"You do not need to implement your own delivery retry loop for virtual webhooks. Respond quickly with success when you have accepted the payload; Unified handles delivery retries.",[55,74411,74413],{"id":74412},"when-the-integration-is-unavailable-or-rate-limited-read-recovery","When the integration is unavailable or rate-limited (read recovery)",[22,74415,74416],{},"Reading from the integration can also fail: transient API errors, auth refresh races, or rate limits.",[22,74418,74419],{},"In those cases Unified:",[2354,74421,74422,74428,74434],{},[2357,74423,74424,74427],{},[31,74425,74426],{},"Backs off"," with the same progressive delay pattern used for delivery recovery, instead of hammering the integration. As with dispatch, consecutive failures escalate the wait; a successful read resets the schedule.",[2357,74429,74430,74433],{},[31,74431,74432],{},"Honours rate-limit guidance"," from the integration when it is present (for example a retry-after hint), and still escalates delays if pressure continues, so a short 'try again soon' hint cannot pin the system into a tight retry loop.",[2357,74435,74436,74439,74440,74442],{},[31,74437,74438],{},"Keeps your delivery budget intact:"," read-side failures do not consume the dispatch retry budget for data that has already been fetched, and vice versa. Once your endpoint is healthy again, reading resumes from the last successfully delivered page. This independence applies while the webhook remains in recovery. If the subscription eventually transitions to ",[36,74441,74405],{},", further reading and dispatch stop until you recreate the webhook.",[22,74444,74445],{},"When the integration recovers, change detection resumes on your configured interval and new events are dispatched as usual.",[22,74447,74448,74449,74452],{},"Not every read failure enters that long recovery window. Some problems, typically broken authorization or missing permissions on the connection, are treated as non-retryable: Unified marks the webhook unhealthy right away instead of backing off for days. That usually means fixing or recreating the connection (and then the webhook), not waiting for automatic recovery. See ",[41,74450,45818],{"href":45816,"rel":74451},[45]," for those cases.",[55,74454,74456],{"id":74455},"why-separate-read-and-dispatch-recovery-matters","Why separate read and dispatch recovery matters",[22,74458,74459],{},"Without separate recovery:",[2354,74461,74462,74465],{},[2357,74463,74464],{},"A long integration outage could exhaust retries and mark the webhook unhealthy even though your endpoint was fine the whole time.",[2357,74466,74467],{},"A short customer outage could stop Unified from reading new data once the integration came back.",[22,74469,74470],{},"By isolating the two stages, a failure on one side does not use up the other side's retry budget. That isolation lets virtual webhooks recover from transient failures without coupling integration availability to endpoint availability.",[55,74472,74474],{"id":74473},"what-healthy-means-in-practice","What 'healthy' means in practice",[155,74476,74477,74487],{},[158,74478,74479],{},[161,74480,74481,74484],{},[164,74482,74483],{},"Signal",[164,74485,74486],{},"Meaning",[174,74488,74489,74499,74511,74521],{},[161,74490,74491,74496],{},[179,74492,74493],{},[36,74494,74495],{},"is_healthy: true",[179,74497,74498],{},"The subscription can continue operating or recovering. This does not necessarily mean the most recent read or dispatch succeeded; transient failures may still be retrying.",[161,74500,74501,74505],{},[179,74502,74503],{},[36,74504,74405],{},[179,74506,74507,74508,97],{},"Retries were exhausted, or Unified hit a terminal \u002F non-retryable failure (for example broken connection auth). Reading and dispatch stop; recreate the webhook after fixing the cause. See ",[41,74509,45818],{"href":45816,"rel":74510},[45],[161,74512,74513,74518],{},[179,74514,74515],{},[36,74516,74517],{},"is_paused: true",[179,74519,74520],{},"The webhook or connection is paused by Unified's billing\u002Fplan controls. While paused, Unified does not read or dispatch.",[161,74522,74523,74533],{},[179,74524,74525,74526,74529,74530,97],{},"Use the dashboard and the webhook's recent ",[36,74527,74528],{},"runs"," to see whether recent attempts succeeded. Details are covered in ",[41,74531,45818],{"href":45816,"rel":74532},[45],[179,74534],{},[55,74536,74538],{"id":74537},"quiet-periods","Quiet periods",[22,74540,74541],{},"Virtual webhooks only POST when there is something to send. Between events, Unified continues to check on your interval.",[55,74543,74545],{"id":74544},"what-you-should-do-on-your-side","What you should do on your side",[2510,74547,74548,74557,74563],{},[2357,74549,74550,74553,74554,74556],{},[31,74551,74552],{},"Acknowledge after you've accepted the payload:"," Return a success status (",[36,74555,68898],{},") once you've safely accepted the work, and do heavy processing asynchronously when possible. After Unified receives that acknowledgment, it does not redeliver that same attempt. Retries only happen when Unified does not receive a successful acknowledgment (for example a timeout or non-success status). If your handler processes the body and then fails or times out before responding, you may see the same delivery again — design for that edge case.",[2357,74558,74559,74562],{},[31,74560,74561],{},"Keep your URL stable and reachable:"," TLS, DNS, and firewall rules that reject Unified's POSTs look like delivery failures and enter the same retry path.",[2357,74564,74565,74568,74569,74572],{},[31,74566,74567],{},"Watch health:"," Alert on ",[36,74570,74571],{},"is_healthy"," flipping to false so you can fix the endpoint before customers notice stale data.",[55,74574,74576],{"id":74575},"summary","Summary",[22,74578,74579],{},"Virtual webhooks are not 'just polling.' They include a recovery layer that:",[2354,74581,74582,74589,74595,74602],{},[2357,74583,74584,74585,74588],{},"Retries ",[31,74586,74587],{},"dispatch"," to your endpoint with immediate retries, then progressive backoff for consecutive failures (currently up to about two weeks), resetting on the first success.",[2357,74590,74584,74591,74594],{},[31,74592,74593],{},"reads"," from the integration with the same progressive backoff (also resetting on success), while respecting rate limits, except for non-retryable connection problems (for example broken auth), which mark the webhook unhealthy immediately.",[2357,74596,74597,74598,74601],{},"Keeps those two retry paths ",[31,74599,74600],{},"independent",", so one side's instability does not silently consume the other's chances.",[2357,74603,74604,74605,74609],{},"Surfaces lasting or non-retryable failure through ",[31,74606,74607],{},[36,74608,74571],{},". Once a webhook becomes unhealthy, Unified stops reading and dispatching until you recreate the webhook; there is no automatic resume from that state.",[22,74611,74612],{},"You get a single webhook API; Unified owns the hard parts of staying reliable when either side of the pipe has a bad day.",[55,74614,74616],{"id":74615},"related-guides","Related guides",[2354,74618,74619,74624,74631,74636],{},[2357,74620,74621],{},[41,74622,46062],{"href":22112,"rel":74623},[45],[2357,74625,74626],{},[41,74627,74630],{"href":74628,"rel":74629},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Funlock_real_time_data_with_virtual_webhooks",[45],"Unlock real-time data with virtual webhooks",[2357,74632,74633],{},[41,74634,45818],{"href":45816,"rel":74635},[45],[2357,74637,74638],{},[41,74639,74642],{"href":74640,"rel":74641},"https:\u002F\u002Fdocs.unified.to\u002Fconcepts\u002Fglossary\u002Fwebhook",[45],"Glossary: Webhook",{"title":2433,"searchDepth":2434,"depth":2434,"links":74644},[74645,74646,74647,74648,74649,74650,74651,74652,74653],{"id":74342,"depth":2434,"text":74343},{"id":74367,"depth":2434,"text":74368},{"id":74412,"depth":2434,"text":74413},{"id":74455,"depth":2434,"text":74456},{"id":74473,"depth":2434,"text":74474},{"id":74537,"depth":2434,"text":74538},{"id":74544,"depth":2434,"text":74545},{"id":74575,"depth":2434,"text":74576},{"id":74615,"depth":2434,"text":74616},"Virtual webhooks give you a consistent event stream on supported integrations, even when an integration does not offer native webhooks. This page describes...",{"img":74656,"date":74657,"updated":74658,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fhow_virtual_webhook_retry_and_recovery_works-icon.png","2026-09-16T00:00:00.000Z","2026-10-13T00:19:17.914Z","\u002Fguides\u002Fhow_virtual_webhook_retry_and_recovery_works",{"title":74299,"description":74654},"guides\u002Fhow_virtual_webhook_retry_and_recovery_works","gkv18rW1PtcPTBmPXAXRwLPtrjN3KIdRh57GquUAZxo",{"id":74664,"title":74665,"body":74666,"description":75588,"extension":2452,"meta":75589,"navigation":2459,"path":75594,"seo":75595,"stem":75596,"__hash__":75597},"guides\u002Fguides\u002Fintegration_set_up_guide_for_lever.md","Integration set-up guide for Lever",{"type":12,"value":74667,"toc":75570},[74668,74671,74673,74678,74693,74700,74704,74722,74803,74805,74811,74840,74845,74852,74864,74870,74874,74885,74917,74921,74928,74948,74981,74985,74992,75049,75053,75068,75074,75087,75093,75097,75115,75143,75149,75153,75159,75207,75211,75220,75236,75240,75263,75434,75438,75444,75458,75468,75472,75479,75520,75524,75534,75537],[15,74669,74665],{"id":74670},"integration-set-up-guide-for-lever",[19,74672],{},[22,74674,74675],{},[25,74676,74677],{},"September 27, 2023",[22,74679,74680,74681,74684,74685,74688,74689,74692],{},"To connect your customers' Lever accounts to your product through ",[41,74682,123],{"href":121,"rel":74683},[45],", activate Lever in your ",[41,74686,123],{"href":121,"rel":74687},[45]," workspace, choose how customers authorize (Lever OAuth 2 with your own Lever client ID and secret, or a Lever API key each customer creates), embed the Authorization component, and save the connection ID each customer creates. As of 21 October 2026, Lever issues OAuth client IDs and secrets only to approved Lever partners, so teams without a partnership connect customers with Lever API keys. Your code then reads and writes Lever candidates, applications, jobs, notes and users through ",[41,74690,123],{"href":121,"rel":74691},[45],"'s ATS and HR & Directory APIs.",[22,74694,74695,74696,74699],{},"This guide covers each step, from activation to your first API call, and what ",[41,74697,123],{"href":121,"rel":74698},[45],"'s Lever integration supports.",[55,74701,74703],{"id":74702},"which-authorization-method-should-you-use-for-lever","Which authorization method should you use for Lever?",[22,74705,74706,74707,74712,74713,74716,74717,20056],{},"Use Lever OAuth 2 if you're an approved Lever partner, and Lever API keys if you're not. As of 21 October 2026, Lever says \"As of 2020, all Lever integrations are authenticated using OAuth\" and doesn't provide API keys for partner development (",[41,74708,74711],{"href":74709,"rel":74710},"https:\u002F\u002Fhire.lever.co\u002Fdeveloper\u002Foauth",[45],"Lever OAuth documentation","). Customers can still create API keys in their own Lever account. ",[41,74714,123],{"href":121,"rel":74715},[45],"'s Lever integration offers both methods (",[41,74718,74721],{"href":74719,"rel":74720},"https:\u002F\u002Fdocs.unified.to\u002Fintegrations\u002Flever",[45],"Lever integration page",[155,74723,74724,74736],{},[158,74725,74726],{},[161,74727,74728,74730,74733],{},[164,74729],{},[164,74731,74732],{},"Lever OAuth 2",[164,74734,74735],{},"Lever API key",[174,74737,74738,74748,74762,74773,74784],{},[161,74739,74740,74742,74745],{},[179,74741,21474],{},[179,74743,74744],{},"Lever's team, after Lever approves you as a partner",[179,74746,74747],{},"A Super Admin in your customer's Lever account",[161,74749,74750,74756,74759],{},[179,74751,74752,74753],{},"What you add in ",[41,74754,123],{"href":121,"rel":74755},[45],[179,74757,74758],{},"Your Lever client ID and secret, when you activate Lever",[179,74760,74761],{},"Nothing; each customer enters their key in the Authorization component",[161,74763,74764,74767,74770],{},[179,74765,74766],{},"Who approves access in Lever",[179,74768,74769],{},"A Lever Super Admin, for the whole Lever organization",[179,74771,74772],{},"The Super Admin who creates the key and chooses its permissions",[161,74774,74775,74778,74781],{},[179,74776,74777],{},"Lever plan requirement (as of 21 October 2026)",[179,74779,74780],{},"Available to all Lever customers",[179,74782,74783],{},"Customer needs Lever's Data API feature",[161,74785,74786,74799,74801],{},[179,74787,74788,74789,74792,74793,74798],{},"As of 20 September 2026, ",[41,74790,123],{"href":121,"rel":74791},[45]," doesn't supply shared Lever OAuth credentials, so Lever OAuth 2 connections need your own Lever client ID and secret, which means your own Lever partnership. Plan and access rules are from Lever's ",[41,74794,74797],{"href":74795,"rel":74796},"https:\u002F\u002Fhire.lever.co\u002Fdeveloper\u002Fpartner",[45],"partner process page",", as of 21 October 2026.",[179,74800],{},[179,74802],{},[55,74804,21410],{"id":21409},[22,74806,21413,74807,74810],{},[41,74808,123],{"href":121,"rel":74809},[45]," account and one of the two Lever credentials above.",[2354,74812,74813,74828,74834],{},[2357,74814,74815,34,74820,74823,74824,74827],{},[41,74816,74818],{"href":121,"rel":74817},[45],[31,74819,123],{},[31,74821,74822],{},"account:"," sign up at ",[41,74825,21814],{"href":21420,"rel":74826},[45],". Grow and Pro start with a 30-day free trial.",[2357,74829,74830,74833],{},[31,74831,74832],{},"For Lever OAuth 2:"," Lever partner approval and the client ID and secret Lever sends you (step 2).",[2357,74835,74836,74839],{},[31,74837,74838],{},"For Lever API keys:"," customers whose Lever plan includes the Data API feature, with a Super Admin who can create the key.",[22,74841,74842],{},[41,74843,21422],{"href":21420,"rel":74844},[45],[55,74846,74848,74849,3610],{"id":74847},"_1-how-do-you-activate-lever-in-unifiedto","1. How do you activate Lever in ",[41,74850,123],{"href":121,"rel":74851},[45],[22,74853,20149,74854,21581,74857,74860,74861,74863],{},[41,74855,4433],{"href":16276,"rel":74856},[45],[41,74858,123],{"href":121,"rel":74859},[45],", search for Lever or filter by the ATS category, open the Lever card and select ",[31,74862,16295],{},". The integrations you activate are the ones your customers see in the Authorization component.",[22,74865,74866],{},[4201,74867],{"alt":74868,"src":74869},"Screenshot_2026-10-21_at_9.53.58_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fintegration_set_up_guide_for_lever-0.png",[55,74871,74873],{"id":74872},"_2-how-do-you-get-lever-oauth-2-credentials","2. How do you get Lever OAuth 2 credentials?",[22,74875,74876,74877,309,74881,74884],{},"Lever OAuth 2 credentials come only through Lever's partner program: as of 21 October 2026, \"Someone on the Lever team will create your OAuth app and send over your ClientID and Secret\" (",[41,74878,74880],{"href":74795,"rel":74879},[45],"Lever partner process",[41,74882,123],{"href":121,"rel":74883},[45]," has no shared Lever OAuth app, so this step is required for Lever OAuth 2. Skip it only if your customers will connect with API keys.",[2510,74886,74887,74896,74899,74902,74914],{},[2357,74888,74889,74890,74895],{},"Tell Lever you want to build an integration, using Lever's ",[41,74891,74894],{"href":74892,"rel":74893},"https:\u002F\u002Fwww.lever.co\u002Fpartnershipinterest\u002F",[45],"partnership interest form",". Lever's partnerships team reviews each request.",[2357,74897,74898],{},"Once Lever approves you, it provides a Lever sandbox account. Email is turned off in the sandbox, so invited users sign in through the login link.",[2357,74900,74901],{},"Register your sandbox OAuth app (fields below). Lever's team creates it and sends the client ID and secret.",[2357,74903,74904,74905,741,74909,74913],{},"Build and test against the sandbox, then send Lever its four packages: a help centre article about your integration, two sandbox logins for Lever (",[41,74906,74908],{"href":74907},"mailto:sadmin@levertest.com","sadmin@levertest.com",[41,74910,74912],{"href":74911},"mailto:integration-support@lever.co","integration-support@lever.co","), listing information and technical support details.",[2357,74915,74916],{},"After a QA run-through, where you share your screen and walk through the full connection journey, Lever provides production OAuth credentials.",[3629,74918,74920],{"id":74919},"what-does-lever-ask-for-when-you-register-the-app","What does Lever ask for when you register the app?",[22,74922,74923,74924,74927],{},"Lever asks for an integration name, a description of 20 to 140 characters, a callback URI, a link to a square logo (150 × 150 px recommended; not a Google Drive or download link) and the scopes you need (",[41,74925,74711],{"href":74709,"rel":74926},[45],", as of 21 October 2026). Lever's scope rules:",[2354,74929,74930,74933,74943],{},[2357,74931,74932],{},"Most use cases need 5 to 8 scopes, and the maximum is 20.",[2357,74934,2553,74935,74938,74939,74942],{},[36,74936,74937],{},"write:admin"," scope includes its ",[36,74940,74941],{},"read:admin"," scope, so register only the write scope when you need both.",[2357,74944,56322,74945,74947],{},[36,74946,52958],{},". Without it, Lever issues no refresh token.",[22,74949,74788,74950,74953,74954,74956,74957,74960,74961,74966,74967,74969,74970,74973,74974,74977,74978,97],{},[41,74951,123],{"href":121,"rel":74952},[45],"'s Lever integration requests ",[36,74955,52958],{}," plus Lever scopes for opportunities, contact, resumes, postings, users, interviews, stages, files, notes and webhooks, at read or write level depending on the ",[41,74958,123],{"href":121,"rel":74959},[45]," objects you use (",[41,74962,74965],{"href":74963,"rel":74964},"https:\u002F\u002Fdocs.unified.to\u002Fskills\u002Flever-oauth-app\u002FSKILL.md",[45],"Lever OAuth app skill","). Register those resources with Lever, using the ",[36,74968,74937],{}," form for any object you create, update or remove: that's 11 scopes, within Lever's limit of 20. ",[41,74971,123],{"href":121,"rel":74972},[45]," doesn't request Lever's ",[36,74975,74976],{},"confidential:access:admin"," scope. See ",[41,74979,64805],{"href":16407,"rel":74980},[45],[3629,74982,74984],{"id":74983},"which-callback-uri-do-you-give-lever","Which callback URI do you give Lever?",[22,74986,74987,74988,74991],{},"Give Lever the ",[41,74989,123],{"href":121,"rel":74990},[45]," callback URI for your workspace's region. Each workspace has one region: US on every plan, EU or AU on Pro and Scale.",[155,74993,74994,75007],{},[158,74995,74996],{},[161,74997,74998,75004],{},[164,74999,75000,75003],{},[41,75001,123],{"href":121,"rel":75002},[45]," workspace region",[164,75005,75006],{},"Callback URI",[174,75008,75009,75018,75027,75036],{},[161,75010,75011,75014],{},[179,75012,75013],{},"US (every plan)",[179,75015,75016],{},[36,75017,21741],{},[161,75019,75020,75023],{},[179,75021,75022],{},"EU (Pro and Scale)",[179,75024,75025],{},[36,75026,21747],{},[161,75028,75029,75032],{},[179,75030,75031],{},"AU (Pro and Scale)",[179,75033,75034],{},[36,75035,21753],{},[161,75037,75038,75047],{},[179,75039,75040,75041,75043,75044,75046],{},"Copy the URI exactly: a trailing slash, the wrong subdomain or ",[36,75042,43695],{}," instead of ",[36,75045,43699],{}," makes the connection fail. As of 21 October 2026, Lever requires the callback you use to match one registered with your app, and callbacks can't differ per customer. Lever's OAuth page says you register with one callback and request more through Lever support, and its FAQ says an app can have several, so list every region you need when you register. Lever's sandbox and production apps are separate, each with its own client ID, secret and callbacks.",[179,75048],{},[55,75050,75052],{"id":75051},"_3-where-do-you-enter-the-lever-client-id-and-secret","3. Where do you enter the Lever client ID and secret?",[22,75054,75055,75056,22582,75059,75061,75062,75064,75065,75067],{},"On the Lever card in ",[41,75057,123],{"href":121,"rel":75058},[45],[31,75060,49717],{},", enter the Lever client ID and secret, and select ",[31,75063,16295],{},". To test against your Lever sandbox, select ",[31,75066,6091],{}," on the card and enter the sandbox app's client ID and secret; Lever's sandbox and production credentials aren't interchangeable.",[22,75069,75070],{},[4201,75071],{"alt":75072,"src":75073},"Screenshot_2026-10-21_at_9.54.54_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fintegration_set_up_guide_for_lever-1.png",[22,75075,75076,75077,75080,75081,75083,75084,20056],{},"Lever's sandbox is a real Lever account for partners. ",[41,75078,123],{"href":121,"rel":75079},[45],"'s own ",[31,75082,22263],{}," environment is different: it returns synthetic data and accepts any value as credentials (",[41,75085,6091],{"href":16303,"rel":75086},[45],[22,75088,75089,75090,2536],{},"When a customer connects, a Lever Super Admin approves your app for their whole Lever organization (Lever, as of 21 October 2026). ",[41,75091,123],{"href":121,"rel":75092},[45],[55,75094,75096],{"id":75095},"how-do-your-customers-create-a-lever-api-key","How do your customers create a Lever API key?",[22,75098,75099,75100,75103,75104,741,75109,75114],{},"A Super Admin in your customer's Lever account creates the key under ",[31,75101,75102],{},"Settings > Integrations and API > API Credentials",", then enters it when they choose Lever in your Authorization component (Lever ",[41,75105,75108],{"href":75106,"rel":75107},"https:\u002F\u002Fhire.lever.co\u002Fdeveloper\u002Fdocumentation",[45],"API documentation",[41,75110,75113],{"href":75111,"rel":75112},"https:\u002F\u002Fhire.lever.co\u002Fdeveloper\u002Fsupport",[45],"developer FAQ",", as of 21 October 2026).",[2510,75116,75117,75123,75137,75140],{},[2357,75118,21834,75119,75122],{},[31,75120,75121],{},"Generate New Key"," and name the key after your product.",[2357,75124,20156,75125,20160,75127,75130,75131,75136],{},[31,75126,52165],{},[31,75128,75129],{},"Select all",", as shown in ",[41,75132,75135],{"href":75133,"rel":75134},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_get_your_lever_api_key_step_by_step_guide",[45],"How to get your Lever API key",". Lever checks every call against the key's permissions, so a key missing one fails on that endpoint.",[2357,75138,75139],{},"If the customer wants confidential postings and opportunities included, grant confidential access now. Lever allows it only when the key is created.",[2357,75141,75142],{},"Copy the key and paste it into your Authorization component.",[22,75144,75145,75146,97],{},"Lever API keys \"carry many privileges, so keep them secret\", and a Lever account can have several active keys, so each product can have its own. Step-by-step screenshots: ",[41,75147,75135],{"href":75133,"rel":75148},[45],[55,75150,75152],{"id":75151},"_4-how-do-you-add-lever-to-your-app","4. How do you add Lever to your app?",[22,75154,36559,75155,75158],{},[41,75156,123],{"href":121,"rel":75157},[45],"'s Authorization component to your product: your customers pick Lever, authorize, and return to your app with a connection ID.",[2510,75160,75161,75174,75186,75192],{},[2357,75162,75163,75164,21581,75166,75169,75170,97],{},"Copy your workspace ID from ",[31,75165,22164],{},[41,75167,123],{"href":121,"rel":75168},[45],". You can create several environments in one workspace for testing, staging and production; see ",[41,75171,75173],{"href":22153,"rel":75172},[45],"Set environments for your Unified.to workspace",[2357,75175,20149,75176,75179,75180,75182,75183,20056],{},[41,75177,22175],{"href":22173,"rel":75178},[45],", copy the snippet and replace ",[36,75181,62896],{}," with your workspace ID. The preview shows what your customers see. Components are also available for React, Angular, Vue and Svelte (",[41,75184,22226],{"href":21696,"rel":75185},[45],[2357,75187,75188,75189,75191],{},"To build your own UI instead, call ",[36,75190,22189],{},", which returns all activated integrations in a workspace, and show those integrations in your app.",[2357,75193,75194,75195,75198,75199,75202,75203,20056],{},"After a customer authorizes, ",[41,75196,123],{"href":121,"rel":75197},[45]," returns them to your app with the connection ID in the URL (for example ",[36,75200,75201],{},"?id={connection_id}","). Store it with that customer's record (",[41,75204,75206],{"href":28265,"rel":75205},[45],"associate a connection ID with your end user",[55,75208,75210],{"id":75209},"_5-how-do-you-make-your-first-lever-api-call","5. How do you make your first Lever API call?",[22,75212,28770,75213,75216,75217,75219],{},[41,75214,123],{"href":121,"rel":75215},[45],"'s ATS endpoints with the customer's connection ID, for example ",[36,75218,22248],{}," to list Lever candidates. The same endpoints work for every ATS integration, so Lever calls differ from other ATS calls only by connection ID.",[22,75221,75222,75223,75227,75228,75231,75232,20056],{},"SDKs are available for TypeScript, Python, PHP, Java, Go, C# and Ruby (",[41,75224,75226],{"href":22301,"rel":75225},[45],"SDKs","). To see the data model before a customer connects, add ",[36,75229,75230],{},"env=Sandbox"," to your API calls for synthetic data (",[41,75233,75235],{"href":22289,"rel":75234},[45],"Mock API server",[55,75237,75239],{"id":75238},"what-can-you-do-with-a-lever-connection","What can you do with a Lever connection?",[22,75241,21886,75242,75245,75246,75249,75250,75253,75254,75258,75259,75262],{},[41,75243,123],{"href":121,"rel":75244},[45],"'s Lever integration reads nine objects; it creates and updates candidates, applications, jobs, notes and users, adds documents, and removes candidates, documents, notes and interviews. It doesn't create or update interviews. ",[41,75247,123],{"href":121,"rel":75248},[45],"'s candidate maps to Lever's opportunity, the object Lever has recommended since it deprecated its ",[36,75251,75252],{},"\u002Fcandidates"," endpoints in 2020 (",[41,75255,75257],{"href":75106,"rel":75256},[45],"Lever API documentation",", as of 21 October 2026). A Lever contact can have more than one opportunity, so a person with two Lever candidacies appears as two ",[41,75260,123],{"href":121,"rel":75261},[45]," candidates. Each Lever opportunity carries at most one application.",[155,75264,75265,75282],{},[158,75266,75267],{},[161,75268,75269,75274,75277,75280],{},[164,75270,75271,21902],{},[41,75272,123],{"href":121,"rel":75273},[45],[164,75275,75276],{},"Lever object",[164,75278,75279],{},"Methods",[164,75281,21909],{},[174,75283,75284,75298,75312,75325,75339,75352,75364,75376,75388,75398,75411],{},[161,75285,75286,75289,75292,75295],{},[179,75287,75288],{},"ATS candidate",[179,75290,75291],{},"Opportunity",[179,75293,75294],{},"List, Get, Create, Update, Remove",[179,75296,75297],{},"Created: virtual. Updated: native and virtual. Deleted: native",[161,75299,75300,75303,75306,75309],{},[179,75301,75302],{},"ATS application",[179,75304,75305],{},"Opportunity posting stage",[179,75307,75308],{},"List, Get, Create, Update",[179,75310,75311],{},"Created: native and virtual. Updated: virtual",[161,75313,75314,75317,75320,75322],{},[179,75315,75316],{},"ATS job",[179,75318,75319],{},"Posting",[179,75321,75308],{},[179,75323,75324],{},"Created, updated: virtual",[161,75326,75327,75330,75333,75336],{},[179,75328,75329],{},"ATS interview",[179,75331,75332],{},"Opportunity interview",[179,75334,75335],{},"List, Get, Remove",[179,75337,75338],{},"Created, updated: native and virtual. Deleted: native",[161,75340,75341,75344,75347,75350],{},[179,75342,75343],{},"ATS document",[179,75345,75346],{},"Opportunity file",[179,75348,75349],{},"List, Get, Create, Remove",[179,75351,75324],{},[161,75353,75354,75357,75360,75362],{},[179,75355,75356],{},"ATS activity",[179,75358,75359],{},"Opportunity note",[179,75361,75294],{},[179,75363,21964],{},[161,75365,75366,75369,75372,75374],{},[179,75367,75368],{},"ATS scorecard",[179,75370,75371],{},"Opportunity feedback",[179,75373,21919],{},[179,75375,75324],{},[161,75377,75378,75381,75384,75386],{},[179,75379,75380],{},"ATS application status",[179,75382,75383],{},"Stage",[179,75385,22007],{},[179,75387,21964],{},[161,75389,75390,75392,75394,75396],{},[179,75391,21679],{},[179,75393,4690],{},[179,75395,75308],{},[179,75397,75324],{},[161,75399,75400,75403,75406,75409],{},[179,75401,75402],{},"Passthrough",[179,75404,75405],{},"Any Lever API endpoint",[179,75407,75408],{},"GET, POST, PUT, DELETE",[179,75410,21964],{},[161,75412,75413,75428,75430,75432],{},[179,75414,75415,75416,75419,75420,75423,75424,97],{},"Lever is one of 164 ATS integrations on ",[41,75417,123],{"href":121,"rel":75418},[45],". Field-level detail is on the ",[41,75421,74721],{"href":74719,"rel":75422},[45]," and in the ",[41,75425,75427],{"href":27797,"rel":75426},[45],"ATS API overview",[179,75429],{},[179,75431],{},[179,75433],{},[55,75435,75437],{"id":75436},"how-do-lever-changes-reach-your-app","How do Lever changes reach your app?",[22,75439,75440,75443],{},[41,75441,123],{"href":121,"rel":75442},[45]," delivers Lever changes to your webhook URL in two ways. Native webhooks forward the events Lever sends: candidate updates and deletions, new applications, and interview changes. Virtual webhooks detect changes at an interval you set, as often as every minute on paid plans, and a check that finds nothing isn't billed. Every other Lever object with change events in the table above uses virtual webhooks.",[22,75445,75446,75447,75450,75451,741,75454,75457],{},"On Lever API-key connections, native webhooks need the customer's Lever plan to include Lever's Webhook feature. If Lever refuses the subscription, ",[41,75448,123],{"href":121,"rel":75449},[45]," marks the native webhook unhealthy and doesn't switch to virtual checks, so a webhook can be created and still receive no events. For API-key connections, check the webhook's health after you create it, or create a virtual webhook for candidate updates. On Lever OAuth 2 connections, include Lever's ",[36,75452,75453],{},"webhooks:read:admin",[36,75455,75456],{},"webhooks:write:admin"," scopes.",[22,75459,75460,75461,75464,75465,97],{},"As of 21 October 2026, Lever labels its interview webhook events Beta (",[41,75462,75257],{"href":75106,"rel":75463},[45],"). See ",[41,75466,46062],{"href":22112,"rel":75467},[45],[55,75469,75471],{"id":75470},"which-lever-limits-should-you-plan-for","Which Lever limits should you plan for?",[22,75473,75474,75475,75478],{},"As of 21 October 2026, Lever's ",[41,75476,75108],{"href":75106,"rel":75477},[45]," sets these limits:",[2354,75480,75481,75487,75508],{},[2357,75482,75483,75486],{},[31,75484,75485],{},"Rate limit:"," 10 requests per second per API key, with bursts up to 20 when Lever allows. Lever says these defaults aren't guaranteed and recommends exponential backoff.",[2357,75488,75489,75492,75493,75496,75497,75500,75501,75503,75504,20056],{},[31,75490,75491],{},"OAuth tokens:"," on Lever OAuth 2 connections, access tokens expire after one hour, and refresh tokens expire after one year or after 90 days without use. API-key connections use basic auth and have no tokens to expire. ",[41,75494,123],{"href":121,"rel":75495},[45]," refreshes OAuth tokens on a schedule, including on connections with no recent calls, and each refresh returns a new Lever refresh token, so an idle connection doesn't reach Lever's 90-day inactivity limit. If Lever rejects a connection's credentials, ",[41,75498,123],{"href":121,"rel":75499},[45]," marks the connection unhealthy and sends a ",[36,75502,68432],{}," event, so you can ask the customer to re-authorize (",[41,75505,75507],{"href":16749,"rel":75506},[45],"troubleshoot unhealthy connections",[2357,75509,75510,75513,75514,74973,75517,75519],{},[31,75511,75512],{},"Confidential records:"," Lever returns confidential postings and opportunities only to credentials granted confidential access. ",[41,75515,123],{"href":121,"rel":75516},[45],[36,75518,74976],{}," scope (as of 20 September 2026), so Lever OAuth 2 connections don't return confidential records. On an API key, a Super Admin can grant confidential access only when creating the key.",[55,75521,75523],{"id":75522},"where-can-you-get-help","Where can you get help?",[22,75525,75526,75527,75529,75530,97],{},"Email ",[41,75528,21795],{"href":21794}," or chat with the team on ",[41,75531,21800],{"href":75532,"rel":75533},"https:\u002F\u002Fdiscord.gg\u002FuAYnMPFk9t",[45],[22,75535,75536],{},"Keep learning:",[2354,75538,75539,75544,75549,75555,75560,75565],{},[2357,75540,75541],{},[41,75542,75135],{"href":75133,"rel":75543},[45],[2357,75545,75546],{},[41,75547,74721],{"href":74719,"rel":75548},[45],[2357,75550,75551],{},[41,75552,75554],{"href":16766,"rel":75553},[45],"Quick Start",[2357,75556,75557],{},[41,75558,6862],{"href":21696,"rel":75559},[45],[2357,75561,75562],{},[41,75563,46062],{"href":22112,"rel":75564},[45],[2357,75566,75567],{},[41,75568,75173],{"href":22153,"rel":75569},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":75571},[75572,75573,75574,75576,75580,75581,75582,75583,75584,75585,75586,75587],{"id":74702,"depth":2434,"text":74703},{"id":21409,"depth":2434,"text":21410},{"id":74847,"depth":2434,"text":75575},"1. How do you activate Lever in Unified.to?",{"id":74872,"depth":2434,"text":74873,"children":75577},[75578,75579],{"id":74919,"depth":2613,"text":74920},{"id":74983,"depth":2613,"text":74984},{"id":75051,"depth":2434,"text":75052},{"id":75095,"depth":2434,"text":75096},{"id":75151,"depth":2434,"text":75152},{"id":75209,"depth":2434,"text":75210},{"id":75238,"depth":2434,"text":75239},{"id":75436,"depth":2434,"text":75437},{"id":75470,"depth":2434,"text":75471},{"id":75522,"depth":2434,"text":75523},"To connect your customers' Lever accounts to your product through Unified.to, activate Lever in your Unified.to workspace, choose how customers authorize...",{"img":75590,"date":75591,"updated":75592,"tag":2457,"integrations":75593},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fintegration_set_up_guide_for_lever-icon.png","2023-09-27T00:00:00.000Z","2026-10-21T13:56:57.391Z","lever","\u002Fguides\u002Fintegration_set_up_guide_for_lever",{"title":74665,"description":75588},"guides\u002Fintegration_set_up_guide_for_lever","TpnaJUIeI5Z7LWcSrooqpUalrSc4IQC2rtDlg44rR48",{"id":75599,"title":75600,"body":75601,"description":75699,"extension":2452,"meta":75700,"navigation":2459,"path":75704,"seo":75705,"stem":75706,"__hash__":75707},"guides\u002Fguides\u002Fmanaging_custom_validation_rules_in_salesforce.md","Managing custom validation rules in Salesforce",{"type":12,"value":75602,"toc":75697},[75603,75606,75608,75613,75620,75627,75643,75646],[15,75604,75600],{"id":75605},"managing-custom-validation-rules-in-salesforce",[19,75607],{},[22,75609,75610],{},[25,75611,75612],{},"March 22, 2024",[22,75614,75615,75616,75619],{},"If you are getting ",[36,75617,75618],{},"FIELD_CUSTOM_VALIDATION_EXCEPTION"," 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",[22,75621,75622,75623,75626],{},"To get ",[41,75624,123],{"href":121,"rel":75625},[45]," 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.",[22,75628,75629,75630,75633,75634,75639,75640,75642],{},"For example, you are getting ",[36,75631,75632],{},"\"FIELD_CUSTOM_VALIDATION_EXCEPTION: The Shipping address is required.\""," when trying to ",[41,75635,75638],{"href":75636,"rel":75637},"https:\u002F\u002Fdocs.unified.to\u002Fcrm\u002Fcompany\u002FCreate_a_company",[45],"create a Company",". This means there is a custom rule on the Salesforce ",[31,75641,8742],{}," object that requires a shipping address.",[22,75644,75645],{},"Follow these instructions to modify\u002Fremove a custom rule for Account object:",[2510,75647,75648,75658,75669,75679,75689],{},[2357,75649,75650,75651,75653,75655],{},"Go to your Salesforce account and navigate to ",[31,75652,57277],{},[5888,75654],{},[4201,75656],{"alt":20627,"src":75657},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fmanaging_custom_validation_rules_in_salesforce-0.png",[2357,75659,75660,75661,75664,75666],{},"On the left-hand side navigate to ",[31,75662,75663],{},"Objects and Fields > Object Manager",[5888,75665],{},[4201,75667],{"alt":20627,"src":75668},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fmanaging_custom_validation_rules_in_salesforce-1.png",[2357,75670,75671,75672,75674,75676],{},"Select the object you need to modify the rules for. In our case ",[31,75673,8742],{},[5888,75675],{},[4201,75677],{"alt":20627,"src":75678},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fmanaging_custom_validation_rules_in_salesforce-2.png",[2357,75680,16270,75681,75684,75686],{},[31,75682,75683],{},"Validation Rules",[5888,75685],{},[4201,75687],{"alt":20627,"src":75688},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fmanaging_custom_validation_rules_in_salesforce-3.png",[2357,75690,75691,75692,75694],{},"Edit or remove the custom validation rule",[5888,75693],{},[4201,75695],{"alt":20627,"src":75696},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fmanaging_custom_validation_rules_in_salesforce-4.png",{"title":2433,"searchDepth":2434,"depth":2434,"links":75698},[],"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...",{"img":75701,"date":75702,"updated":75703,"tag":2457,"integrations":57520},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fmanaging_custom_validation_rules_in_salesforce-icon.png","2024-03-22T00:00:00.000Z","2026-08-23T14:54:04.914Z","\u002Fguides\u002Fmanaging_custom_validation_rules_in_salesforce",{"title":75600,"description":75699},"guides\u002Fmanaging_custom_validation_rules_in_salesforce","8GUeKTu4cympUHFY3ii5jtmCBLfXDaxBiFioA1e-1js",{"id":75709,"title":75710,"body":75711,"description":75908,"extension":2452,"meta":75909,"navigation":2459,"path":75914,"seo":75915,"stem":75916,"__hash__":75917},"guides\u002Fguides\u002Fmulti_region_sync.md","Multi-Region Sync",{"type":12,"value":75712,"toc":75901},[75713,75716,75718,75723,75726,75729,75733,75736,75756,75761,75765,75768,75804,75807,75811,75814,75817,75820,75834,75838,75852,75854,75892,75894],[15,75714,75710],{"id":75715},"multi-region-sync",[19,75717],{},[22,75719,75720],{},[25,75721,75722],{},"June 22, 2026",[22,75724,75725],{},"Unified.to runs in multiple data regions — US, EU, and AU — so your data can live close to where you and your customers are. Multi-Region Sync keeps your account configuration consistent across those regions automatically.",[22,75727,75728],{},"When you turn on Multi-Region Sync, the settings you manage in your \"home\" region are continuously replicated to your other selected region(s). You configure things once, and they show up everywhere — no manual re-entry, no drift between regions.",[55,75730,75732],{"id":75731},"what-is-multi-region-sync","What is Multi-Region Sync?",[22,75734,75735],{},"Multi-Region Sync is useful when you need to:",[2354,75737,75738,75744,75750],{},[2357,75739,75740,75743],{},[31,75741,75742],{},"Meet data-residency requirements:"," keep certain end users' connection data in the EU or AU while still managing one account.",[2357,75745,75746,75749],{},[31,75747,75748],{},"Reduce latency:"," serve customers from the region closest to them.",[2357,75751,75752,75755],{},[31,75753,75754],{},"Operate with regional redundancy:"," keep your account configuration mirrored across regions.",[4937,75757,75758],{},[22,75759,75760],{},"⭐ Availability: Multi-Region Sync is available on the Scale plan. Enable it in your workspace settings.",[55,75762,75764],{"id":75763},"what-gets-synced","What gets synced",[22,75766,75767],{},"When Multi-Region Sync is enabled, the following are replicated from your home region to your other selected region(s):",[2354,75769,75770,75776,75781,75786,75792,75798],{},[2357,75771,75772,75775],{},[31,75773,75774],{},"Workspace \u002F environment settings"," — your workspace configuration and environment settings.",[2357,75777,75778,75780],{},[31,75779,69134],{}," — the team members and admins on your workspace.",[2357,75782,75783,75785],{},[31,75784,48287],{}," — your Unified.to API keys, so the same keys work in each region.",[2357,75787,75788,75791],{},[31,75789,75790],{},"Integration secrets \u002F credentials"," — the OAuth client credentials and secrets you configure for your integrations.",[2357,75793,75794,75797],{},[31,75795,75796],{},"Workspace integrations"," — your enabled integrations and their configuration (scopes, settings, branding, etc.).",[2357,75799,75800,75803],{},[31,75801,75802],{},"Notifications"," — your workspace notification settings.",[22,75805,75806],{},"In practice: you set up your integrations, branding, API keys, and team once in your home region, and they are automatically mirrored to your other region(s). Updating an integration's configuration or credentials in one region propagates the change to the others.",[55,75808,75810],{"id":75809},"what-does-not-get-synced","What does not get synced",[22,75812,75813],{},"End-user connections, webhooks, and API call logs \u002F usage history are intentionally region-specific and are not replicated.",[22,75815,75816],{},"A connection is the authorization a single end user grants when they connect their account (for example, a customer linking their Salesforce or Google account). These stay in the region where they were created. This is by design — it keeps each end user's data resident in the region you chose for them and avoids duplicating sensitive end-user tokens across regions.",[22,75818,75819],{},"Rule of thumb:",[2354,75821,75822,75828],{},[2357,75823,75824,75827],{},[31,75825,75826],{},"Account-level configuration"," (integrations, credentials, keys, users, settings) → synced across regions.",[2357,75829,75830,75833],{},[31,75831,75832],{},"End-user connections and the data they pull"," → stay in their own region.",[55,75835,75837],{"id":75836},"how-to-enable-multi-region-sync","How to enable Multi-Region Sync",[2510,75839,75840,75843,75846,75849],{},[2357,75841,75842],{},"Make sure your account is on the Scale plan. If you're not sure, contact your account manager.",[2357,75844,75845],{},"Choose your home region — where you set up your account first. Sync is bidirectional, so you can edit configuration in any region and it stays consistent across all of them.",[2357,75847,75848],{},"Select what to sync (workspace settings, users, API keys, integration secrets, workspace integrations, notifications).",[2357,75850,75851],{},"Save. Unified.to performs a one-time initial copy of your existing configuration, then keeps the regions in sync automatically.",[55,75853,46290],{"id":46289},[2354,75855,75856,75862,75868,75874,75880,75886],{},[2357,75857,75858,75861],{},[31,75859,75860],{},"Which regions are supported?"," US, EU, and AU.",[2357,75863,75864,75867],{},[31,75865,75866],{},"Do my customers need to do anything?"," No. They keep connecting in whichever region you set up for them; their connections stay there.",[2357,75869,75870,75873],{},[31,75871,75872],{},"Will enabling sync move my existing connections?"," No. Connections are never moved or copied between regions.",[2357,75875,75876,75879],{},[31,75877,75878],{},"Is the synced data encrypted in transit?"," Yes. All replicated configuration, including secrets, is encrypted and integrity-protected in transit.",[2357,75881,75882,75885],{},[31,75883,75884],{},"Can I choose which items to sync?"," Yes — any combination of the items listed above.",[2357,75887,75888,75891],{},[31,75889,75890],{},"How do I turn it off or change my regions?"," Contact your account manager or Unified.to support.",[19,75893],{},[22,75895,75896,75897,97],{},"Need help? Reach out to your account manager or ",[41,75898,75900],{"href":20543,"rel":75899},[45],"contact Unified.to support",{"title":2433,"searchDepth":2434,"depth":2434,"links":75902},[75903,75904,75905,75906,75907],{"id":75731,"depth":2434,"text":75732},{"id":75763,"depth":2434,"text":75764},{"id":75809,"depth":2434,"text":75810},{"id":75836,"depth":2434,"text":75837},{"id":46289,"depth":2434,"text":46290},"Unified.to runs in multiple data regions — US, EU, and AU — so your data can live close to where you and your customers are. Multi-Region Sync keeps your...",{"img":75910,"date":75911,"updated":75912,"tag":75913,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fmulti_region_sync-icon.png","2026-06-22T15:31:00.000Z","2026-10-08T14:37:32.841Z","Product, Guides","\u002Fguides\u002Fmulti_region_sync",{"title":75710,"description":75908},"guides\u002Fmulti_region_sync","IgZbexGLYUSG8P0j6dHSxQjPcpqXLWoKMHI787sUXrE",{"id":75919,"title":75920,"body":75921,"description":77349,"extension":2452,"meta":77350,"navigation":2459,"path":77355,"seo":77356,"stem":77357,"__hash__":77358},"guides\u002Fguides\u002Fnetsuite_authentication_setup_for_unified.md","NetSuite Authentication Setup for Unified",{"type":12,"value":75922,"toc":77338},[75923,75926,75928,75933,75940,75961,75971,75977,75979,75985,76074,76076,76082,76103,76105,76111,76117,76123,76141,76146,76153,76162,76166,76168,76174,76183,76188,76191,76196,76205,76215,76217,76223,76230,76235,76238,76245,76248,76262,76267,76270,76277,76279,76285,76295,76300,76303,76320,76348,76353,76405,76416,76421,76424,76455,76469,76477,76480,76482,76488,76491,76508,76513,76533,76542,76560,76563,76568,76575,76610,76615,76628,76657,76671,76678,76683,76686,76735,76737,76742,76749,76752,76757,76946,76974,77091,77179,77197,77199,77205,77210,77213,77252,77258,77263,77272,77277,77287,77292,77300,77305,77308,77322,77327,77330],[15,75924,75920],{"id":75925},"netsuite-authentication-setup-for-unified",[19,75927],{},[22,75929,75930],{},[25,75931,75932],{},"February 12, 2026",[22,75934,75935,75936,75939],{},"Unified supports ",[31,75937,75938],{},"two"," authentication methods for connecting to NetSuite:",[2510,75941,75942,75952],{},[2357,75943,75944,75947,75948,75951],{},[31,75945,75946],{},"OAuth 2.0 (Authorization Code Grant)"," — browser-based login. ",[31,75949,75950],{},"Recommended for most customers and for new integrations",". You create a NetSuite Integration Record (Client ID \u002F Client Secret), add those credentials to your Unified workspace, then each connection enters a NetSuite Account ID and completes browser consent. Tokens refresh automatically.",[2357,75953,75954,75957,75958,75960],{},[31,75955,75956],{},"Token-Based Authentication (TBA \u002F OAuth 1.0a)"," — you generate and paste 5 long-lived credentials per NetSuite account. Still supported today, but Oracle will not allow ",[25,75959,35115],{}," TBA integrations starting with NetSuite 2027.1 (TBA end of support is tentatively planned later). Prefer OAuth 2.0 for new work.",[22,75962,75963,75964,75967,75968,97],{},"Both methods talk to the same ",[31,75965,75966],{},"SuiteTalk REST Web Services"," API, so the underlying NetSuite feature flags and the role permissions list below are nearly identical. The main difference is ",[31,75969,75970],{},"how Unified obtains the access token",[22,75972,75973,75976],{},[31,75974,75975],{},"\"Realm\" = NetSuite Account ID"," in every NetSuite client library and connector. We use the terms interchangeably below.",[19,75978],{},[55,75980,75982],{"id":75981},"which-method-should-i-choose",[31,75983,75984],{},"Which method should I choose?",[155,75986,75987,75998],{},[158,75988,75989],{},[161,75990,75991,75993,75995],{},[164,75992],{},[164,75994,60733],{},[164,75996,75997],{},"Token-Based Authentication (TBA)",[174,75999,76000,76011,76022,76033,76044,76055],{},[161,76001,76002,76005,76008],{},[179,76003,76004],{},"Setup effort",[179,76006,76007],{},"Medium — create your OAuth Integration Record once, then customers sign in",[179,76009,76010],{},"Higher — create Integration Record + Access Token",[161,76012,76013,76016,76019],{},[179,76014,76015],{},"Credentials Unified stores",[179,76017,76018],{},"Workspace Client ID\u002FSecret + per-connection access_token\u002Frefresh_token (auto-refreshed)",[179,76020,76021],{},"5 long-lived secrets",[161,76023,76024,76027,76030],{},[179,76025,76026],{},"Best for",[179,76028,76029],{},"Most customers; new \u002F multitenant SaaS (use Public Client \u002F partner app)",[179,76031,76032],{},"Existing TBA setups; quick per-account connect until OAuth is ready",[161,76034,76035,76038,76041],{},[179,76036,76037],{},"Token lifespan",[179,76039,76040],{},"Access token refreshes automatically",[179,76042,76043],{},"Tokens are long-lived; rotate manually",[161,76045,76046,76049,76052],{},[179,76047,76048],{},"What you provide to Unified",[179,76050,76051],{},"Workspace: Client ID\u002FSecret. Connection: Account ID + browser login",[179,76053,76054],{},"Realm + Consumer Key\u002FSecret + Token ID\u002FSecret",[161,76056,76057,76070,76072],{},[179,76058,76059,76060,76063,76064,76066,76067,76069],{},"If you're not sure, ",[31,76061,76062],{},"start with OAuth 2.0",". ",[31,76065,6271],{}," Unified does ",[31,76068,8239],{}," currently provide a pre-registered NetSuite OAuth 2.0 application. You must create your own NetSuite Integration Record (or use TBA).",[179,76071],{},[179,76073],{},[19,76075],{},[55,76077,76079],{"id":76078},"what-you-need-before-starting-both-methods",[31,76080,76081],{},"What you need before starting (both methods)",[2354,76083,76084,76091,76094],{},[2357,76085,76086,76087,76090],{},"Admin access in NetSuite (recommended), ",[31,76088,76089],{},"OR"," a NetSuite admin available to enable features and grant role permissions.",[2357,76092,76093],{},"The role used for the connection must have the correct permissions (see Required Role Permissions below).",[2357,76095,76096,76097,76099,76100,76102],{},"For sandbox testing, know whether you are in ",[31,76098,6091],{}," vs ",[31,76101,43608],{}," — your Account ID and credentials are different between environments.",[19,76104],{},[55,76106,76108],{"id":76107},"step-1-enable-the-required-netsuite-featuresboth-methods",[31,76109,76110],{},"Step 1 — Enable the required NetSuite features (both methods)",[22,76112,76113,76114,7301],{},"In NetSuite: ",[31,76115,76116],{},"Setup → Company → Enable Features → SuiteCloud",[22,76118,6235,76119,76122],{},[31,76120,76121],{},"Manage Authentication",", enable:",[2354,76124,76125,76133],{},[2357,76126,76127,76128,8032,76130],{},"✅ ",[31,76129,60733],{},[25,76131,76132],{},"(required for OAuth 2.0 method)",[2357,76134,76127,76135,8032,76138],{},[31,76136,76137],{},"Token-Based Authentication",[25,76139,76140],{},"(required for TBA method)",[22,76142,6235,76143,76122],{},[31,76144,76145],{},"SuiteTalk (Web Services)",[2354,76147,76148],{},[2357,76149,76127,76150],{},[31,76151,76152],{},"REST Web Services",[22,76154,76155,76156,76158,76159,76161],{},"Without ",[31,76157,76152],{},", all API calls return ",[31,76160,16723],{}," regardless of which auth method you use, so make sure this is on.",[22,76163,6184,76164,97],{},[31,76165,46022],{},[19,76167],{},[55,76169,76171],{"id":76170},"step-2-find-your-realm-account-idboth-methods",[31,76172,76173],{},"Step 2 — Find your Realm \u002F Account ID (both methods)",[22,76175,59295,76176,76179,76180,97],{},[31,76177,76178],{},"Realm"," is your ",[31,76181,76182],{},"NetSuite Account ID",[22,76184,76185],{},[31,76186,76187],{},"Option A — from the URL (fastest):",[22,76189,76190],{},"When logged into NetSuite, the Account ID is in the host portion of the URL.",[22,76192,76193],{},[31,76194,76195],{},"Option B — from Company Information:",[22,76197,76198,76201,76202,97],{},[31,76199,76200],{},"Setup → Company → Company Information"," → look for ",[31,76203,76204],{},"Account ID",[22,76206,76207,76210,76211,76214],{},[31,76208,76209],{},"Sandbox note:"," Sandbox accounts include a suffix like _SB1 (or -SB1 in URLs). Use ",[31,76212,76213],{},"underscores"," when entering the Account ID into Unified (e.g. 1234567_SB1). Unified normalizes between the URL form (-sb1) and the OAuth realm form (_SB1) automatically.",[19,76216],{},[55,76218,76220],{"id":76219},"step-3-configure-the-role-used-for-the-connection-both-methods",[31,76221,76222],{},"Step 3 — Configure the Role used for the connection (both methods)",[22,76224,76225,76226,76229],{},"This is the ",[31,76227,76228],{},"most important step"," for avoiding 401 INVALID_LOGIN and \"permission denied\" errors. The role you use determines what Unified can read and write — for both OAuth 2.0 and TBA.",[22,76231,76232],{},[31,76233,76234],{},"Recommended: use the Administrator role",[22,76236,76237],{},"The simplest and most reliable option:",[2354,76239,76240],{},[2357,76241,6837,76242,76244],{},[31,76243,51681],{}," role for the connecting user (OAuth 2.0), or for the token (TBA).",[22,76246,76247],{},"This guarantees:",[2354,76249,76250,76253,76256,76259],{},[2357,76251,76252],{},"All record types are accessible",[2357,76254,76255],{},"All subsidiaries are accessible",[2357,76257,76258],{},"No hidden permission failures",[2357,76260,76261],{},"Fastest setup",[22,76263,76264],{},[31,76265,76266],{},"Optional: create a dedicated \"Unified API\" custom role",[22,76268,76269],{},"If your security policy requires a least-privilege role, create one and grant the permissions in Required Role Permissions.",[22,76271,76272,76273,76276],{},"User-level restrictions can override role-level permissions. If you use a custom role, make sure the ",[31,76274,76275],{},"user account itself"," also has these permissions where applicable.",[19,76278],{},[55,76280,76282],{"id":76281},"step-4a-connect-using-oauth-20-recommended",[31,76283,76284],{},"Step 4A — Connect using OAuth 2.0 (recommended)",[22,76286,76287,76288,76291,76292,76294],{},"OAuth 2.0 requires ",[31,76289,76290],{},"your own"," NetSuite Integration Record with Authorization Code Grant enabled. Unified does ",[31,76293,8239],{}," ship a pre-registered NetSuite OAuth app. Store the Client ID and Client Secret on your NetSuite workspace integration in Unified, set the auth method to OAuth 2.0, then connect each customer account with their NetSuite Account ID + browser consent.",[22,76296,76297],{},[31,76298,76299],{},"4A.1 Create a NetSuite Integration Record (OAuth 2.0)",[22,76301,76302],{},"In NetSuite:",[2354,76304,76305,76310],{},[2357,76306,21005,76307,97],{},[31,76308,76309],{},"Setup → Integration → Manage Integrations → New",[2357,76311,76312,76313,76316,76317,97],{},"Name it after ",[25,76314,76315],{},"your product"," (customers see this on the consent screen). Set ",[31,76318,76319],{},"State = Enabled",[22,76321,76322,76323,76326,76327,76329,76330,76332,76333,76335,76336,76338,76339,76342,76343,741,76345,76347],{},"On the Authentication tab: enable ",[31,76324,76325],{},"Authorization Code Grant","; enable ",[31,76328,76152],{},"; set Redirect URI to Unified's callback for your data center (US: ",[36,76331,21741],{},", EU: ",[36,76334,21747],{},", AU: ",[36,76337,21753],{},"). For multitenant SaaS (many customer NetSuite accounts authorizing one Client ID), enable ",[31,76340,76341],{},"Public Client"," (PKCE). Unified's NetSuite OAuth flow uses PKCE. Save and copy the ",[31,76344,4491],{},[31,76346,4494],{}," immediately.",[22,76349,76350],{},[31,76351,76352],{},"4A.2 Add OAuth credentials in Unified (workspace)",[2510,76354,76355,76362,76368,76376,76379,76393,76399],{},[2357,76356,76357,76358,76361],{},"In the Unified dashboard, activate or edit the ",[31,76359,76360],{},"NetSuite"," workspace integration.",[2357,76363,76364,76365,76367],{},"Choose authentication method ",[31,76366,60733],{}," (not Token \u002F TBA).",[2357,76369,76370,76371,741,76373,76375],{},"Paste your NetSuite ",[31,76372,4491],{},[31,76374,4494],{},", then save.",[2357,76377,76378],{},"Until Client ID\u002FSecret are saved and OAuth 2.0 is selected, the connect UI defaults to the TBA (five-field) form — which is why OAuth can look missing in the product UI.",[2357,76380,76381,76384,76385,60289,76387,4149,76390,20056],{},[31,76382,76383],{},"Then connect a NetSuite account:"," start a NetSuite connection and enter the customer's ",[31,76386,76182],{},[36,76388,76389],{},"1234567",[36,76391,76392],{},"1234567_SB1",[2357,76394,76395,76396,76398],{},"Complete the NetSuite browser login \u002F consent screen. Choose the ",[31,76397,66363],{}," to authorize under — Administrator or your custom least-privilege role with the permissions below.",[2357,76400,16292,76401,76404],{},[31,76402,76403],{},"Allow",". Unified stores the access and refresh tokens for that connection. Each Unified connection is one NetSuite account (one Account ID).",[22,76406,76407,76408,76411,76412,76415],{},"The access token is refreshed automatically on expiry. A ",[25,76409,76410],{},"private"," Integration Record only works in the NetSuite account that created it. For multitenant SaaS you need a ",[31,76413,76414],{},"Public Client \u002F partner-distributed"," NetSuite application (or each customer must install\u002Ftrust your Integration Record).",[22,76417,76418],{},[31,76419,76420],{},"4A.3 Make sure the authorizing user has the right role",[22,76422,76423],{},"The user who completes consent in NetSuite must have a role that:",[2510,76425,76426,76433,76436,76442],{},[2357,76427,76428,76429,76432],{},"Includes the permissions in ",[31,76430,76431],{},"Required Role Permissions"," below (including Log in using OAuth 2.0 Access Tokens).",[2357,76434,76435],{},"Has access to all subsidiaries you want Unified to sync.",[2357,76437,76438,76439,76441],{},"Confirm role assignment under Lists → Employees → Employees → ",[414,76440,62707],{}," → Access tab.",[2357,76443,76444,76445,741,76450,97],{},"Oracle references: ",[41,76446,76449],{"href":76447,"rel":76448},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fcloud\u002Fsaas\u002Fnetsuite\u002Fns-online-help\u002Fsection_157771733782.html",[45],"Create Integration Records for OAuth 2.0",[41,76451,76454],{"href":76452,"rel":76453},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fcloud\u002Fsaas\u002Fnetsuite\u002Fns-online-help\u002Fsection_158074210415.html",[45],"OAuth 2.0 Authorization Code Grant Flow",[2354,76456,76457,76460,76466],{},[2357,76458,76459],{},"You add Client ID\u002FSecret yourself on the Unified workspace integration — you do not need to send them to Unified support.",[2357,76461,76462,76463,76465],{},"Consent branding shows ",[25,76464,16348],{}," Integration Record name, not 'Unified', when using your own app.",[2357,76467,76468],{},"If OAuth is not configured on the workspace, Unified falls back to the TBA credential form.",[2510,76470,76471,76474],{},[2357,76472,76473],{},"After connecting, verify a simple read (for example list invoices or accounts) to confirm the consented role has the needed permissions.",[2357,76475,76476],{},"To re-authorize later: revoke under Setup → Users\u002FRoles → OAuth 2.0 Authorized Applications if needed, then reconnect in Unified.",[22,76478,76479],{},"Reference: NetSuite OAuth 2.0 Authorization Code Grant Flow (Oracle Help Center).",[19,76481],{},[55,76483,76485],{"id":76484},"step-4b-connect-using-token-based-authenticationtba",[31,76486,76487],{},"Step 4B — Connect using Token-Based Authentication (TBA)",[22,76489,76490],{},"If you chose TBA, you will provide Unified 5 values. TBA is still the simpler per-customer path today, but prefer OAuth 2.0 for new multitenant work (Oracle: no new TBA integrations from 2027.1).",[2354,76492,76493,76496,76499,76502,76505],{},[2357,76494,76495],{},"realm (NetSuite Account ID)",[2357,76497,76498],{},"consumer_key",[2357,76500,76501],{},"consumer_secret",[2357,76503,76504],{},"token_id (a.k.a. Token Key)",[2357,76506,76507],{},"token_secret",[22,76509,76510],{},[31,76511,76512],{},"4B.1 Create the Integration Record (Consumer Key \u002F Secret)",[2510,76514,76515,76519,76522,76528],{},[2357,76516,76517],{},[31,76518,76309],{},[2357,76520,76521],{},"Name: e.g. \"Unified Integration\"",[2357,76523,76524,76525],{},"State: ",[31,76526,76527],{},"Enabled",[2357,76529,43581,76530,76532],{},[31,76531,37791],{}," tab:",[2354,76534,76535,76539],{},[2357,76536,76127,76537],{},[31,76538,76137],{},[2357,76540,76541],{},"(Leave OAuth 2.0 off unless you also plan to use OAuth 2.0 with the same record.)",[2510,76543,76544],{},[2357,76545,76546,76548,76549,4950,76552,76555,76556,76559],{},[31,76547,46022],{}," — NetSuite displays the ",[31,76550,76551],{},"Consumer Key",[31,76553,76554],{},"Consumer Secret",". ",[31,76557,76558],{},"Copy them immediately","; the Consumer Secret cannot be viewed again.",[22,76561,76562],{},"These are the consumer_key and consumer_secret you'll give Unified.",[22,76564,76565],{},[31,76566,76567],{},"4B.2 Assign the role to the user who will own the token",[22,76569,76570,76571,76574],{},"Tokens are created for a ",[31,76572,76573],{},"User + Role + Integration Record"," combination.",[2510,76576,76577,76582,76589,76594,76606],{},[2357,76578,76579],{},[31,76580,76581],{},"Lists → Employees → Employees",[2357,76583,76584,76585,2980],{},"Select the user (or create a dedicated \"API User\" like ",[41,76586,76588],{"href":76587},"mailto:unified-api@yourcompany.com","unified-api@yourcompany.com",[2357,76590,59413,76591,50203],{},[31,76592,76593],{},"Access",[2357,76595,76596,76597,76599,76600,76602,76603,76605],{},"Assign ",[31,76598,51681],{}," (recommended) ",[31,76601,76089],{}," your custom ",[31,76604,8712],{}," role",[2357,76607,76608],{},[31,76609,46022],{},[22,76611,76612],{},[31,76613,76614],{},"4B.3 Create the Access Token (Token ID \u002F Token Secret)",[2510,76616,76617,76625],{},[2357,76618,76619,8032,76622],{},[31,76620,76621],{},"Setup → Users\u002FRoles → Access Tokens → New",[25,76623,76624],{},"(may be labelled \"Manage Access Tokens\" in some UIs)",[2357,76626,76627],{},"Fill in:",[2354,76629,76630,76635,76640,76651],{},[2357,76631,76632,76634],{},[31,76633,6194],{},": the Integration Record you created (e.g. \"Unified Integration\")",[2357,76636,76637,76639],{},[31,76638,4690],{},": the user from 4B.2",[2357,76641,76642,51878,76644,76599,76646,76648,76649,76605],{},[31,76643,66363],{},[31,76645,51681],{},[31,76647,76089],{}," your ",[31,76650,8712],{},[2357,76652,76653,76656],{},[31,76654,76655],{},"Token Name",": optional but recommended (e.g. \"Unified Production Token\")",[2510,76658,76659],{},[2357,76660,76661,76548,76663,4950,76666,76555,76669,97],{},[31,76662,46022],{},[31,76664,76665],{},"Token ID",[31,76667,76668],{},"Token Secret",[31,76670,76558],{},[22,76672,76673,76674,76677],{},"The role you select here is the role whose permissions are enforced on ",[31,76675,76676],{},"every"," API call made with this token. Choosing the wrong role is the #1 cause of 401 INVALID_LOGIN and permission errors.",[22,76679,76680],{},[31,76681,76682],{},"4B.4 Provide the 5 values to Unified",[22,76684,76685],{},"In the Unified connection form, enter:",[155,76687,76688,76698],{},[158,76689,76690],{},[161,76691,76692,76695],{},[164,76693,76694],{},"Unified field",[164,76696,76697],{},"NetSuite value",[174,76699,76700,76708,76715,76721,76729],{},[161,76701,76702,76705],{},[179,76703,76704],{},"realm_id (or \"Account ID\")",[179,76706,76707],{},"from Step 2",[161,76709,76710,76712],{},[179,76711,76498],{},[179,76713,76714],{},"from Step 4B.1",[161,76716,76717,76719],{},[179,76718,76501],{},[179,76720,76714],{},[161,76722,76723,76726],{},[179,76724,76725],{},"token_id",[179,76727,76728],{},"from Step 4B.3",[161,76730,76731,76733],{},[179,76732,76507],{},[179,76734,76728],{},[19,76736],{},[55,76738,76740],{"id":76739},"required-role-permissions",[31,76741,76431],{},[22,76743,76744,76745,76748],{},"These apply to ",[31,76746,76747],{},"both"," OAuth 2.0 and TBA when you choose a custom (non-Administrator) role. The list is the full set required for full accounting + CRM + commerce + HRIS support. You can trim it based on which Unified object types you actually use.",[22,76750,76751],{},"User-level restrictions can override role-level permissions. Make sure the user has these permissions in addition to the role.",[22,76753,76754],{},[31,76755,76756],{},"Transactions",[155,76758,76759,76768],{},[158,76760,76761],{},[161,76762,76763,76765],{},[164,76764,44771],{},[164,76766,76767],{},"Level",[174,76769,76770,76778,76785,76792,76799,76806,76813,76820,76827,76834,76841,76848,76855,76862,76868,76875,76882,76889,76896,76903,76910,76916,76923,76930,76937],{},[161,76771,76772,76775],{},[179,76773,76774],{},"Access Payment Audit Log",[179,76776,76777],{},"Full",[161,76779,76780,76783],{},[179,76781,76782],{},"Bill Purchase Orders",[179,76784,76777],{},[161,76786,76787,76790],{},[179,76788,76789],{},"Bills",[179,76791,76777],{},[161,76793,76794,76797],{},[179,76795,76796],{},"Cash Sale",[179,76798,76777],{},[161,76800,76801,76804],{},[179,76802,76803],{},"Cash Sale Refund",[179,76805,76777],{},[161,76807,76808,76811],{},[179,76809,76810],{},"Credit Memo",[179,76812,76777],{},[161,76814,76815,76818],{},[179,76816,76817],{},"Cross Charge Journal",[179,76819,67261],{},[161,76821,76822,76825],{},[179,76823,76824],{},"Customer Deposit",[179,76826,76777],{},[161,76828,76829,76832],{},[179,76830,76831],{},"Customer Payment",[179,76833,76777],{},[161,76835,76836,76839],{},[179,76837,76838],{},"Customer Refund",[179,76840,76777],{},[161,76842,76843,76846],{},[179,76844,76845],{},"Enter Vendor Credits",[179,76847,76777],{},[161,76849,76850,76853],{},[179,76851,76852],{},"Find Transaction",[179,76854,76777],{},[161,76856,76857,76860],{},[179,76858,76859],{},"Intercompany Adjustments",[179,76861,76777],{},[161,76863,76864,76866],{},[179,76865,4670],{},[179,76867,76777],{},[161,76869,76870,76873],{},[179,76871,76872],{},"Invoice Approval",[179,76874,76777],{},[161,76876,76877,76880],{},[179,76878,76879],{},"Invoice Sales Orders",[179,76881,76777],{},[161,76883,76884,76887],{},[179,76885,76886],{},"Item Receipt",[179,76888,76777],{},[161,76890,76891,76894],{},[179,76892,76893],{},"Item Shipment",[179,76895,76777],{},[161,76897,76898,76901],{},[179,76899,76900],{},"Journal Approval",[179,76902,76777],{},[161,76904,76905,76908],{},[179,76906,76907],{},"Make Journal Entry",[179,76909,76777],{},[161,76911,76912,76914],{},[179,76913,75291],{},[179,76915,76777],{},[161,76917,76918,76921],{},[179,76919,76920],{},"Paycheck Journal",[179,76922,76777],{},[161,76924,76925,76928],{},[179,76926,76927],{},"Receive Order",[179,76929,76777],{},[161,76931,76932,76935],{},[179,76933,76934],{},"System Journal",[179,76936,76777],{},[161,76938,76939,76944],{},[179,76940,76941],{},[31,76942,76943],{},"Reports",[179,76945],{},[155,76947,76948,76956],{},[158,76949,76950],{},[161,76951,76952,76954],{},[164,76953,44771],{},[164,76955,76767],{},[174,76957,76958,76965],{},[161,76959,76960,76963],{},[179,76961,76962],{},"Transaction Detail",[179,76964,67261],{},[161,76966,76967,76972],{},[179,76968,76969],{},[31,76970,76971],{},"Lists",[179,76973],{},[155,76975,76976,76984],{},[158,76977,76978],{},[161,76979,76980,76982],{},[164,76981,44771],{},[164,76983,76767],{},[174,76985,76986,76993,77000,77007,77014,77021,77027,77034,77041,77048,77055,77062,77069,77076,77083],{},[161,76987,76988,76991],{},[179,76989,76990],{},"Accounts",[179,76992,76777],{},[161,76994,76995,76998],{},[179,76996,76997],{},"Address List in Search",[179,76999,76777],{},[161,77001,77002,77005],{},[179,77003,77004],{},"Contact-Subsidiary Relationship",[179,77006,67261],{},[161,77008,77009,77012],{},[179,77010,77011],{},"Contacts",[179,77013,76777],{},[161,77015,77016,77019],{},[179,77017,77018],{},"Currency",[179,77020,76777],{},[161,77022,77023,77025],{},[179,77024,33481],{},[179,77026,76777],{},[161,77028,77029,77032],{},[179,77030,77031],{},"Employee Record",[179,77033,76777],{},[161,77035,77036,77039],{},[179,77037,77038],{},"Employees",[179,77040,76777],{},[161,77042,77043,77046],{},[179,77044,77045],{},"Inventory Cost Template",[179,77047,67261],{},[161,77049,77050,77053],{},[179,77051,77052],{},"Locations",[179,77054,76777],{},[161,77056,77057,77060],{},[179,77058,77059],{},"Partners",[179,77061,76777],{},[161,77063,77064,77067],{},[179,77065,77066],{},"Perform Search",[179,77068,67261],{},[161,77070,77071,77074],{},[179,77072,77073],{},"Subsidiaries",[179,77075,76777],{},[161,77077,77078,77081],{},[179,77079,77080],{},"Vendors",[179,77082,76777],{},[161,77084,77085,77089],{},[179,77086,77087],{},[31,77088,57277],{},[179,77090],{},[155,77092,77093,77101],{},[158,77094,77095],{},[161,77096,77097,77099],{},[164,77098,44771],{},[164,77100,76767],{},[174,77102,77103,77114,77121,77130,77140,77149,77155,77162,77171],{},[161,77104,77105,77108],{},[179,77106,77107],{},"Access Token Management",[179,77109,77110,77111],{},"Full ",[25,77112,77113],{},"(TBA only)",[161,77115,77116,77119],{},[179,77117,77118],{},"Integration Application",[179,77120,76777],{},[161,77122,77123,77126],{},[179,77124,77125],{},"Log in using Access Tokens",[179,77127,77110,77128],{},[25,77129,77113],{},[161,77131,77132,77135],{},[179,77133,77134],{},"Log in using OAuth 2.0 Access Tokens",[179,77136,77110,77137],{},[25,77138,77139],{},"(OAuth 2.0 only)",[161,77141,77142,77145],{},[179,77143,77144],{},"OAuth 2.0 Authorized Applications Management",[179,77146,77110,77147],{},[25,77148,77139],{},[161,77150,77151,77153],{},[179,77152,76152],{},[179,77154,76777],{},[161,77156,77157,77160],{},[179,77158,77159],{},"Two-Factor Authentication Base",[179,77161,76777],{},[161,77163,77164,77167],{},[179,77165,77166],{},"User Access Tokens",[179,77168,77110,77169],{},[25,77170,77113],{},[161,77172,77173,77177],{},[179,77174,77175],{},[31,77176,20025],{},[179,77178],{},[2354,77180,77181,77188,77194],{},[2357,77182,77183,77184,77187],{},"For TBA, the token inherits the permissions of the ",[31,77185,77186],{},"role selected when the token is created"," — not the user's default role.",[2357,77189,77190,77191,97],{},"For OAuth 2.0, the access token inherits the permissions of the ",[31,77192,77193],{},"role selected during the NetSuite consent screen",[2357,77195,77196],{},"Subsidiary access is controlled by role restrictions. If you use OneWorld, ensure the role has access to every subsidiary Unified must sync.",[19,77198],{},[55,77200,77202],{"id":77201},"validation-troubleshooting",[31,77203,77204],{},"Validation & Troubleshooting",[22,77206,77207],{},[31,77208,77209],{},"401 INVALID_LOGIN",[22,77211,77212],{},"This almost always means one of:",[2354,77214,77215,77221,77226,77229,77232,77238,77243,77246],{},[2357,77216,77217,77220],{},[31,77218,77219],{},"Wrong role selected"," when the OAuth 2.0 consent was approved, or when the TBA token was created.",[2357,77222,77223,77225],{},[31,77224,61385],{}," on the role:",[2357,77227,77228],{},"OAuth 2.0: missing Log in using OAuth 2.0 Access Tokens and\u002For OAuth 2.0 Authorized Applications Management",[2357,77230,77231],{},"TBA: missing Log in using Access Tokens, Access Token Management, or User Access Tokens",[2357,77233,77234,77237],{},[31,77235,77236],{},"Wrong Account ID"," (especially mixing sandbox with production).",[2357,77239,77240,77242],{},[31,77241,76152],{}," not enabled at the account level.",[2357,77244,77245],{},"Integration Record disabled, or (OAuth) workspace missing Client ID\u002FSecret \u002F auth method still set to Token.",[2357,77247,77248,77251],{},[31,77249,77250],{},"Consumer key\u002Fsecret paired with a token from a different Integration Record"," (TBA only).",[22,77253,77254,77255,2646],{},"The fastest way to diagnose is the ",[31,77256,77257],{},"Login Audit Trail",[22,77259,77260],{},[31,77261,77262],{},"Setup → Users\u002FRoles → User Management → View Login Audit Trail",[22,77264,77265,77266,57498,77269,77271],{},"Filter by ",[31,77267,77268],{},"Token-based",[31,77270,60733],{}," logins and look at the failure reason on the most recent attempt.",[22,77273,77274],{},[31,77275,77276],{},"400 Bad Request \u002F INSUFFICIENT_PERMISSION",[22,77278,77279,77280,4696,77283,77286],{},"The connection authenticated but the role lacks permission for the specific record type Unified is trying to access. Add the missing permission from the Required Role Permissions table (most commonly ",[31,77281,77282],{},"Lists → Subsidiaries",[31,77284,77285],{},"Lists → Accounts",", or a Transaction permission).",[22,77288,77289],{},[31,77290,77291],{},"Sandbox vs Production",[2354,77293,77294,77297],{},[2357,77295,77296],{},"Sandbox tokens \u002F OAuth 2.0 consents only work against the sandbox account.",[2357,77298,77299],{},"Sandbox URLs use -sb1 (e.g. 1234567-sb1.app.netsuite.com); the realm sent on API calls uses _SB1 (e.g. 1234567_SB1). Unified handles the conversion automatically — just enter the Account ID with the _SB1 underscore form when prompted.",[22,77301,77302],{},[31,77303,77304],{},"Token rotation (TBA)",[22,77306,77307],{},"NetSuite TBA tokens don't expire by default, but your security policy may require rotation:",[2510,77309,77310,77313,77316],{},[2357,77311,77312],{},"Create a new Access Token under the same User + Role + Integration Record.",[2357,77314,77315],{},"Update the token_id and token_secret in Unified.",[2357,77317,77318,77319,97],{},"Revoke the old token in ",[31,77320,77321],{},"Setup → Users\u002FRoles → Access Tokens",[22,77323,77324],{},[31,77325,77326],{},"Re-authorizing OAuth 2.0",[22,77328,77329],{},"If a user is removed or their role changes, the OAuth 2.0 grant may become invalid. To re-authorize:",[2510,77331,77332,77335],{},[2357,77333,77334],{},"In NetSuite: Setup → Users\u002FRoles → OAuth 2.0 Authorized Applications → revoke the existing grant for your Integration Record (optional but recommended).",[2357,77336,77337],{},"In Unified, reconnect the NetSuite integration. You'll be sent back through the NetSuite consent screen.",{"title":2433,"searchDepth":2434,"depth":2434,"links":77339},[77340,77341,77342,77343,77344,77345,77346,77347,77348],{"id":75981,"depth":2434,"text":75984},{"id":76078,"depth":2434,"text":76081},{"id":76107,"depth":2434,"text":76110},{"id":76170,"depth":2434,"text":76173},{"id":76219,"depth":2434,"text":76222},{"id":76281,"depth":2434,"text":76284},{"id":76484,"depth":2434,"text":76487},{"id":76739,"depth":2434,"text":76431},{"id":77201,"depth":2434,"text":77204},"Unified supports two authentication methods for connecting to NetSuite,",{"img":77351,"date":77352,"updated":77353,"tag":2457,"integrations":77354},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fnetsuite_authentication_setup_for_unified-icon.svg","2026-02-12T19:38:00.000Z","2026-09-04T14:27:43.968Z","netsuite","\u002Fguides\u002Fnetsuite_authentication_setup_for_unified",{"title":75920,"description":77349},"guides\u002Fnetsuite_authentication_setup_for_unified","0RGklNTcT2gW7BNG9M9eWkFoU4-MtzItMBxz6_Rry8I",{"id":77360,"title":77361,"body":77362,"description":84717,"extension":2452,"meta":84718,"navigation":2459,"path":84722,"seo":84723,"stem":84724,"__hash__":84725},"guides\u002Fguides\u002Fnotice_of_deprecation_of_fields_and_objects_nov_2025.md","Notice of Deprecation of Fields and Objects (Nov 2025)",{"type":12,"value":77363,"toc":84624},[77364,77367,77369,77373,77377,77380,77383,77386,77389,77392,77398,77400,77404,77442,77444,77447,77456,77464,77469,77525,77530,77547,77552,77568,77573,77598,77602,77675,77677,77684,77690,77694,77732,77736,77752,77756,77773,77777,77806,77810,77898,77900,77903,77911,77919,77927,77931,77948,77952,77992,77996,78010,78014,78032,78036,78113,78115,78123,78128,78138,78142,78157,78161,78173,78177,78195,78199,78276,78278,78286,78290,78297,78301,78316,78320,78336,78340,78358,78362,78438,78440,78448,78452,78459,78463,78479,78483,78499,78503,78521,78525,78602,78604,78607,78616,78621,78625,78634,78638,78654,78658,78675,78679,78710,78714,78821,78823,78832,78836,78842,78846,78861,78865,78879,78883,78902,78906,79008,79010,79019,79023,79031,79035,79050,79054,79071,79075,79103,79107,79268,79270,79274,79282,79290,79300,79304,79312,79316,79331,79335,79352,79356,79385,79389,79495,79497,79504,79508,79514,79518,79533,79537,79545,79549,79569,79573,79721,79723,79726,79735,79739,79746,79750,79778,79782,79804,79808,79835,79839,79918,79920,79925,79929,79935,79939,79955,79959,79964,79968,79984,79986,79994,79998,80008,80012,80028,80032,80046,80050,80082,80086,80202,80204,80213,80217,80226,80230,80247,80251,80265,80269,80295,80299,80449,80451,80460,80464,80470,80474,80490,80494,80507,80511,80527,80531,80641,80643,80652,80656,80662,80666,80682,80686,80699,80703,80719,80723,80833,80835,80848,80852,80858,80862,80879,80883,80903,80907,80928,80932,81050,81052,81061,81065,81071,81075,81091,81095,81109,81113,81129,81133,81192,81194,81204,81209,81220,81224,81232,81236,81257,81261,81327,81329,81332,81341,81345,81354,81358,81373,81377,81394,81398,81421,81425,81512,81514,81522,81526,81534,81538,81554,81558,81575,81579,81604,81608,81741,81743,81746,81755,81759,81769,81773,81789,81793,81806,81810,81835,81839,81918,81920,81923,81932,81936,81946,81950,81966,81970,81984,81986,81989,81998,82002,82009,82014,82030,82034,82047,82051,82072,82076,82143,82145,82154,82158,82232,82236,82257,82261,82279,82283,82300,82304,82396,82402,82406,82422,82426,82457,82461,82516,82522,82526,82548,82553,82587,82591,82618,82624,82645,82650,82667,82671,82805,82807,82814,82820,82828,82832,82840,82845,82882,82887,82892,83082,83087,83313,83318,83490,83495,83871,83875,83935,83939,84060,84065,84091,84093,84096,84103,84110,84115,84135,84139,84216,84220,84315,84319,84332,84334,84338,84532,84543,84545,84549,84556,84566,84573,84581,84588,84604,84610,84621],[15,77365,77361],{"id":77366},"notice-of-deprecation-of-fields-and-objects-nov-2025",[19,77368],{},[22,77370,77371],{},[25,77372,57978],{},[15,77374,77376],{"id":77375},"deprecated-fields-objects-list-options","Deprecated Fields, Objects & List Options",[22,77378,77379],{},"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.",[22,77381,77382],{},"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.",[22,77384,77385],{},"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.",[22,77387,77388],{},"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.",[22,77390,77391],{},"This document provides a comprehensive breakdown of all deprecation in the Unified API as of November 2025, organized by category with migration recommendations.",[22,77393,77394,77395],{},"Please make all necessary changes to your code by ",[36,77396,77397],{},"JANUARY 7, 2026",[19,77399],{},[55,77401,77403],{"id":77402},"table-of-contents","Table of Contents",[2510,77405,77406,77409,77412,77415,77418,77421,77424,77427,77430,77433,77436,77439],{},[2357,77407,77408],{},"MetadataMetadata Fields",[2357,77410,77411],{},"Parent Fields",[2357,77413,77414],{},"HRIS Employee Fields",[2357,77416,77417],{},"MessagingMessage Fields",[2357,77419,77420],{},"Accounting Fields",[2357,77422,77423],{},"ATS (Applicant Tracking System) Fields",[2357,77425,77426],{},"Ticketing Fields",[2357,77428,77429],{},"Calendar Fields",[2357,77431,77432],{},"Query Parameters & Filters",[2357,77434,77435],{},"Webhook Fields",[2357,77437,77438],{},"Deprecated Objects\u002FUsage Patterns",[2357,77440,77441],{},"Deprecated Types\u002FInterfaces",[19,77443],{},[55,77445,77408],{"id":77446},"metadatametadata-fields",[3629,77448,77450,77451,20790,77454],{"id":77449},"field-key-slug","Field: ",[36,77452,77453],{},"key",[36,77455,17412],{},[2354,77457,77458],{},[2357,77459,77460,77461,77463],{},"the reason was the ",[36,77462,77453],{}," was a confusing name and could denote something else that it wasn't",[22,77465,77466],{},[31,77467,77468],{},"Affected Models:",[2354,77470,77471,77480,77489,77498,77507,77516],{},[2357,77472,77473,77476,77477],{},[36,77474,77475],{},"IKmsPageMetadata"," (KMS) - ",[36,77478,77479],{},"src\u002Fmodels\u002FUnifiedKms.ts",[2357,77481,77482,77485,77486],{},[36,77483,77484],{},"ITaskMetadata"," (Task) - ",[36,77487,77488],{},"src\u002Fmodels\u002FUnifiedTask.ts",[2357,77490,77491,77494,77495],{},[36,77492,77493],{},"IHrisMetadata"," (HRIS) - ",[36,77496,77497],{},"src\u002Fmodels\u002FUnifiedHris.ts",[2357,77499,77500,77503,77504],{},[36,77501,77502],{},"IAtsMetadata"," (ATS) - ",[36,77505,77506],{},"src\u002Fmodels\u002FUnifiedAts.ts",[2357,77508,77509,77512,77513],{},[36,77510,77511],{},"ICommerceMetadata"," (Commerce) - ",[36,77514,77515],{},"src\u002Fmodels\u002FUnifiedCommerce.ts",[2357,77517,77518,77521,77522],{},[36,77519,77520],{},"ICrmMetadata"," (CRM) - ",[36,77523,77524],{},"src\u002Fmodels\u002FUnifiedCrm.ts",[22,77526,77527],{},[31,77528,77529],{},"Deprecated Field:",[2584,77531,77533],{"className":2689,"code":77532,"language":2691,"meta":2433,"style":2433},"key?: string; \u002F\u002F @deprecated; use slug instead\n",[36,77534,77535],{"__ignoreMap":2433},[414,77536,77537,77539,77541,77544],{"class":2593,"line":2594},[414,77538,77453],{"class":2705},[414,77540,16892],{"class":2698},[414,77542,77543],{"class":2705}," string; ",[414,77545,77546],{"class":3527},"\u002F\u002F @deprecated; use slug instead\n",[22,77548,77549],{},[31,77550,77551],{},"Replacement:",[2584,77553,77555],{"className":2689,"code":77554,"language":2691,"meta":2433,"style":2433},"slug?: string; \u002F\u002F Actual textual value of the slug\n",[36,77556,77557],{"__ignoreMap":2433},[414,77558,77559,77561,77563,77565],{"class":2593,"line":2594},[414,77560,17412],{"class":2705},[414,77562,16892],{"class":2698},[414,77564,77543],{"class":2705},[414,77566,77567],{"class":3527},"\u002F\u002F Actual textual value of the slug\n",[22,77569,77570],{},[31,77571,77572],{},"Migration Recommendation:",[2354,77574,77575,77587],{},[2357,77576,77577,77580,77581,27087,77584],{},[31,77578,77579],{},"Read Operations:"," Replace all references to ",[36,77582,77583],{},"metadata.key",[36,77585,77586],{},"metadata.slug",[2357,77588,77589,77592,77593,75043,77595,77597],{},[31,77590,77591],{},"Write Operations:"," Use ",[36,77594,17412],{},[36,77596,77453],{}," when creating or updating metadata objects",[22,77599,77600],{},[31,77601,17183],{},[2584,77603,77605],{"className":2689,"code":77604,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nmetadata: [{\n    key: 'custom_field',\n    value: 'some value'\n}]\n\n\u002F\u002F After\nmetadata: [{\n    slug: 'custom_field',\n    value: 'some value'\n}]\n",[36,77606,77607,77612,77619,77629,77637,77641,77645,77650,77656,77665,77671],{"__ignoreMap":2433},[414,77608,77609],{"class":2593,"line":2594},[414,77610,77611],{"class":3527},"\u002F\u002F Before\n",[414,77613,77614,77616],{"class":2593,"line":2434},[414,77615,11221],{"class":2597},[414,77617,77618],{"class":2705},": [{\n",[414,77620,77621,77624,77627],{"class":2593,"line":2613},[414,77622,77623],{"class":2705},"    key: ",[414,77625,77626],{"class":2601},"'custom_field'",[414,77628,2757],{"class":2705},[414,77630,77631,77634],{"class":2593,"line":2625},[414,77632,77633],{"class":2705},"    value: ",[414,77635,77636],{"class":2601},"'some value'\n",[414,77638,77639],{"class":2593,"line":2677},[414,77640,38084],{"class":2705},[414,77642,77643],{"class":2593,"line":2751},[414,77644,2740],{"emptyLinePlaceholder":2459},[414,77646,77647],{"class":2593,"line":2760},[414,77648,77649],{"class":3527},"\u002F\u002F After\n",[414,77651,77652,77654],{"class":2593,"line":2768},[414,77653,11221],{"class":2597},[414,77655,77618],{"class":2705},[414,77657,77658,77661,77663],{"class":2593,"line":2776},[414,77659,77660],{"class":2705},"    slug: ",[414,77662,77626],{"class":2601},[414,77664,2757],{"class":2705},[414,77666,77667,77669],{"class":2593,"line":2784},[414,77668,77633],{"class":2705},[414,77670,77636],{"class":2601},[414,77672,77673],{"class":2593,"line":2792},[414,77674,38084],{"class":2705},[19,77676],{},[3629,77678,77450,77680,20790,77682],{"id":77679},"field-type-format",[36,77681,3397],{},[36,77683,17098],{},[2354,77685,77686],{},[2357,77687,77460,77688,77463],{},[36,77689,3397],{},[22,77691,77692],{},[31,77693,77468],{},[2354,77695,77696,77702,77708,77714,77720,77726],{},[2357,77697,77698,77476,77700],{},[36,77699,77475],{},[36,77701,77479],{},[2357,77703,77704,77485,77706],{},[36,77705,77484],{},[36,77707,77488],{},[2357,77709,77710,77494,77712],{},[36,77711,77493],{},[36,77713,77497],{},[2357,77715,77716,77503,77718],{},[36,77717,77502],{},[36,77719,77506],{},[2357,77721,77722,77512,77724],{},[36,77723,77511],{},[36,77725,77515],{},[2357,77727,77728,77521,77730],{},[36,77729,77520],{},[36,77731,77524],{},[22,77733,77734],{},[31,77735,77529],{},[2584,77737,77739],{"className":2689,"code":77738,"language":2691,"meta":2433,"style":2433},"type?: string; \u002F\u002F @deprecated; use format instead\n",[36,77740,77741],{"__ignoreMap":2433},[414,77742,77743,77745,77747,77749],{"class":2593,"line":2594},[414,77744,3397],{"class":2705},[414,77746,16892],{"class":2698},[414,77748,77543],{"class":2705},[414,77750,77751],{"class":3527},"\u002F\u002F @deprecated; use format instead\n",[22,77753,77754],{},[31,77755,77551],{},[2584,77757,77759],{"className":2689,"code":77758,"language":2691,"meta":2433,"style":2433},"format?: TMetadataFormat; \u002F\u002F Enum: TEXT, NUMBER, DATE, BOOLEAN, FILE, TEXTAREA, SINGLE_SELECT, MULTIPLE_SELECT, MEASUREMENT, PRICE, YES_NO, CURRENCY, URL, etc.\n",[36,77760,77761],{"__ignoreMap":2433},[414,77762,77763,77765,77767,77770],{"class":2593,"line":2594},[414,77764,17098],{"class":2705},[414,77766,16892],{"class":2698},[414,77768,77769],{"class":2705}," TMetadataFormat; ",[414,77771,77772],{"class":3527},"\u002F\u002F Enum: TEXT, NUMBER, DATE, BOOLEAN, FILE, TEXTAREA, SINGLE_SELECT, MULTIPLE_SELECT, MEASUREMENT, PRICE, YES_NO, CURRENCY, URL, etc.\n",[22,77774,77775],{},[31,77776,77572],{},[2354,77778,77779,77789,77798],{},[2357,77780,77781,77580,77783,27087,77786],{},[31,77782,77579],{},[36,77784,77785],{},"metadata.type",[36,77787,77788],{},"metadata.format",[2357,77790,77791,77592,77793,77795,77796,2977],{},[31,77792,77591],{},[36,77794,17098],{}," with the appropriate enum value instead of ",[36,77797,3397],{},[2357,77799,77800,55040,77803,77805],{},[31,77801,77802],{},"Type Safety:",[36,77804,17098],{}," field uses strongly-typed enums, providing better type safety and validation",[22,77807,77808],{},[31,77809,17183],{},[2584,77811,77813],{"className":2689,"code":77812,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nmetadata: [{\n    key: 'age',\n    type: 'number',\n    value: 25\n}]\n\n\u002F\u002F After\nmetadata: [{\n    slug: 'age',\n    format: 'NUMBER', \u002F\u002F Use enum value\n    value: 25\n}]\n",[36,77814,77815,77819,77825,77834,77843,77850,77854,77858,77862,77868,77876,77888,77894],{"__ignoreMap":2433},[414,77816,77817],{"class":2593,"line":2594},[414,77818,77611],{"class":3527},[414,77820,77821,77823],{"class":2593,"line":2434},[414,77822,11221],{"class":2597},[414,77824,77618],{"class":2705},[414,77826,77827,77829,77832],{"class":2593,"line":2613},[414,77828,77623],{"class":2705},[414,77830,77831],{"class":2601},"'age'",[414,77833,2757],{"class":2705},[414,77835,77836,77838,77841],{"class":2593,"line":2625},[414,77837,29254],{"class":2705},[414,77839,77840],{"class":2601},"'number'",[414,77842,2757],{"class":2705},[414,77844,77845,77847],{"class":2593,"line":2677},[414,77846,77633],{"class":2705},[414,77848,77849],{"class":2607},"25\n",[414,77851,77852],{"class":2593,"line":2751},[414,77853,38084],{"class":2705},[414,77855,77856],{"class":2593,"line":2760},[414,77857,2740],{"emptyLinePlaceholder":2459},[414,77859,77860],{"class":2593,"line":2768},[414,77861,77649],{"class":3527},[414,77863,77864,77866],{"class":2593,"line":2776},[414,77865,11221],{"class":2597},[414,77867,77618],{"class":2705},[414,77869,77870,77872,77874],{"class":2593,"line":2784},[414,77871,77660],{"class":2705},[414,77873,77831],{"class":2601},[414,77875,2757],{"class":2705},[414,77877,77878,77881,77883,77885],{"class":2593,"line":2792},[414,77879,77880],{"class":2705},"    format: ",[414,77882,17115],{"class":2601},[414,77884,319],{"class":2705},[414,77886,77887],{"class":3527},"\u002F\u002F Use enum value\n",[414,77889,77890,77892],{"class":2593,"line":2804},[414,77891,77633],{"class":2705},[414,77893,77849],{"class":2607},[414,77895,77896],{"class":2593,"line":2809},[414,77897,38084],{"class":2705},[19,77899],{},[55,77901,77411],{"id":77902},"parent-fields",[3629,77904,77450,77906,20790,77909],{"id":77905},"field-parent_space_id-parent_id",[36,77907,77908],{},"parent_space_id",[36,77910,54970],{},[3629,77912,77450,77914,20790,77917],{"id":77913},"field-parent_page_id-parent_id",[36,77915,77916],{},"parent_page_id",[36,77918,54970],{},[2354,77920,77921],{},[2357,77922,77923,77924,77926],{},"the reason was that we standardized across all of our unified data models the field name of ",[36,77925,54970],{}," when it denoted a parent of the current object (and is the same object)",[22,77928,77929],{},[31,77930,77468],{},[2354,77932,77933,77941],{},[2357,77934,77935,77938,77939],{},[36,77936,77937],{},"IKmsSpace"," - ",[36,77940,77479],{},[2357,77942,77943,77938,77946],{},[36,77944,77945],{},"IKmsPage",[36,77947,77479],{},[22,77949,77950],{},[31,77951,77529],{},[2584,77953,77955],{"className":2689,"code":77954,"language":2691,"meta":2433,"style":2433},"\u002F\u002F In KmsSpace\nparent_space_id?: string; \u002F\u002F @deprecated; use parent_id instead\n\n\u002F\u002F In KmsPage\nparent_page_id?: string; \u002F\u002F @deprecated; use parent_id instead\n",[36,77956,77957,77962,77973,77977,77982],{"__ignoreMap":2433},[414,77958,77959],{"class":2593,"line":2594},[414,77960,77961],{"class":3527},"\u002F\u002F In KmsSpace\n",[414,77963,77964,77966,77968,77970],{"class":2593,"line":2434},[414,77965,77908],{"class":2705},[414,77967,16892],{"class":2698},[414,77969,77543],{"class":2705},[414,77971,77972],{"class":3527},"\u002F\u002F @deprecated; use parent_id instead\n",[414,77974,77975],{"class":2593,"line":2613},[414,77976,2740],{"emptyLinePlaceholder":2459},[414,77978,77979],{"class":2593,"line":2625},[414,77980,77981],{"class":3527},"\u002F\u002F In KmsPage\n",[414,77983,77984,77986,77988,77990],{"class":2593,"line":2677},[414,77985,77916],{"class":2705},[414,77987,16892],{"class":2698},[414,77989,77543],{"class":2705},[414,77991,77972],{"class":3527},[22,77993,77994],{},[31,77995,77551],{},[2584,77997,77999],{"className":2689,"code":77998,"language":2691,"meta":2433,"style":2433},"parent_id?: string;\n",[36,78000,78001],{"__ignoreMap":2433},[414,78002,78003,78005,78007],{"class":2593,"line":2594},[414,78004,54970],{"class":2705},[414,78006,16892],{"class":2698},[414,78008,78009],{"class":2705}," string;\n",[22,78011,78012],{},[31,78013,77572],{},[2354,78015,78016,78025],{},[2357,78017,78018,77592,78020,75043,78022,78024],{},[31,78019,77579],{},[36,78021,54970],{},[36,78023,77908],{}," when reading space objects",[2357,78026,78027,77592,78029,78031],{},[31,78028,77591],{},[36,78030,54970],{}," when creating or updating spaces",[22,78033,78034],{},[31,78035,17183],{},[2584,78037,78039],{"className":2689,"code":78038,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nconst space = {\n    name: 'Subspace',\n    parent_space_id: 'space_123'\n}\n\n\u002F\u002F After\nconst space = {\n    name: 'Subspace',\n    parent_id: 'space_123'\n}\n",[36,78040,78041,78045,78055,78064,78072,78076,78080,78084,78094,78102,78109],{"__ignoreMap":2433},[414,78042,78043],{"class":2593,"line":2594},[414,78044,77611],{"class":3527},[414,78046,78047,78049,78051,78053],{"class":2593,"line":2434},[414,78048,2745],{"class":2698},[414,78050,28353],{"class":2607},[414,78052,2817],{"class":2698},[414,78054,2748],{"class":2705},[414,78056,78057,78059,78062],{"class":2593,"line":2613},[414,78058,28908],{"class":2705},[414,78060,78061],{"class":2601},"'Subspace'",[414,78063,2757],{"class":2705},[414,78065,78066,78069],{"class":2593,"line":2625},[414,78067,78068],{"class":2705},"    parent_space_id: ",[414,78070,78071],{"class":2601},"'space_123'\n",[414,78073,78074],{"class":2593,"line":2677},[414,78075,3035],{"class":2705},[414,78077,78078],{"class":2593,"line":2751},[414,78079,2740],{"emptyLinePlaceholder":2459},[414,78081,78082],{"class":2593,"line":2760},[414,78083,77649],{"class":3527},[414,78085,78086,78088,78090,78092],{"class":2593,"line":2768},[414,78087,2745],{"class":2698},[414,78089,28353],{"class":2607},[414,78091,2817],{"class":2698},[414,78093,2748],{"class":2705},[414,78095,78096,78098,78100],{"class":2593,"line":2776},[414,78097,28908],{"class":2705},[414,78099,78061],{"class":2601},[414,78101,2757],{"class":2705},[414,78103,78104,78107],{"class":2593,"line":2784},[414,78105,78106],{"class":2705},"    parent_id: ",[414,78108,78071],{"class":2601},[414,78110,78111],{"class":2593,"line":2792},[414,78112,3035],{"class":2705},[19,78114],{},[3629,78116,77450,78118,20790,78121],{"id":78117},"field-parent_channel_id-parent_id",[36,78119,78120],{},"parent_channel_id",[36,78122,54970],{},[22,78124,78125],{},[31,78126,78127],{},"Affected Model:",[2354,78129,78130],{},[2357,78131,78132,77938,78135],{},[36,78133,78134],{},"IMessagingChannel",[36,78136,78137],{},"src\u002Fmodels\u002FUnifiedMessaging.ts",[22,78139,78140],{},[31,78141,77529],{},[2584,78143,78145],{"className":2689,"code":78144,"language":2691,"meta":2433,"style":2433},"parent_channel_id?: string; \u002F\u002F @deprecated; use parent_id instead\n",[36,78146,78147],{"__ignoreMap":2433},[414,78148,78149,78151,78153,78155],{"class":2593,"line":2594},[414,78150,78120],{"class":2705},[414,78152,16892],{"class":2698},[414,78154,77543],{"class":2705},[414,78156,77972],{"class":3527},[22,78158,78159],{},[31,78160,77551],{},[2584,78162,78163],{"className":2689,"code":77998,"language":2691,"meta":2433,"style":2433},[36,78164,78165],{"__ignoreMap":2433},[414,78166,78167,78169,78171],{"class":2593,"line":2594},[414,78168,54970],{"class":2705},[414,78170,16892],{"class":2698},[414,78172,78009],{"class":2705},[22,78174,78175],{},[31,78176,77572],{},[2354,78178,78179,78188],{},[2357,78180,78181,77592,78183,75043,78185,78187],{},[31,78182,77579],{},[36,78184,54970],{},[36,78186,78120],{}," when reading channel objects",[2357,78189,78190,77592,78192,78194],{},[31,78191,77591],{},[36,78193,54970],{}," when creating or updating channels",[22,78196,78197],{},[31,78198,17183],{},[2584,78200,78202],{"className":2689,"code":78201,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nconst channel = {\n    name: 'Sub-channel',\n    parent_channel_id: 'channel_123'\n}\n\n\u002F\u002F After\nconst channel = {\n    name: 'Sub-channel',\n    parent_id: 'channel_123'\n}\n",[36,78203,78204,78208,78219,78228,78236,78240,78244,78248,78258,78266,78272],{"__ignoreMap":2433},[414,78205,78206],{"class":2593,"line":2594},[414,78207,77611],{"class":3527},[414,78209,78210,78212,78215,78217],{"class":2593,"line":2434},[414,78211,2745],{"class":2698},[414,78213,78214],{"class":2607}," channel",[414,78216,2817],{"class":2698},[414,78218,2748],{"class":2705},[414,78220,78221,78223,78226],{"class":2593,"line":2613},[414,78222,28908],{"class":2705},[414,78224,78225],{"class":2601},"'Sub-channel'",[414,78227,2757],{"class":2705},[414,78229,78230,78233],{"class":2593,"line":2625},[414,78231,78232],{"class":2705},"    parent_channel_id: ",[414,78234,78235],{"class":2601},"'channel_123'\n",[414,78237,78238],{"class":2593,"line":2677},[414,78239,3035],{"class":2705},[414,78241,78242],{"class":2593,"line":2751},[414,78243,2740],{"emptyLinePlaceholder":2459},[414,78245,78246],{"class":2593,"line":2760},[414,78247,77649],{"class":3527},[414,78249,78250,78252,78254,78256],{"class":2593,"line":2768},[414,78251,2745],{"class":2698},[414,78253,78214],{"class":2607},[414,78255,2817],{"class":2698},[414,78257,2748],{"class":2705},[414,78259,78260,78262,78264],{"class":2593,"line":2776},[414,78261,28908],{"class":2705},[414,78263,78225],{"class":2601},[414,78265,2757],{"class":2705},[414,78267,78268,78270],{"class":2593,"line":2784},[414,78269,78106],{"class":2705},[414,78271,78235],{"class":2601},[414,78273,78274],{"class":2593,"line":2792},[414,78275,3035],{"class":2705},[19,78277],{},[3629,78279,77450,78281,20790,78284],{"id":78280},"field-parent_account_id-parent_id",[36,78282,78283],{},"parent_account_id",[36,78285,54970],{},[22,78287,78288],{},[31,78289,78127],{},[2354,78291,78292],{},[2357,78293,78294],{},[36,78295,78296],{},"IAccountingAccount",[22,78298,78299],{},[31,78300,77529],{},[2584,78302,78304],{"className":2689,"code":78303,"language":2691,"meta":2433,"style":2433},"parent_account_id?: string; \u002F\u002F @deprecated; use parent_id instead\n",[36,78305,78306],{"__ignoreMap":2433},[414,78307,78308,78310,78312,78314],{"class":2593,"line":2594},[414,78309,78283],{"class":2705},[414,78311,16892],{"class":2698},[414,78313,77543],{"class":2705},[414,78315,77972],{"class":3527},[22,78317,78318],{},[31,78319,77551],{},[2584,78321,78323],{"className":2689,"code":78322,"language":2691,"meta":2433,"style":2433},"parent_id?: string; \u002F\u002F The parent account ID for this account\n",[36,78324,78325],{"__ignoreMap":2433},[414,78326,78327,78329,78331,78333],{"class":2593,"line":2594},[414,78328,54970],{"class":2705},[414,78330,16892],{"class":2698},[414,78332,77543],{"class":2705},[414,78334,78335],{"class":3527},"\u002F\u002F The parent account ID for this account\n",[22,78337,78338],{},[31,78339,77572],{},[2354,78341,78342,78351],{},[2357,78343,78344,77592,78346,75043,78348,78350],{},[31,78345,77579],{},[36,78347,54970],{},[36,78349,78283],{}," when reading account objects",[2357,78352,78353,77592,78355,78357],{},[31,78354,77591],{},[36,78356,54970],{}," when creating or updating accounts",[22,78359,78360],{},[31,78361,17183],{},[2584,78363,78365],{"className":2689,"code":78364,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nconst account = {\n    name: 'Sub-account',\n    parent_account_id: 'account_123'\n}\n\n\u002F\u002F After\nconst account = {\n    name: 'Sub-account',\n    parent_id: 'account_123'\n}\n",[36,78366,78367,78371,78381,78390,78398,78402,78406,78410,78420,78428,78434],{"__ignoreMap":2433},[414,78368,78369],{"class":2593,"line":2594},[414,78370,77611],{"class":3527},[414,78372,78373,78375,78377,78379],{"class":2593,"line":2434},[414,78374,2745],{"class":2698},[414,78376,27896],{"class":2607},[414,78378,2817],{"class":2698},[414,78380,2748],{"class":2705},[414,78382,78383,78385,78388],{"class":2593,"line":2613},[414,78384,28908],{"class":2705},[414,78386,78387],{"class":2601},"'Sub-account'",[414,78389,2757],{"class":2705},[414,78391,78392,78395],{"class":2593,"line":2625},[414,78393,78394],{"class":2705},"    parent_account_id: ",[414,78396,78397],{"class":2601},"'account_123'\n",[414,78399,78400],{"class":2593,"line":2677},[414,78401,3035],{"class":2705},[414,78403,78404],{"class":2593,"line":2751},[414,78405,2740],{"emptyLinePlaceholder":2459},[414,78407,78408],{"class":2593,"line":2760},[414,78409,77649],{"class":3527},[414,78411,78412,78414,78416,78418],{"class":2593,"line":2768},[414,78413,2745],{"class":2698},[414,78415,27896],{"class":2607},[414,78417,2817],{"class":2698},[414,78419,2748],{"class":2705},[414,78421,78422,78424,78426],{"class":2593,"line":2776},[414,78423,28908],{"class":2705},[414,78425,78387],{"class":2601},[414,78427,2757],{"class":2705},[414,78429,78430,78432],{"class":2593,"line":2784},[414,78431,78106],{"class":2705},[414,78433,78397],{"class":2601},[414,78435,78436],{"class":2593,"line":2792},[414,78437,3035],{"class":2705},[19,78439],{},[3629,78441,77450,78443,20790,78446],{"id":78442},"field-parent_message_id-parent_id",[36,78444,78445],{},"parent_message_id",[36,78447,54970],{},[22,78449,78450],{},[31,78451,78127],{},[2354,78453,78454],{},[2357,78455,78456],{},[36,78457,78458],{},"IMessagingMessage",[22,78460,78461],{},[31,78462,77529],{},[2584,78464,78466],{"className":2689,"code":78465,"language":2691,"meta":2433,"style":2433},"parent_message_id?: string; \u002F\u002F @deprecated; use parent_id\n",[36,78467,78468],{"__ignoreMap":2433},[414,78469,78470,78472,78474,78476],{"class":2593,"line":2594},[414,78471,78445],{"class":2705},[414,78473,16892],{"class":2698},[414,78475,77543],{"class":2705},[414,78477,78478],{"class":3527},"\u002F\u002F @deprecated; use parent_id\n",[22,78480,78481],{},[31,78482,77551],{},[2584,78484,78486],{"className":2689,"code":78485,"language":2691,"meta":2433,"style":2433},"parent_id?: string; \u002F\u002F Represents the ID of the immediate predecessor message in the thread\n",[36,78487,78488],{"__ignoreMap":2433},[414,78489,78490,78492,78494,78496],{"class":2593,"line":2594},[414,78491,54970],{"class":2705},[414,78493,16892],{"class":2698},[414,78495,77543],{"class":2705},[414,78497,78498],{"class":3527},"\u002F\u002F Represents the ID of the immediate predecessor message in the thread\n",[22,78500,78501],{},[31,78502,77572],{},[2354,78504,78505,78514],{},[2357,78506,78507,77592,78509,75043,78511,78513],{},[31,78508,77579],{},[36,78510,54970],{},[36,78512,78445],{}," when reading message objects",[2357,78515,78516,77592,78518,78520],{},[31,78517,77591],{},[36,78519,54970],{}," when creating threaded messages",[22,78522,78523],{},[31,78524,17183],{},[2584,78526,78528],{"className":2689,"code":78527,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nconst message = {\n    message: 'Reply text',\n    parent_message_id: 'msg_123'\n}\n\n\u002F\u002F After\nconst message = {\n    message: 'Reply text',\n    parent_id: 'msg_123'\n}\n",[36,78529,78530,78534,78544,78554,78562,78566,78570,78574,78584,78592,78598],{"__ignoreMap":2433},[414,78531,78532],{"class":2593,"line":2594},[414,78533,77611],{"class":3527},[414,78535,78536,78538,78540,78542],{"class":2593,"line":2434},[414,78537,2745],{"class":2698},[414,78539,29663],{"class":2607},[414,78541,2817],{"class":2698},[414,78543,2748],{"class":2705},[414,78545,78546,78549,78552],{"class":2593,"line":2613},[414,78547,78548],{"class":2705},"    message: ",[414,78550,78551],{"class":2601},"'Reply text'",[414,78553,2757],{"class":2705},[414,78555,78556,78559],{"class":2593,"line":2625},[414,78557,78558],{"class":2705},"    parent_message_id: ",[414,78560,78561],{"class":2601},"'msg_123'\n",[414,78563,78564],{"class":2593,"line":2677},[414,78565,3035],{"class":2705},[414,78567,78568],{"class":2593,"line":2751},[414,78569,2740],{"emptyLinePlaceholder":2459},[414,78571,78572],{"class":2593,"line":2760},[414,78573,77649],{"class":3527},[414,78575,78576,78578,78580,78582],{"class":2593,"line":2768},[414,78577,2745],{"class":2698},[414,78579,29663],{"class":2607},[414,78581,2817],{"class":2698},[414,78583,2748],{"class":2705},[414,78585,78586,78588,78590],{"class":2593,"line":2776},[414,78587,78548],{"class":2705},[414,78589,78551],{"class":2601},[414,78591,2757],{"class":2705},[414,78593,78594,78596],{"class":2593,"line":2784},[414,78595,78106],{"class":2705},[414,78597,78561],{"class":2601},[414,78599,78600],{"class":2593,"line":2792},[414,78601,3035],{"class":2705},[19,78603],{},[55,78605,77414],{"id":78606},"hris-employee-fields",[3629,78608,77450,78610,20790,78613],{"id":78609},"field-department-groups",[36,78611,78612],{},"department",[36,78614,78615],{},"groups",[2354,78617,78618],{},[2357,78619,78620],{},"we unified all HR 'grouping' objects into one called HRIS Group.  Groups have types that denote if they are a department, business unit, team, …",[22,78622,78623],{},[31,78624,78127],{},[2354,78626,78627],{},[2357,78628,78629,77938,78632],{},[36,78630,78631],{},"IHrisEmployee",[36,78633,77497],{},[22,78635,78636],{},[31,78637,77529],{},[2584,78639,78641],{"className":2689,"code":78640,"language":2691,"meta":2433,"style":2433},"department?: string; \u002F\u002F @deprecated\n",[36,78642,78643],{"__ignoreMap":2433},[414,78644,78645,78647,78649,78651],{"class":2593,"line":2594},[414,78646,78612],{"class":2705},[414,78648,16892],{"class":2698},[414,78650,77543],{"class":2705},[414,78652,78653],{"class":3527},"\u002F\u002F @deprecated\n",[22,78655,78656],{},[31,78657,77551],{},[2584,78659,78661],{"className":2689,"code":78660,"language":2691,"meta":2433,"style":2433},"groups?: IHrisGroup[]; \u002F\u002F Which groups\u002Fteams\u002Funits that this employee\u002Fuser belongs to\n",[36,78662,78663],{"__ignoreMap":2433},[414,78664,78665,78667,78669,78672],{"class":2593,"line":2594},[414,78666,78615],{"class":2705},[414,78668,16892],{"class":2698},[414,78670,78671],{"class":2705}," IHrisGroup[]; ",[414,78673,78674],{"class":3527},"\u002F\u002F Which groups\u002Fteams\u002Funits that this employee\u002Fuser belongs to\n",[22,78676,78677],{},[31,78678,77572],{},[2354,78680,78681,78689,78702],{},[2357,78682,78683,78685,78686,78688],{},[31,78684,77579],{}," Access department information through the ",[36,78687,78615],{}," array",[2357,78690,78691,77592,78693,78695,78696,78699,78700,2977],{},[31,78692,77591],{},[36,78694,78615],{}," array with ",[36,78697,78698],{},"IHrisGroup"," objects instead of a single ",[36,78701,78612],{},[2357,78703,78704,55040,78707,78709],{},[31,78705,78706],{},"Multiple Groups:",[36,78708,78615],{}," field supports multiple group memberships, which is more flexible than a single department",[22,78711,78712],{},[31,78713,17183],{},[2584,78715,78717],{"className":2689,"code":78716,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nconst employee = {\n    name: 'John Doe',\n    department: 'Engineering'\n}\n\n\u002F\u002F After\nconst employee = {\n    name: 'John Doe',\n    groups: [{\n        id: 'group_123',\n        name: 'Engineering',\n        type: 'DEPARTMENT'\n    }]\n}\n",[36,78718,78719,78723,78733,78741,78749,78753,78757,78761,78771,78779,78784,78794,78804,78812,78817],{"__ignoreMap":2433},[414,78720,78721],{"class":2593,"line":2594},[414,78722,77611],{"class":3527},[414,78724,78725,78727,78729,78731],{"class":2593,"line":2434},[414,78726,2745],{"class":2698},[414,78728,73573],{"class":2607},[414,78730,2817],{"class":2698},[414,78732,2748],{"class":2705},[414,78734,78735,78737,78739],{"class":2593,"line":2613},[414,78736,28908],{"class":2705},[414,78738,69496],{"class":2601},[414,78740,2757],{"class":2705},[414,78742,78743,78746],{"class":2593,"line":2625},[414,78744,78745],{"class":2705},"    department: ",[414,78747,78748],{"class":2601},"'Engineering'\n",[414,78750,78751],{"class":2593,"line":2677},[414,78752,3035],{"class":2705},[414,78754,78755],{"class":2593,"line":2751},[414,78756,2740],{"emptyLinePlaceholder":2459},[414,78758,78759],{"class":2593,"line":2760},[414,78760,77649],{"class":3527},[414,78762,78763,78765,78767,78769],{"class":2593,"line":2768},[414,78764,2745],{"class":2698},[414,78766,73573],{"class":2607},[414,78768,2817],{"class":2698},[414,78770,2748],{"class":2705},[414,78772,78773,78775,78777],{"class":2593,"line":2776},[414,78774,28908],{"class":2705},[414,78776,69496],{"class":2601},[414,78778,2757],{"class":2705},[414,78780,78781],{"class":2593,"line":2784},[414,78782,78783],{"class":2705},"    groups: [{\n",[414,78785,78786,78789,78792],{"class":2593,"line":2792},[414,78787,78788],{"class":2705},"        id: ",[414,78790,78791],{"class":2601},"'group_123'",[414,78793,2757],{"class":2705},[414,78795,78796,78799,78802],{"class":2593,"line":2804},[414,78797,78798],{"class":2705},"        name: ",[414,78800,78801],{"class":2601},"'Engineering'",[414,78803,2757],{"class":2705},[414,78805,78806,78809],{"class":2593,"line":2809},[414,78807,78808],{"class":2705},"        type: ",[414,78810,78811],{"class":2601},"'DEPARTMENT'\n",[414,78813,78814],{"class":2593,"line":2829},[414,78815,78816],{"class":2705},"    }]\n",[414,78818,78819],{"class":2593,"line":2843},[414,78820,3035],{"class":2705},[19,78822],{},[3629,78824,78826,78827,20790,78830],{"id":78825},"fielddivision-groups","Field:",[36,78828,78829],{},"division",[36,78831,78615],{},[22,78833,78834],{},[31,78835,78127],{},[2354,78837,78838],{},[2357,78839,78840],{},[36,78841,78631],{},[22,78843,78844],{},[31,78845,77529],{},[2584,78847,78849],{"className":2689,"code":78848,"language":2691,"meta":2433,"style":2433},"division?: string; \u002F\u002F @deprecated\n",[36,78850,78851],{"__ignoreMap":2433},[414,78852,78853,78855,78857,78859],{"class":2593,"line":2594},[414,78854,78829],{"class":2705},[414,78856,16892],{"class":2698},[414,78858,77543],{"class":2705},[414,78860,78653],{"class":3527},[22,78862,78863],{},[31,78864,77551],{},[2584,78866,78867],{"className":2689,"code":78660,"language":2691,"meta":2433,"style":2433},[36,78868,78869],{"__ignoreMap":2433},[414,78870,78871,78873,78875,78877],{"class":2593,"line":2594},[414,78872,78615],{"class":2705},[414,78874,16892],{"class":2698},[414,78876,78671],{"class":2705},[414,78878,78674],{"class":3527},[22,78880,78881],{},[31,78882,77572],{},[2354,78884,78885,78892],{},[2357,78886,78887,78889,78890,78688],{},[31,78888,77579],{}," Access division information through the ",[36,78891,78615],{},[2357,78893,78894,77592,78896,78695,78898,78699,78900,2977],{},[31,78895,77591],{},[36,78897,78615],{},[36,78899,78698],{},[36,78901,78829],{},[22,78903,78904],{},[31,78905,17183],{},[2584,78907,78909],{"className":2689,"code":78908,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nconst employee = {\n    name: 'John Doe',\n    division: 'Product'\n}\n\n\u002F\u002F After\nconst employee = {\n    name: 'John Doe',\n    groups: [{\n        id: 'group_456',\n        name: 'Product',\n        type: 'DIVISION'\n    }]\n}\n",[36,78910,78911,78915,78925,78933,78941,78945,78949,78953,78963,78971,78975,78984,78993,79000,79004],{"__ignoreMap":2433},[414,78912,78913],{"class":2593,"line":2594},[414,78914,77611],{"class":3527},[414,78916,78917,78919,78921,78923],{"class":2593,"line":2434},[414,78918,2745],{"class":2698},[414,78920,73573],{"class":2607},[414,78922,2817],{"class":2698},[414,78924,2748],{"class":2705},[414,78926,78927,78929,78931],{"class":2593,"line":2613},[414,78928,28908],{"class":2705},[414,78930,69496],{"class":2601},[414,78932,2757],{"class":2705},[414,78934,78935,78938],{"class":2593,"line":2625},[414,78936,78937],{"class":2705},"    division: ",[414,78939,78940],{"class":2601},"'Product'\n",[414,78942,78943],{"class":2593,"line":2677},[414,78944,3035],{"class":2705},[414,78946,78947],{"class":2593,"line":2751},[414,78948,2740],{"emptyLinePlaceholder":2459},[414,78950,78951],{"class":2593,"line":2760},[414,78952,77649],{"class":3527},[414,78954,78955,78957,78959,78961],{"class":2593,"line":2768},[414,78956,2745],{"class":2698},[414,78958,73573],{"class":2607},[414,78960,2817],{"class":2698},[414,78962,2748],{"class":2705},[414,78964,78965,78967,78969],{"class":2593,"line":2776},[414,78966,28908],{"class":2705},[414,78968,69496],{"class":2601},[414,78970,2757],{"class":2705},[414,78972,78973],{"class":2593,"line":2784},[414,78974,78783],{"class":2705},[414,78976,78977,78979,78982],{"class":2593,"line":2792},[414,78978,78788],{"class":2705},[414,78980,78981],{"class":2601},"'group_456'",[414,78983,2757],{"class":2705},[414,78985,78986,78988,78991],{"class":2593,"line":2804},[414,78987,78798],{"class":2705},[414,78989,78990],{"class":2601},"'Product'",[414,78992,2757],{"class":2705},[414,78994,78995,78997],{"class":2593,"line":2809},[414,78996,78808],{"class":2705},[414,78998,78999],{"class":2601},"'DIVISION'\n",[414,79001,79002],{"class":2593,"line":2829},[414,79003,78816],{"class":2705},[414,79005,79006],{"class":2593,"line":2843},[414,79007,3035],{"class":2705},[19,79009],{},[3629,79011,77450,79013,20790,79016],{"id":79012},"field-location-locations",[36,79014,79015],{},"location",[36,79017,79018],{},"locations",[22,79020,79021],{},[31,79022,78127],{},[2354,79024,79025],{},[2357,79026,79027,77938,79029],{},[36,79028,78631],{},[36,79030,77497],{},[22,79032,79033],{},[31,79034,77529],{},[2584,79036,79038],{"className":2689,"code":79037,"language":2691,"meta":2433,"style":2433},"location?: string; \u002F\u002F @deprecated\n",[36,79039,79040],{"__ignoreMap":2433},[414,79041,79042,79044,79046,79048],{"class":2593,"line":2594},[414,79043,79015],{"class":2705},[414,79045,16892],{"class":2698},[414,79047,77543],{"class":2705},[414,79049,78653],{"class":3527},[22,79051,79052],{},[31,79053,77551],{},[2584,79055,79057],{"className":2689,"code":79056,"language":2691,"meta":2433,"style":2433},"locations?: IHrisLocation[]; \u002F\u002F Array of partial location objects\n",[36,79058,79059],{"__ignoreMap":2433},[414,79060,79061,79063,79065,79068],{"class":2593,"line":2594},[414,79062,79018],{"class":2705},[414,79064,16892],{"class":2698},[414,79066,79067],{"class":2705}," IHrisLocation[]; ",[414,79069,79070],{"class":3527},"\u002F\u002F Array of partial location objects\n",[22,79072,79073],{},[31,79074,77572],{},[2354,79076,79077,79084,79095],{},[2357,79078,79079,79081,79082,78688],{},[31,79080,77579],{}," Access location information through the ",[36,79083,79018],{},[2357,79085,79086,77592,79088,78695,79090,78699,79093,2977],{},[31,79087,77591],{},[36,79089,79018],{},[36,79091,79092],{},"IHrisLocation",[36,79094,79015],{},[2357,79096,79097,55040,79100,79102],{},[31,79098,79099],{},"Rich Data:",[36,79101,79018],{}," array provides full address details, timezone, currency, and other metadata",[22,79104,79105],{},[31,79106,17183],{},[2584,79108,79110],{"className":2689,"code":79109,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nconst employee = {\n    name: 'John Doe',\n    location: 'San Francisco Office'\n}\n\n\u002F\u002F 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\u002FLos_Angeles'\n    }]\n}\n",[36,79111,79112,79116,79126,79134,79142,79146,79150,79154,79164,79172,79177,79186,79195,79200,79210,79220,79230,79240,79248,79252,79260,79264],{"__ignoreMap":2433},[414,79113,79114],{"class":2593,"line":2594},[414,79115,77611],{"class":3527},[414,79117,79118,79120,79122,79124],{"class":2593,"line":2434},[414,79119,2745],{"class":2698},[414,79121,73573],{"class":2607},[414,79123,2817],{"class":2698},[414,79125,2748],{"class":2705},[414,79127,79128,79130,79132],{"class":2593,"line":2613},[414,79129,28908],{"class":2705},[414,79131,69496],{"class":2601},[414,79133,2757],{"class":2705},[414,79135,79136,79139],{"class":2593,"line":2625},[414,79137,79138],{"class":2705},"    location: ",[414,79140,79141],{"class":2601},"'San Francisco Office'\n",[414,79143,79144],{"class":2593,"line":2677},[414,79145,3035],{"class":2705},[414,79147,79148],{"class":2593,"line":2751},[414,79149,2740],{"emptyLinePlaceholder":2459},[414,79151,79152],{"class":2593,"line":2760},[414,79153,77649],{"class":3527},[414,79155,79156,79158,79160,79162],{"class":2593,"line":2768},[414,79157,2745],{"class":2698},[414,79159,73573],{"class":2607},[414,79161,2817],{"class":2698},[414,79163,2748],{"class":2705},[414,79165,79166,79168,79170],{"class":2593,"line":2776},[414,79167,28908],{"class":2705},[414,79169,69496],{"class":2601},[414,79171,2757],{"class":2705},[414,79173,79174],{"class":2593,"line":2784},[414,79175,79176],{"class":2705},"    locations: [{\n",[414,79178,79179,79181,79184],{"class":2593,"line":2792},[414,79180,78788],{"class":2705},[414,79182,79183],{"class":2601},"'loc_123'",[414,79185,2757],{"class":2705},[414,79187,79188,79190,79193],{"class":2593,"line":2804},[414,79189,78798],{"class":2705},[414,79191,79192],{"class":2601},"'San Francisco Office'",[414,79194,2757],{"class":2705},[414,79196,79197],{"class":2593,"line":2809},[414,79198,79199],{"class":2705},"        address: {\n",[414,79201,79202,79205,79208],{"class":2593,"line":2829},[414,79203,79204],{"class":2705},"            address1: ",[414,79206,79207],{"class":2601},"'123 Main St'",[414,79209,2757],{"class":2705},[414,79211,79212,79215,79218],{"class":2593,"line":2843},[414,79213,79214],{"class":2705},"            city: ",[414,79216,79217],{"class":2601},"'San Francisco'",[414,79219,2757],{"class":2705},[414,79221,79222,79225,79228],{"class":2593,"line":2849},[414,79223,79224],{"class":2705},"            region: ",[414,79226,79227],{"class":2601},"'CA'",[414,79229,2757],{"class":2705},[414,79231,79232,79235,79238],{"class":2593,"line":2854},[414,79233,79234],{"class":2705},"            postal_code: ",[414,79236,79237],{"class":2601},"'94102'",[414,79239,2757],{"class":2705},[414,79241,79242,79245],{"class":2593,"line":2880},[414,79243,79244],{"class":2705},"            country: ",[414,79246,79247],{"class":2601},"'United States'\n",[414,79249,79250],{"class":2593,"line":3253},[414,79251,3768],{"class":2705},[414,79253,79254,79257],{"class":2593,"line":3261},[414,79255,79256],{"class":2705},"        timezone: ",[414,79258,79259],{"class":2601},"'America\u002FLos_Angeles'\n",[414,79261,79262],{"class":2593,"line":3279},[414,79263,78816],{"class":2705},[414,79265,79266],{"class":2593,"line":3313},[414,79267,3035],{"class":2705},[19,79269],{},[55,79271,79273],{"id":79272},"messaging-fields","Messaging Fields",[3629,79275,77450,79277,20790,79279],{"id":79276},"field-channel_id-channels",[36,79278,63783],{},[36,79280,79281],{},"channels",[3629,79283,77450,79285,20790,79288],{"id":79284},"field-channel_ids-channels",[36,79286,79287],{},"channel_ids",[36,79289,79281],{},[2354,79291,79292],{},[2357,79293,79294,79295,79297,79298],{},"the reason was so we could include additional channel information, such as the channel ",[36,79296,9043],{}," , as well as its ",[36,79299,5072],{},[22,79301,79302],{},[31,79303,78127],{},[2354,79305,79306],{},[2357,79307,79308,77938,79310],{},[36,79309,78458],{},[36,79311,78137],{},[22,79313,79314],{},[31,79315,77529],{},[2584,79317,79319],{"className":2689,"code":79318,"language":2691,"meta":2433,"style":2433},"channel_id?: string; \u002F\u002F @deprecated\n",[36,79320,79321],{"__ignoreMap":2433},[414,79322,79323,79325,79327,79329],{"class":2593,"line":2594},[414,79324,63783],{"class":2705},[414,79326,16892],{"class":2698},[414,79328,77543],{"class":2705},[414,79330,78653],{"class":3527},[22,79332,79333],{},[31,79334,77551],{},[2584,79336,79338],{"className":2689,"code":79337,"language":2691,"meta":2433,"style":2433},"channels?: IMessagingChannelMessage[]; \u002F\u002F Represents the names of all channels to which the message is sent \u002F belongs to\n",[36,79339,79340],{"__ignoreMap":2433},[414,79341,79342,79344,79346,79349],{"class":2593,"line":2594},[414,79343,79281],{"class":2705},[414,79345,16892],{"class":2698},[414,79347,79348],{"class":2705}," IMessagingChannelMessage[]; ",[414,79350,79351],{"class":3527},"\u002F\u002F Represents the names of all channels to which the message is sent \u002F belongs to\n",[22,79353,79354],{},[31,79355,77572],{},[2354,79357,79358,79370,79377],{},[2357,79359,79360,77592,79362,79364,79365,4149,79367],{},[31,79361,77579],{},[36,79363,79281],{}," array instead of ",[36,79366,63783],{},[36,79368,79369],{},"channels_ids",[2357,79371,79372,77592,79374,79376],{},[31,79373,77591],{},[36,79375,79281],{}," array when creating messages",[2357,79378,79379,55040,79382,79384],{},[31,79380,79381],{},"Multi-Channel Support:",[36,79383,79281],{}," array supports messages posted to multiple channels (when the integration supports it)",[22,79386,79387],{},[31,79388,17183],{},[2584,79390,79392],{"className":2689,"code":79391,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nconst message = {\n    message: 'Hello',\n    channel_id: 'channel_123',\n    channels_ids: [\"channel_123\"]\n}\n\n\u002F\u002F After\nconst message = {\n    message: 'Hello',\n    channels: [{\n        id: 'channel_123',\n        name: 'General'\n    }]\n}\n",[36,79393,79394,79398,79408,79417,79427,79437,79441,79445,79449,79459,79467,79472,79480,79487,79491],{"__ignoreMap":2433},[414,79395,79396],{"class":2593,"line":2594},[414,79397,77611],{"class":3527},[414,79399,79400,79402,79404,79406],{"class":2593,"line":2434},[414,79401,2745],{"class":2698},[414,79403,29663],{"class":2607},[414,79405,2817],{"class":2698},[414,79407,2748],{"class":2705},[414,79409,79410,79412,79415],{"class":2593,"line":2613},[414,79411,78548],{"class":2705},[414,79413,79414],{"class":2601},"'Hello'",[414,79416,2757],{"class":2705},[414,79418,79419,79422,79425],{"class":2593,"line":2625},[414,79420,79421],{"class":2705},"    channel_id: ",[414,79423,79424],{"class":2601},"'channel_123'",[414,79426,2757],{"class":2705},[414,79428,79429,79432,79435],{"class":2593,"line":2677},[414,79430,79431],{"class":2705},"    channels_ids: [",[414,79433,79434],{"class":2601},"\"channel_123\"",[414,79436,9376],{"class":2705},[414,79438,79439],{"class":2593,"line":2751},[414,79440,3035],{"class":2705},[414,79442,79443],{"class":2593,"line":2760},[414,79444,2740],{"emptyLinePlaceholder":2459},[414,79446,79447],{"class":2593,"line":2768},[414,79448,77649],{"class":3527},[414,79450,79451,79453,79455,79457],{"class":2593,"line":2776},[414,79452,2745],{"class":2698},[414,79454,29663],{"class":2607},[414,79456,2817],{"class":2698},[414,79458,2748],{"class":2705},[414,79460,79461,79463,79465],{"class":2593,"line":2784},[414,79462,78548],{"class":2705},[414,79464,79414],{"class":2601},[414,79466,2757],{"class":2705},[414,79468,79469],{"class":2593,"line":2792},[414,79470,79471],{"class":2705},"    channels: [{\n",[414,79473,79474,79476,79478],{"class":2593,"line":2804},[414,79475,78788],{"class":2705},[414,79477,79424],{"class":2601},[414,79479,2757],{"class":2705},[414,79481,79482,79484],{"class":2593,"line":2809},[414,79483,78798],{"class":2705},[414,79485,79486],{"class":2601},"'General'\n",[414,79488,79489],{"class":2593,"line":2829},[414,79490,78816],{"class":2705},[414,79492,79493],{"class":2593,"line":2843},[414,79494,3035],{"class":2705},[19,79496],{},[3629,79498,77450,79500,79503],{"id":79499},"field-root_message_id-removed",[36,79501,79502],{},"root_message_id"," → Removed",[22,79505,79506],{},[31,79507,78127],{},[2354,79509,79510],{},[2357,79511,79512],{},[36,79513,78458],{},[22,79515,79516],{},[31,79517,77529],{},[2584,79519,79521],{"className":2689,"code":79520,"language":2691,"meta":2433,"style":2433},"root_message_id?: string; \u002F\u002F @deprecated\n",[36,79522,79523],{"__ignoreMap":2433},[414,79524,79525,79527,79529,79531],{"class":2593,"line":2594},[414,79526,79502],{"class":2705},[414,79528,16892],{"class":2698},[414,79530,77543],{"class":2705},[414,79532,78653],{"class":3527},[22,79534,79535],{},[31,79536,77551],{},[2354,79538,79539],{},[2357,79540,79541,79542,79544],{},"No direct replacement. Use ",[36,79543,54970],{}," to traverse the thread structure.",[22,79546,79547],{},[31,79548,77572],{},[2354,79550,79551,79561],{},[2357,79552,79553,79555,79556,79558,79559],{},[31,79554,77579],{}," If you need to find the root message, traverse the ",[36,79557,54970],{}," chain until you reach a message without a ",[36,79560,54970],{},[2357,79562,79563,79565,79566,79568],{},[31,79564,77591],{}," Remove references to ",[36,79567,79502],{}," when creating messages",[22,79570,79571],{},[31,79572,17183],{},[2584,79574,79576],{"className":2689,"code":79575,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nconst message = {\n    message: 'Reply',\n    parent_message_id: 'msg_123',\n    root_message_id: 'msg_1'\n}\n\n\u002F\u002F After\nconst message = {\n    message: 'Reply',\n    parent_id: 'msg_123'\n    \u002F\u002F root_message_id removed - traverse parent_id chain if needed\n}\n\n\u002F\u002F 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",[36,79577,79578,79582,79592,79601,79610,79618,79622,79626,79630,79640,79648,79654,79659,79663,79667,79672,79686,79693,79706,79710,79717],{"__ignoreMap":2433},[414,79579,79580],{"class":2593,"line":2594},[414,79581,77611],{"class":3527},[414,79583,79584,79586,79588,79590],{"class":2593,"line":2434},[414,79585,2745],{"class":2698},[414,79587,29663],{"class":2607},[414,79589,2817],{"class":2698},[414,79591,2748],{"class":2705},[414,79593,79594,79596,79599],{"class":2593,"line":2613},[414,79595,78548],{"class":2705},[414,79597,79598],{"class":2601},"'Reply'",[414,79600,2757],{"class":2705},[414,79602,79603,79605,79608],{"class":2593,"line":2625},[414,79604,78558],{"class":2705},[414,79606,79607],{"class":2601},"'msg_123'",[414,79609,2757],{"class":2705},[414,79611,79612,79615],{"class":2593,"line":2677},[414,79613,79614],{"class":2705},"    root_message_id: ",[414,79616,79617],{"class":2601},"'msg_1'\n",[414,79619,79620],{"class":2593,"line":2751},[414,79621,3035],{"class":2705},[414,79623,79624],{"class":2593,"line":2760},[414,79625,2740],{"emptyLinePlaceholder":2459},[414,79627,79628],{"class":2593,"line":2768},[414,79629,77649],{"class":3527},[414,79631,79632,79634,79636,79638],{"class":2593,"line":2776},[414,79633,2745],{"class":2698},[414,79635,29663],{"class":2607},[414,79637,2817],{"class":2698},[414,79639,2748],{"class":2705},[414,79641,79642,79644,79646],{"class":2593,"line":2784},[414,79643,78548],{"class":2705},[414,79645,79598],{"class":2601},[414,79647,2757],{"class":2705},[414,79649,79650,79652],{"class":2593,"line":2792},[414,79651,78106],{"class":2705},[414,79653,78561],{"class":2601},[414,79655,79656],{"class":2593,"line":2804},[414,79657,79658],{"class":3527},"    \u002F\u002F root_message_id removed - traverse parent_id chain if needed\n",[414,79660,79661],{"class":2593,"line":2809},[414,79662,3035],{"class":2705},[414,79664,79665],{"class":2593,"line":2829},[414,79666,2740],{"emptyLinePlaceholder":2459},[414,79668,79669],{"class":2593,"line":2843},[414,79670,79671],{"class":3527},"\u002F\u002F Helper function to find root message\n",[414,79673,79674,79676,79679,79681,79684],{"class":2593,"line":2849},[414,79675,16512],{"class":2698},[414,79677,79678],{"class":2597}," findRootMessage",[414,79680,2968],{"class":2705},[414,79682,79683],{"class":2971},"message",[414,79685,3826],{"class":2705},[414,79687,79688,79690],{"class":2593,"line":2854},[414,79689,24965],{"class":2698},[414,79691,79692],{"class":2705}," (message.parent_id) {\n",[414,79694,79695,79698,79700,79703],{"class":2593,"line":2880},[414,79696,79697],{"class":2705},"        message ",[414,79699,2798],{"class":2698},[414,79701,79702],{"class":2597}," getMessage",[414,79704,79705],{"class":2705},"(message.parent_id);\n",[414,79707,79708],{"class":2593,"line":3253},[414,79709,10535],{"class":2705},[414,79711,79712,79714],{"class":2593,"line":3261},[414,79713,25149],{"class":2698},[414,79715,79716],{"class":2705}," message;\n",[414,79718,79719],{"class":2593,"line":3279},[414,79720,3035],{"class":2705},[19,79722],{},[55,79724,77420],{"id":79725},"accounting-fields",[3629,79727,77450,79729,20790,79732],{"id":79728},"field-invoice_at-posted_at",[36,79730,79731],{},"invoice_at",[36,79733,79734],{},"posted_at",[22,79736,79737],{},[31,79738,78127],{},[2354,79740,79741],{},[2357,79742,79743],{},[36,79744,79745],{},"IAccountingInvoice",[22,79747,79748],{},[31,79749,77529],{},[2584,79751,79753],{"className":2689,"code":79752,"language":2691,"meta":2433,"style":2433},"invoice_at?: (string | Date | number); \u002F\u002F @deprecated; use posted_at\n",[36,79754,79755],{"__ignoreMap":2433},[414,79756,79757,79759,79761,79764,79767,79770,79772,79775],{"class":2593,"line":2594},[414,79758,79731],{"class":2705},[414,79760,16892],{"class":2698},[414,79762,79763],{"class":2705}," (string ",[414,79765,79766],{"class":2698},"|",[414,79768,79769],{"class":2705}," Date ",[414,79771,79766],{"class":2698},[414,79773,79774],{"class":2705}," number); ",[414,79776,79777],{"class":3527},"\u002F\u002F @deprecated; use posted_at\n",[22,79779,79780],{},[31,79781,77551],{},[2584,79783,79785],{"className":2689,"code":79784,"language":2691,"meta":2433,"style":2433},"posted_at?: (string | Date | number);\n",[36,79786,79787],{"__ignoreMap":2433},[414,79788,79789,79791,79793,79795,79797,79799,79801],{"class":2593,"line":2594},[414,79790,79734],{"class":2705},[414,79792,16892],{"class":2698},[414,79794,79763],{"class":2705},[414,79796,79766],{"class":2698},[414,79798,79769],{"class":2705},[414,79800,79766],{"class":2698},[414,79802,79803],{"class":2705}," number);\n",[22,79805,79806],{},[31,79807,77572],{},[2354,79809,79810,79819,79826],{},[2357,79811,79812,77592,79814,75043,79816,79818],{},[31,79813,77579],{},[36,79815,79734],{},[36,79817,79731],{}," when reading invoice objects",[2357,79820,79821,77592,79823,79825],{},[31,79822,77591],{},[36,79824,79734],{}," when creating or updating invoices",[2357,79827,79828,79831,79832,79834],{},[31,79829,79830],{},"Consistency:"," This change aligns with other accounting objects that use ",[36,79833,79734],{}," for transaction dates",[22,79836,79837],{},[31,79838,17183],{},[2584,79840,79842],{"className":2689,"code":79841,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nconst invoice = {\n    invoice_number: 'INV-001',\n    invoice_at: '2024-01-15'\n}\n\n\u002F\u002F After\nconst invoice = {\n    invoice_number: 'INV-001',\n    posted_at: '2024-01-15'\n}\n",[36,79843,79844,79848,79859,79869,79877,79881,79885,79889,79899,79907,79914],{"__ignoreMap":2433},[414,79845,79846],{"class":2593,"line":2594},[414,79847,77611],{"class":3527},[414,79849,79850,79852,79855,79857],{"class":2593,"line":2434},[414,79851,2745],{"class":2698},[414,79853,79854],{"class":2607}," invoice",[414,79856,2817],{"class":2698},[414,79858,2748],{"class":2705},[414,79860,79861,79864,79867],{"class":2593,"line":2613},[414,79862,79863],{"class":2705},"    invoice_number: ",[414,79865,79866],{"class":2601},"'INV-001'",[414,79868,2757],{"class":2705},[414,79870,79871,79874],{"class":2593,"line":2625},[414,79872,79873],{"class":2705},"    invoice_at: ",[414,79875,79876],{"class":2601},"'2024-01-15'\n",[414,79878,79879],{"class":2593,"line":2677},[414,79880,3035],{"class":2705},[414,79882,79883],{"class":2593,"line":2751},[414,79884,2740],{"emptyLinePlaceholder":2459},[414,79886,79887],{"class":2593,"line":2760},[414,79888,77649],{"class":3527},[414,79890,79891,79893,79895,79897],{"class":2593,"line":2768},[414,79892,2745],{"class":2698},[414,79894,79854],{"class":2607},[414,79896,2817],{"class":2698},[414,79898,2748],{"class":2705},[414,79900,79901,79903,79905],{"class":2593,"line":2776},[414,79902,79863],{"class":2705},[414,79904,79866],{"class":2601},[414,79906,2757],{"class":2705},[414,79908,79909,79912],{"class":2593,"line":2784},[414,79910,79911],{"class":2705},"    posted_at: ",[414,79913,79876],{"class":2601},[414,79915,79916],{"class":2593,"line":2792},[414,79917,3035],{"class":2705},[19,79919],{},[3629,79921,77450,79923,79503],{"id":79922},"field-type-removed",[36,79924,3397],{},[22,79926,79927],{},[31,79928,78127],{},[2354,79930,79931],{},[2357,79932,79933],{},[36,79934,79745],{},[22,79936,79937],{},[31,79938,77529],{},[2584,79940,79942],{"className":2689,"code":79941,"language":2691,"meta":2433,"style":2433},"type?: TAccountingInvoiceType; \u002F\u002F @deprecated\n",[36,79943,79944],{"__ignoreMap":2433},[414,79945,79946,79948,79950,79953],{"class":2593,"line":2594},[414,79947,3397],{"class":2705},[414,79949,16892],{"class":2698},[414,79951,79952],{"class":2705}," TAccountingInvoiceType; ",[414,79954,78653],{"class":3527},[22,79956,79957],{},[31,79958,77551],{},[2354,79960,79961],{},[2357,79962,79963],{},"No direct replacement. Bills are now found in the AccountingBill object, while invoices are solely in the AccountingInvoice object.",[22,79965,79966],{},[31,79967,77572],{},[2354,79969,79970,79978],{},[2357,79971,79972,79974,79975,26211],{},[31,79973,77579],{}," Remove dependencies on ",[36,79976,79977],{},"invoice.type",[2357,79979,79980,79983],{},[31,79981,79982],{},"Alternative:"," Bills are now found in the AccountingBill object, while invoices are solely in the AccountingInvoice object.",[19,79985],{},[3629,79987,77450,79989,20790,79992],{"id":79988},"field-contact_id-contacts",[36,79990,79991],{},"contact_id",[36,79993,59614],{},[22,79995,79996],{},[31,79997,78127],{},[2354,79999,80000],{},[2357,80001,80002,77938,80005],{},[36,80003,80004],{},"IAccountingTransaction",[36,80006,80007],{},"src\u002Fmodels\u002FUnifiedAccounting.ts",[22,80009,80010],{},[31,80011,77529],{},[2584,80013,80015],{"className":2689,"code":80014,"language":2691,"meta":2433,"style":2433},"contact_id?: string; \u002F\u002F @deprecated; use contacts\n",[36,80016,80017],{"__ignoreMap":2433},[414,80018,80019,80021,80023,80025],{"class":2593,"line":2594},[414,80020,79991],{"class":2705},[414,80022,16892],{"class":2698},[414,80024,77543],{"class":2705},[414,80026,80027],{"class":3527},"\u002F\u002F @deprecated; use contacts\n",[22,80029,80030],{},[31,80031,77551],{},[2584,80033,80035],{"className":2689,"code":80034,"language":2691,"meta":2433,"style":2433},"contacts?: IAccountingTransactionContact[];\n",[36,80036,80037],{"__ignoreMap":2433},[414,80038,80039,80041,80043],{"class":2593,"line":2594},[414,80040,59614],{"class":2705},[414,80042,16892],{"class":2698},[414,80044,80045],{"class":2705}," IAccountingTransactionContact[];\n",[22,80047,80048],{},[31,80049,77572],{},[2354,80051,80052,80060,80069,80077],{},[2357,80053,80054,77592,80056,79364,80058],{},[31,80055,77579],{},[36,80057,59614],{},[36,80059,79991],{},[2357,80061,80062,77592,80064,80066,80067,26211],{},[31,80063,77591],{},[36,80065,59614],{}," array when creating transactions, but just include an ",[36,80068,5072],{},[2357,80070,80071,55040,80074,80076],{},[31,80072,80073],{},"Multi-Contact Support:",[36,80075,59614],{}," array supports multiple contacts per transaction (when the integration supports multiple contacts)",[2357,80078,80079,80081],{},[31,80080,79099],{}," Provides contact names and emails, not just IDs",[22,80083,80084],{},[31,80085,17183],{},[2584,80087,80089],{"className":2689,"code":80088,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nconst transaction = {\n    total_amount: 1000,\n    contact_id: 'contact_123'\n}\n\n\u002F\u002F 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",[36,80090,80091,80095,80106,80115,80123,80127,80131,80135,80145,80153,80158,80167,80176,80181,80189,80194,80198],{"__ignoreMap":2433},[414,80092,80093],{"class":2593,"line":2594},[414,80094,77611],{"class":3527},[414,80096,80097,80099,80102,80104],{"class":2593,"line":2434},[414,80098,2745],{"class":2698},[414,80100,80101],{"class":2607}," transaction",[414,80103,2817],{"class":2698},[414,80105,2748],{"class":2705},[414,80107,80108,80111,80113],{"class":2593,"line":2613},[414,80109,80110],{"class":2705},"    total_amount: ",[414,80112,32092],{"class":2607},[414,80114,2757],{"class":2705},[414,80116,80117,80120],{"class":2593,"line":2625},[414,80118,80119],{"class":2705},"    contact_id: ",[414,80121,80122],{"class":2601},"'contact_123'\n",[414,80124,80125],{"class":2593,"line":2677},[414,80126,3035],{"class":2705},[414,80128,80129],{"class":2593,"line":2751},[414,80130,2740],{"emptyLinePlaceholder":2459},[414,80132,80133],{"class":2593,"line":2760},[414,80134,77649],{"class":3527},[414,80136,80137,80139,80141,80143],{"class":2593,"line":2768},[414,80138,2745],{"class":2698},[414,80140,80101],{"class":2607},[414,80142,2817],{"class":2698},[414,80144,2748],{"class":2705},[414,80146,80147,80149,80151],{"class":2593,"line":2776},[414,80148,80110],{"class":2705},[414,80150,32092],{"class":2607},[414,80152,2757],{"class":2705},[414,80154,80155],{"class":2593,"line":2784},[414,80156,80157],{"class":2705},"    contacts: [{\n",[414,80159,80160,80162,80165],{"class":2593,"line":2792},[414,80161,78788],{"class":2705},[414,80163,80164],{"class":2601},"'contact_123'",[414,80166,2757],{"class":2705},[414,80168,80169,80171,80174],{"class":2593,"line":2804},[414,80170,78798],{"class":2705},[414,80172,80173],{"class":2601},"'Acme Corp'",[414,80175,2757],{"class":2705},[414,80177,80178],{"class":2593,"line":2809},[414,80179,80180],{"class":2705},"        emails: [{\n",[414,80182,80183,80186],{"class":2593,"line":2829},[414,80184,80185],{"class":2705},"            email: ",[414,80187,80188],{"class":2601},"'billing@acme.com'\n",[414,80190,80191],{"class":2593,"line":2843},[414,80192,80193],{"class":2705},"        }]\n",[414,80195,80196],{"class":2593,"line":2849},[414,80197,78816],{"class":2705},[414,80199,80200],{"class":2593,"line":2854},[414,80201,3035],{"class":2705},[19,80203],{},[3629,80205,77450,80207,20790,80210],{"id":80206},"field-income-income_sections",[36,80208,80209],{},"income",[36,80211,80212],{},"income_sections",[22,80214,80215],{},[31,80216,78127],{},[2354,80218,80219],{},[2357,80220,80221,77938,80224],{},[36,80222,80223],{},"IAccountingProfitloss",[36,80225,80007],{},[22,80227,80228],{},[31,80229,77529],{},[2584,80231,80233],{"className":2689,"code":80232,"language":2691,"meta":2433,"style":2433},"income?: IAccountingProfitlossCategory[]; \u002F\u002F @deprecated – use income_sections instead\n",[36,80234,80235],{"__ignoreMap":2433},[414,80236,80237,80239,80241,80244],{"class":2593,"line":2594},[414,80238,80209],{"class":2705},[414,80240,16892],{"class":2698},[414,80242,80243],{"class":2705}," IAccountingProfitlossCategory[]; ",[414,80245,80246],{"class":3527},"\u002F\u002F @deprecated – use income_sections instead\n",[22,80248,80249],{},[31,80250,77551],{},[2584,80252,80254],{"className":2689,"code":80253,"language":2691,"meta":2433,"style":2433},"income_sections?: IAccountingProfitlossSection[];\n",[36,80255,80256],{"__ignoreMap":2433},[414,80257,80258,80260,80262],{"class":2593,"line":2594},[414,80259,80212],{"class":2705},[414,80261,16892],{"class":2698},[414,80263,80264],{"class":2705}," IAccountingProfitlossSection[];\n",[22,80266,80267],{},[31,80268,77572],{},[2354,80270,80271,80279,80286],{},[2357,80272,80273,77592,80275,75043,80277],{},[31,80274,77579],{},[36,80276,80212],{},[36,80278,80209],{},[2357,80280,80281,77592,80283,80285],{},[31,80282,77591],{},[36,80284,80212],{}," when creating profit\u002Floss reports",[2357,80287,80288,80291,80292,80294],{},[31,80289,80290],{},"Enhanced Structure:"," The new ",[36,80293,80212],{}," provides a more structured format with better categorization",[22,80296,80297],{},[31,80298,17183],{},[2584,80300,80302],{"className":2689,"code":80301,"language":2691,"meta":2433,"style":2433},"\u002F\u002F 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\u002F\u002F 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",[36,80303,80304,80308,80319,80329,80339,80344,80353,80361,80365,80369,80373,80377,80387,80395,80403,80408,80416,80421,80430,80437,80441,80445],{"__ignoreMap":2433},[414,80305,80306],{"class":2593,"line":2594},[414,80307,77611],{"class":3527},[414,80309,80310,80312,80315,80317],{"class":2593,"line":2434},[414,80311,2745],{"class":2698},[414,80313,80314],{"class":2607}," profitloss",[414,80316,2817],{"class":2698},[414,80318,2748],{"class":2705},[414,80320,80321,80324,80327],{"class":2593,"line":2613},[414,80322,80323],{"class":2705},"    start_at: ",[414,80325,80326],{"class":2601},"'2024-01-01'",[414,80328,2757],{"class":2705},[414,80330,80331,80334,80337],{"class":2593,"line":2625},[414,80332,80333],{"class":2705},"    end_at: ",[414,80335,80336],{"class":2601},"'2024-12-31'",[414,80338,2757],{"class":2705},[414,80340,80341],{"class":2593,"line":2677},[414,80342,80343],{"class":2705},"    income: [{\n",[414,80345,80346,80348,80351],{"class":2593,"line":2751},[414,80347,78798],{"class":2705},[414,80349,80350],{"class":2601},"'Sales'",[414,80352,2757],{"class":2705},[414,80354,80355,80358],{"class":2593,"line":2760},[414,80356,80357],{"class":2705},"        amount: ",[414,80359,80360],{"class":2607},"100000\n",[414,80362,80363],{"class":2593,"line":2768},[414,80364,78816],{"class":2705},[414,80366,80367],{"class":2593,"line":2776},[414,80368,3035],{"class":2705},[414,80370,80371],{"class":2593,"line":2784},[414,80372,2740],{"emptyLinePlaceholder":2459},[414,80374,80375],{"class":2593,"line":2792},[414,80376,77649],{"class":3527},[414,80378,80379,80381,80383,80385],{"class":2593,"line":2804},[414,80380,2745],{"class":2698},[414,80382,80314],{"class":2607},[414,80384,2817],{"class":2698},[414,80386,2748],{"class":2705},[414,80388,80389,80391,80393],{"class":2593,"line":2809},[414,80390,80323],{"class":2705},[414,80392,80326],{"class":2601},[414,80394,2757],{"class":2705},[414,80396,80397,80399,80401],{"class":2593,"line":2829},[414,80398,80333],{"class":2705},[414,80400,80336],{"class":2601},[414,80402,2757],{"class":2705},[414,80404,80405],{"class":2593,"line":2843},[414,80406,80407],{"class":2705},"    income_sections: [{\n",[414,80409,80410,80412,80414],{"class":2593,"line":2849},[414,80411,78798],{"class":2705},[414,80413,80350],{"class":2601},[414,80415,2757],{"class":2705},[414,80417,80418],{"class":2593,"line":2854},[414,80419,80420],{"class":2705},"        accounts: [{\n",[414,80422,80423,80425,80428],{"class":2593,"line":2880},[414,80424,39028],{"class":2705},[414,80426,80427],{"class":2601},"'Product Sales'",[414,80429,2757],{"class":2705},[414,80431,80432,80435],{"class":2593,"line":3253},[414,80433,80434],{"class":2705},"            amount: ",[414,80436,80360],{"class":2607},[414,80438,80439],{"class":2593,"line":3261},[414,80440,80193],{"class":2705},[414,80442,80443],{"class":2593,"line":3279},[414,80444,78816],{"class":2705},[414,80446,80447],{"class":2593,"line":3313},[414,80448,3035],{"class":2705},[19,80450],{},[3629,80452,78826,80454,20790,80457],{"id":80453},"fieldexpenses-expenses_sections",[36,80455,80456],{},"expenses",[36,80458,80459],{},"expenses_sections",[22,80461,80462],{},[31,80463,78127],{},[2354,80465,80466],{},[2357,80467,80468],{},[36,80469,80223],{},[22,80471,80472],{},[31,80473,77529],{},[2584,80475,80477],{"className":2689,"code":80476,"language":2691,"meta":2433,"style":2433},"expenses?: IAccountingProfitlossCategory[]; \u002F\u002F @deprecated – use expenses_sections instead\n",[36,80478,80479],{"__ignoreMap":2433},[414,80480,80481,80483,80485,80487],{"class":2593,"line":2594},[414,80482,80456],{"class":2705},[414,80484,16892],{"class":2698},[414,80486,80243],{"class":2705},[414,80488,80489],{"class":3527},"\u002F\u002F @deprecated – use expenses_sections instead\n",[22,80491,80492],{},[31,80493,77551],{},[2584,80495,80497],{"className":2689,"code":80496,"language":2691,"meta":2433,"style":2433},"expenses_sections?: IAccountingProfitlossSection[];\n",[36,80498,80499],{"__ignoreMap":2433},[414,80500,80501,80503,80505],{"class":2593,"line":2594},[414,80502,80459],{"class":2705},[414,80504,16892],{"class":2698},[414,80506,80264],{"class":2705},[22,80508,80509],{},[31,80510,77572],{},[2354,80512,80513,80521],{},[2357,80514,80515,77592,80517,75043,80519],{},[31,80516,77579],{},[36,80518,80459],{},[36,80520,80456],{},[2357,80522,80523,77592,80525,80285],{},[31,80524,77591],{},[36,80526,80459],{},[22,80528,80529],{},[31,80530,17183],{},[2584,80532,80534],{"className":2689,"code":80533,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nconst profitloss = {\n    expenses: [{\n        name: 'Operating Expenses',\n        amount: 50000\n    }]\n}\n\n\u002F\u002F After\nconst profitloss = {\n    expenses_sections: [{\n        name: 'Operating Expenses',\n        accounts: [{\n            name: 'Salaries',\n            amount: 50000\n        }]\n    }]\n}\n",[36,80535,80536,80540,80550,80555,80564,80571,80575,80579,80583,80587,80597,80602,80610,80614,80623,80629,80633,80637],{"__ignoreMap":2433},[414,80537,80538],{"class":2593,"line":2594},[414,80539,77611],{"class":3527},[414,80541,80542,80544,80546,80548],{"class":2593,"line":2434},[414,80543,2745],{"class":2698},[414,80545,80314],{"class":2607},[414,80547,2817],{"class":2698},[414,80549,2748],{"class":2705},[414,80551,80552],{"class":2593,"line":2613},[414,80553,80554],{"class":2705},"    expenses: [{\n",[414,80556,80557,80559,80562],{"class":2593,"line":2625},[414,80558,78798],{"class":2705},[414,80560,80561],{"class":2601},"'Operating Expenses'",[414,80563,2757],{"class":2705},[414,80565,80566,80568],{"class":2593,"line":2677},[414,80567,80357],{"class":2705},[414,80569,80570],{"class":2607},"50000\n",[414,80572,80573],{"class":2593,"line":2751},[414,80574,78816],{"class":2705},[414,80576,80577],{"class":2593,"line":2760},[414,80578,3035],{"class":2705},[414,80580,80581],{"class":2593,"line":2768},[414,80582,2740],{"emptyLinePlaceholder":2459},[414,80584,80585],{"class":2593,"line":2776},[414,80586,77649],{"class":3527},[414,80588,80589,80591,80593,80595],{"class":2593,"line":2784},[414,80590,2745],{"class":2698},[414,80592,80314],{"class":2607},[414,80594,2817],{"class":2698},[414,80596,2748],{"class":2705},[414,80598,80599],{"class":2593,"line":2792},[414,80600,80601],{"class":2705},"    expenses_sections: [{\n",[414,80603,80604,80606,80608],{"class":2593,"line":2804},[414,80605,78798],{"class":2705},[414,80607,80561],{"class":2601},[414,80609,2757],{"class":2705},[414,80611,80612],{"class":2593,"line":2809},[414,80613,80420],{"class":2705},[414,80615,80616,80618,80621],{"class":2593,"line":2829},[414,80617,39028],{"class":2705},[414,80619,80620],{"class":2601},"'Salaries'",[414,80622,2757],{"class":2705},[414,80624,80625,80627],{"class":2593,"line":2843},[414,80626,80434],{"class":2705},[414,80628,80570],{"class":2607},[414,80630,80631],{"class":2593,"line":2849},[414,80632,80193],{"class":2705},[414,80634,80635],{"class":2593,"line":2854},[414,80636,78816],{"class":2705},[414,80638,80639],{"class":2593,"line":2880},[414,80640,3035],{"class":2705},[19,80642],{},[3629,80644,78826,80646,20790,80649],{"id":80645},"fieldcost_of_goods_sold-cost_of_goods_sold_sections",[36,80647,80648],{},"cost_of_goods_sold",[36,80650,80651],{},"cost_of_goods_sold_sections",[22,80653,80654],{},[31,80655,78127],{},[2354,80657,80658],{},[2357,80659,80660],{},[36,80661,80223],{},[22,80663,80664],{},[31,80665,77529],{},[2584,80667,80669],{"className":2689,"code":80668,"language":2691,"meta":2433,"style":2433},"cost_of_goods_sold?: IAccountingProfitlossCategory[]; \u002F\u002F @deprecated – use cost_of_goods_sold_sections instead\n",[36,80670,80671],{"__ignoreMap":2433},[414,80672,80673,80675,80677,80679],{"class":2593,"line":2594},[414,80674,80648],{"class":2705},[414,80676,16892],{"class":2698},[414,80678,80243],{"class":2705},[414,80680,80681],{"class":3527},"\u002F\u002F @deprecated – use cost_of_goods_sold_sections instead\n",[22,80683,80684],{},[31,80685,77551],{},[2584,80687,80689],{"className":2689,"code":80688,"language":2691,"meta":2433,"style":2433},"cost_of_goods_sold_sections?: IAccountingProfitlossSection[];\n",[36,80690,80691],{"__ignoreMap":2433},[414,80692,80693,80695,80697],{"class":2593,"line":2594},[414,80694,80651],{"class":2705},[414,80696,16892],{"class":2698},[414,80698,80264],{"class":2705},[22,80700,80701],{},[31,80702,77572],{},[2354,80704,80705,80713],{},[2357,80706,80707,77592,80709,75043,80711],{},[31,80708,77579],{},[36,80710,80651],{},[36,80712,80648],{},[2357,80714,80715,77592,80717,80285],{},[31,80716,77591],{},[36,80718,80651],{},[22,80720,80721],{},[31,80722,17183],{},[2584,80724,80726],{"className":2689,"code":80725,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nconst profitloss = {\n    cost_of_goods_sold: [{\n        name: 'Materials',\n        amount: 30000\n    }]\n}\n\n\u002F\u002F 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",[36,80727,80728,80732,80742,80747,80756,80763,80767,80771,80775,80779,80789,80794,80802,80806,80815,80821,80825,80829],{"__ignoreMap":2433},[414,80729,80730],{"class":2593,"line":2594},[414,80731,77611],{"class":3527},[414,80733,80734,80736,80738,80740],{"class":2593,"line":2434},[414,80735,2745],{"class":2698},[414,80737,80314],{"class":2607},[414,80739,2817],{"class":2698},[414,80741,2748],{"class":2705},[414,80743,80744],{"class":2593,"line":2613},[414,80745,80746],{"class":2705},"    cost_of_goods_sold: [{\n",[414,80748,80749,80751,80754],{"class":2593,"line":2625},[414,80750,78798],{"class":2705},[414,80752,80753],{"class":2601},"'Materials'",[414,80755,2757],{"class":2705},[414,80757,80758,80760],{"class":2593,"line":2677},[414,80759,80357],{"class":2705},[414,80761,80762],{"class":2607},"30000\n",[414,80764,80765],{"class":2593,"line":2751},[414,80766,78816],{"class":2705},[414,80768,80769],{"class":2593,"line":2760},[414,80770,3035],{"class":2705},[414,80772,80773],{"class":2593,"line":2768},[414,80774,2740],{"emptyLinePlaceholder":2459},[414,80776,80777],{"class":2593,"line":2776},[414,80778,77649],{"class":3527},[414,80780,80781,80783,80785,80787],{"class":2593,"line":2784},[414,80782,2745],{"class":2698},[414,80784,80314],{"class":2607},[414,80786,2817],{"class":2698},[414,80788,2748],{"class":2705},[414,80790,80791],{"class":2593,"line":2792},[414,80792,80793],{"class":2705},"    cost_of_goods_sold_sections: [{\n",[414,80795,80796,80798,80800],{"class":2593,"line":2804},[414,80797,78798],{"class":2705},[414,80799,80753],{"class":2601},[414,80801,2757],{"class":2705},[414,80803,80804],{"class":2593,"line":2809},[414,80805,80420],{"class":2705},[414,80807,80808,80810,80813],{"class":2593,"line":2829},[414,80809,39028],{"class":2705},[414,80811,80812],{"class":2601},"'Raw Materials'",[414,80814,2757],{"class":2705},[414,80816,80817,80819],{"class":2593,"line":2843},[414,80818,80434],{"class":2705},[414,80820,80762],{"class":2607},[414,80822,80823],{"class":2593,"line":2849},[414,80824,80193],{"class":2705},[414,80826,80827],{"class":2593,"line":2854},[414,80828,78816],{"class":2705},[414,80830,80831],{"class":2593,"line":2880},[414,80832,3035],{"class":2705},[19,80834],{},[3629,80836,78826,80838,80841,80842,741,80845],{"id":80837},"fieldgross_profit_amount-calculate-from-income_total_amount-and-cost_of_goods_sold_total_amount",[36,80839,80840],{},"gross_profit_amount"," → Calculate from ",[36,80843,80844],{},"income_total_amount",[36,80846,80847],{},"cost_of_goods_sold_total_amount",[22,80849,80850],{},[31,80851,78127],{},[2354,80853,80854],{},[2357,80855,80856],{},[36,80857,80223],{},[22,80859,80860],{},[31,80861,77529],{},[2584,80863,80865],{"className":2689,"code":80864,"language":2691,"meta":2433,"style":2433},"gross_profit_amount?: number; \u002F\u002F @deprecated – compute using income_total_amount - cost_of_goods_sold_total_amount\n",[36,80866,80867],{"__ignoreMap":2433},[414,80868,80869,80871,80873,80876],{"class":2593,"line":2594},[414,80870,80840],{"class":2705},[414,80872,16892],{"class":2698},[414,80874,80875],{"class":2705}," number; ",[414,80877,80878],{"class":3527},"\u002F\u002F @deprecated – compute using income_total_amount - cost_of_goods_sold_total_amount\n",[22,80880,80881],{},[31,80882,77551],{},[2584,80884,80886],{"className":2689,"code":80885,"language":2691,"meta":2433,"style":2433},"gross_profit_amount = income_total_amount - cost_of_goods_sold_total_amount\n",[36,80887,80888],{"__ignoreMap":2433},[414,80889,80890,80893,80895,80898,80900],{"class":2593,"line":2594},[414,80891,80892],{"class":2705},"gross_profit_amount ",[414,80894,2798],{"class":2698},[414,80896,80897],{"class":2705}," income_total_amount ",[414,80899,34146],{"class":2698},[414,80901,80902],{"class":2705}," cost_of_goods_sold_total_amount\n",[22,80904,80905],{},[31,80906,77572],{},[2354,80908,80909,80920],{},[2357,80910,80911,80913,80914,80916,80917],{},[31,80912,77579],{}," Calculate ",[36,80915,80840],{}," using ",[36,80918,80919],{},"income_total_amount - cost_of_goods_sold_total_amount",[2357,80921,80922,80924,80925,80927],{},[31,80923,77591],{}," Do not set ",[36,80926,80840],{}," directly",[22,80929,80930],{},[31,80931,17183],{},[2584,80933,80935],{"className":2689,"code":80934,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nconst profitloss = {\n    income_total_amount: 100000,\n    cost_of_goods_sold_total_amount: 30000,\n    gross_profit_amount: 70000\n}\n\n\u002F\u002F After\nconst profitloss = {\n    income_total_amount: 100000,\n    cost_of_goods_sold_total_amount: 30000\n    \u002F\u002F gross_profit_amount removed - calculate it\n}\n\n\u002F\u002F Calculate gross profit\nconst gross_profit_amount = profitloss.income_total_amount - profitloss.cost_of_goods_sold_total_amount;\n",[36,80936,80937,80941,80951,80961,80971,80979,80983,80987,80991,81001,81009,81015,81020,81024,81028,81033],{"__ignoreMap":2433},[414,80938,80939],{"class":2593,"line":2594},[414,80940,77611],{"class":3527},[414,80942,80943,80945,80947,80949],{"class":2593,"line":2434},[414,80944,2745],{"class":2698},[414,80946,80314],{"class":2607},[414,80948,2817],{"class":2698},[414,80950,2748],{"class":2705},[414,80952,80953,80956,80959],{"class":2593,"line":2613},[414,80954,80955],{"class":2705},"    income_total_amount: ",[414,80957,80958],{"class":2607},"100000",[414,80960,2757],{"class":2705},[414,80962,80963,80966,80969],{"class":2593,"line":2625},[414,80964,80965],{"class":2705},"    cost_of_goods_sold_total_amount: ",[414,80967,80968],{"class":2607},"30000",[414,80970,2757],{"class":2705},[414,80972,80973,80976],{"class":2593,"line":2677},[414,80974,80975],{"class":2705},"    gross_profit_amount: ",[414,80977,80978],{"class":2607},"70000\n",[414,80980,80981],{"class":2593,"line":2751},[414,80982,3035],{"class":2705},[414,80984,80985],{"class":2593,"line":2760},[414,80986,2740],{"emptyLinePlaceholder":2459},[414,80988,80989],{"class":2593,"line":2768},[414,80990,77649],{"class":3527},[414,80992,80993,80995,80997,80999],{"class":2593,"line":2776},[414,80994,2745],{"class":2698},[414,80996,80314],{"class":2607},[414,80998,2817],{"class":2698},[414,81000,2748],{"class":2705},[414,81002,81003,81005,81007],{"class":2593,"line":2784},[414,81004,80955],{"class":2705},[414,81006,80958],{"class":2607},[414,81008,2757],{"class":2705},[414,81010,81011,81013],{"class":2593,"line":2792},[414,81012,80965],{"class":2705},[414,81014,80762],{"class":2607},[414,81016,81017],{"class":2593,"line":2804},[414,81018,81019],{"class":3527},"    \u002F\u002F gross_profit_amount removed - calculate it\n",[414,81021,81022],{"class":2593,"line":2809},[414,81023,3035],{"class":2705},[414,81025,81026],{"class":2593,"line":2829},[414,81027,2740],{"emptyLinePlaceholder":2459},[414,81029,81030],{"class":2593,"line":2843},[414,81031,81032],{"class":3527},"\u002F\u002F Calculate gross profit\n",[414,81034,81035,81037,81040,81042,81045,81047],{"class":2593,"line":2849},[414,81036,2745],{"class":2698},[414,81038,81039],{"class":2607}," gross_profit_amount",[414,81041,2817],{"class":2698},[414,81043,81044],{"class":2705}," profitloss.income_total_amount ",[414,81046,34146],{"class":2698},[414,81048,81049],{"class":2705}," profitloss.cost_of_goods_sold_total_amount;\n",[19,81051],{},[3629,81053,77450,81055,20790,81058],{"id":81054},"field-net_profit_amount-net_income_amount",[36,81056,81057],{},"net_profit_amount",[36,81059,81060],{},"net_income_amount",[22,81062,81063],{},[31,81064,78127],{},[2354,81066,81067],{},[2357,81068,81069],{},[36,81070,80223],{},[22,81072,81073],{},[31,81074,77529],{},[2584,81076,81078],{"className":2689,"code":81077,"language":2691,"meta":2433,"style":2433},"net_profit_amount?: number; \u002F\u002F @deprecated – use net_income_amount instead\n",[36,81079,81080],{"__ignoreMap":2433},[414,81081,81082,81084,81086,81088],{"class":2593,"line":2594},[414,81083,81057],{"class":2705},[414,81085,16892],{"class":2698},[414,81087,80875],{"class":2705},[414,81089,81090],{"class":3527},"\u002F\u002F @deprecated – use net_income_amount instead\n",[22,81092,81093],{},[31,81094,77551],{},[2584,81096,81098],{"className":2689,"code":81097,"language":2691,"meta":2433,"style":2433},"net_income_amount?: number;\n",[36,81099,81100],{"__ignoreMap":2433},[414,81101,81102,81104,81106],{"class":2593,"line":2594},[414,81103,81060],{"class":2705},[414,81105,16892],{"class":2698},[414,81107,81108],{"class":2705}," number;\n",[22,81110,81111],{},[31,81112,77572],{},[2354,81114,81115,81123],{},[2357,81116,81117,77592,81119,75043,81121],{},[31,81118,77579],{},[36,81120,81060],{},[36,81122,81057],{},[2357,81124,81125,77592,81127,80285],{},[31,81126,77591],{},[36,81128,81060],{},[22,81130,81131],{},[31,81132,17183],{},[2584,81134,81136],{"className":2689,"code":81135,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nconst profitloss = {\n    net_profit_amount: 50000\n}\n\n\u002F\u002F After\nconst profitloss = {\n    net_income_amount: 50000\n}\n",[36,81137,81138,81142,81152,81159,81163,81167,81171,81181,81188],{"__ignoreMap":2433},[414,81139,81140],{"class":2593,"line":2594},[414,81141,77611],{"class":3527},[414,81143,81144,81146,81148,81150],{"class":2593,"line":2434},[414,81145,2745],{"class":2698},[414,81147,80314],{"class":2607},[414,81149,2817],{"class":2698},[414,81151,2748],{"class":2705},[414,81153,81154,81157],{"class":2593,"line":2613},[414,81155,81156],{"class":2705},"    net_profit_amount: ",[414,81158,80570],{"class":2607},[414,81160,81161],{"class":2593,"line":2625},[414,81162,3035],{"class":2705},[414,81164,81165],{"class":2593,"line":2677},[414,81166,2740],{"emptyLinePlaceholder":2459},[414,81168,81169],{"class":2593,"line":2751},[414,81170,77649],{"class":3527},[414,81172,81173,81175,81177,81179],{"class":2593,"line":2760},[414,81174,2745],{"class":2698},[414,81176,80314],{"class":2607},[414,81178,2817],{"class":2698},[414,81180,2748],{"class":2705},[414,81182,81183,81186],{"class":2593,"line":2768},[414,81184,81185],{"class":2705},"    net_income_amount: ",[414,81187,80570],{"class":2607},[414,81189,81190],{"class":2593,"line":2776},[414,81191,3035],{"class":2705},[19,81193],{},[3629,81195,77450,81197,741,81200,81203],{"id":81196},"field-iaccountingprofitlosscategory-and-iaccountingprofitlosssubcategory-deprecated-types",[36,81198,81199],{},"IAccountingProfitlossCategory",[36,81201,81202],{},"IAccountingProfitlossSubcategory"," → Deprecated Types",[22,81205,81206],{},[31,81207,81208],{},"Deprecated Types:",[2354,81210,81211,81216],{},[2357,81212,81213,81215],{},[36,81214,81199],{}," - @deprecated",[2357,81217,81218,81215],{},[36,81219,81202],{},[22,81221,81222],{},[31,81223,77551],{},[2354,81225,81226],{},[2357,81227,3370,81228,81231],{},[36,81229,81230],{},"IAccountingProfitlossSection"," instead",[22,81233,81234],{},[31,81235,77572],{},[2354,81237,81238,81246],{},[2357,81239,81240,81243,81244],{},[31,81241,81242],{},"Type Definitions:"," Update TypeScript interfaces to use ",[36,81245,81230],{},[2357,81247,81248,77592,81250,319,81252,322,81254,81256],{},[31,81249,77579],{},[36,81251,80212],{},[36,81253,80459],{},[36,81255,80651],{}," which use the new section structure",[22,81258,81259],{},[31,81260,17183],{},[2584,81262,81264],{"className":2689,"code":81263,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\ninterface Profitloss {\n    income?: IAccountingProfitlossCategory[];\n}\n\n\u002F\u002F After\ninterface Profitloss {\n    income_sections?: IAccountingProfitlossSection[];\n}\n",[36,81265,81266,81270,81279,81291,81295,81299,81303,81311,81323],{"__ignoreMap":2433},[414,81267,81268],{"class":2593,"line":2594},[414,81269,77611],{"class":3527},[414,81271,81272,81274,81277],{"class":2593,"line":2434},[414,81273,16879],{"class":2698},[414,81275,81276],{"class":2597}," Profitloss",[414,81278,2748],{"class":2705},[414,81280,81281,81284,81286,81289],{"class":2593,"line":2613},[414,81282,81283],{"class":2971},"    income",[414,81285,16892],{"class":2698},[414,81287,81288],{"class":2597}," IAccountingProfitlossCategory",[414,81290,17001],{"class":2705},[414,81292,81293],{"class":2593,"line":2625},[414,81294,3035],{"class":2705},[414,81296,81297],{"class":2593,"line":2677},[414,81298,2740],{"emptyLinePlaceholder":2459},[414,81300,81301],{"class":2593,"line":2751},[414,81302,77649],{"class":3527},[414,81304,81305,81307,81309],{"class":2593,"line":2760},[414,81306,16879],{"class":2698},[414,81308,81276],{"class":2597},[414,81310,2748],{"class":2705},[414,81312,81313,81316,81318,81321],{"class":2593,"line":2768},[414,81314,81315],{"class":2971},"    income_sections",[414,81317,16892],{"class":2698},[414,81319,81320],{"class":2597}," IAccountingProfitlossSection",[414,81322,17001],{"class":2705},[414,81324,81325],{"class":2593,"line":2776},[414,81326,3035],{"class":2705},[19,81328],{},[55,81330,77423],{"id":81331},"ats-applicant-tracking-system-fields",[3629,81333,78826,81335,20790,81338],{"id":81334},"fielddocument_id-document_ids",[36,81336,81337],{},"document_id",[36,81339,81340],{},"document_ids",[22,81342,81343],{},[31,81344,78127],{},[2354,81346,81347],{},[2357,81348,81349,77938,81352],{},[36,81350,81351],{},"IAtsActivity",[36,81353,77506],{},[22,81355,81356],{},[31,81357,77529],{},[2584,81359,81361],{"className":2689,"code":81360,"language":2691,"meta":2433,"style":2433},"document_id?: string; \u002F\u002F @deprecated\n",[36,81362,81363],{"__ignoreMap":2433},[414,81364,81365,81367,81369,81371],{"class":2593,"line":2594},[414,81366,81337],{"class":2705},[414,81368,16892],{"class":2698},[414,81370,77543],{"class":2705},[414,81372,78653],{"class":3527},[22,81374,81375],{},[31,81376,77551],{},[2584,81378,81380],{"className":2689,"code":81379,"language":2691,"meta":2433,"style":2433},"document_ids?: string[]; \u002F\u002F IDs for AtsDocument.get\n",[36,81381,81382],{"__ignoreMap":2433},[414,81383,81384,81386,81388,81391],{"class":2593,"line":2594},[414,81385,81340],{"class":2705},[414,81387,16892],{"class":2698},[414,81389,81390],{"class":2705}," string[]; ",[414,81392,81393],{"class":3527},"\u002F\u002F IDs for AtsDocument.get\n",[22,81395,81396],{},[31,81397,77572],{},[2354,81399,81400,81408,81415],{},[2357,81401,81402,77592,81404,79364,81406],{},[31,81403,77579],{},[36,81405,81340],{},[36,81407,81337],{},[2357,81409,81410,77592,81412,81414],{},[31,81411,77591],{},[36,81413,81340],{}," array when creating activities",[2357,81416,81417,81420],{},[31,81418,81419],{},"Multi-Document Support:"," Supports multiple documents per activity",[22,81422,81423],{},[31,81424,17183],{},[2584,81426,81428],{"className":2689,"code":81427,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nconst activity = {\n    title: 'Review Resume',\n    document_id: 'doc_123'\n}\n\n\u002F\u002F After\nconst activity = {\n    title: 'Review Resume',\n    document_ids: ['doc_123', 'doc_456']\n}\n",[36,81429,81430,81434,81445,81455,81463,81467,81471,81475,81485,81493,81508],{"__ignoreMap":2433},[414,81431,81432],{"class":2593,"line":2594},[414,81433,77611],{"class":3527},[414,81435,81436,81438,81441,81443],{"class":2593,"line":2434},[414,81437,2745],{"class":2698},[414,81439,81440],{"class":2607}," activity",[414,81442,2817],{"class":2698},[414,81444,2748],{"class":2705},[414,81446,81447,81450,81453],{"class":2593,"line":2613},[414,81448,81449],{"class":2705},"    title: ",[414,81451,81452],{"class":2601},"'Review Resume'",[414,81454,2757],{"class":2705},[414,81456,81457,81460],{"class":2593,"line":2625},[414,81458,81459],{"class":2705},"    document_id: ",[414,81461,81462],{"class":2601},"'doc_123'\n",[414,81464,81465],{"class":2593,"line":2677},[414,81466,3035],{"class":2705},[414,81468,81469],{"class":2593,"line":2751},[414,81470,2740],{"emptyLinePlaceholder":2459},[414,81472,81473],{"class":2593,"line":2760},[414,81474,77649],{"class":3527},[414,81476,81477,81479,81481,81483],{"class":2593,"line":2768},[414,81478,2745],{"class":2698},[414,81480,81440],{"class":2607},[414,81482,2817],{"class":2698},[414,81484,2748],{"class":2705},[414,81486,81487,81489,81491],{"class":2593,"line":2776},[414,81488,81449],{"class":2705},[414,81490,81452],{"class":2601},[414,81492,2757],{"class":2705},[414,81494,81495,81498,81501,81503,81506],{"class":2593,"line":2784},[414,81496,81497],{"class":2705},"    document_ids: [",[414,81499,81500],{"class":2601},"'doc_123'",[414,81502,319],{"class":2705},[414,81504,81505],{"class":2601},"'doc_456'",[414,81507,9376],{"class":2705},[414,81509,81510],{"class":2593,"line":2792},[414,81511,3035],{"class":2705},[19,81513],{},[3629,81515,77450,81517,20790,81520],{"id":81516},"field-departments-groups",[36,81518,81519],{},"departments",[36,81521,78615],{},[22,81523,81524],{},[31,81525,78127],{},[2354,81527,81528],{},[2357,81529,81530,77938,81532],{},[36,81531,17261],{},[36,81533,77506],{},[22,81535,81536],{},[31,81537,77529],{},[2584,81539,81541],{"className":2689,"code":81540,"language":2691,"meta":2433,"style":2433},"departments?: string[]; \u002F\u002F @deprecated Use `groups` instead\n",[36,81542,81543],{"__ignoreMap":2433},[414,81544,81545,81547,81549,81551],{"class":2593,"line":2594},[414,81546,81519],{"class":2705},[414,81548,16892],{"class":2698},[414,81550,81390],{"class":2705},[414,81552,81553],{"class":3527},"\u002F\u002F @deprecated Use `groups` instead\n",[22,81555,81556],{},[31,81557,77551],{},[2584,81559,81561],{"className":2689,"code":81560,"language":2691,"meta":2433,"style":2433},"groups?: IAtsGroup[]; \u002F\u002F The departments\u002Fdivisions\u002Fteams that this job belongs to\n",[36,81562,81563],{"__ignoreMap":2433},[414,81564,81565,81567,81569,81572],{"class":2593,"line":2594},[414,81566,78615],{"class":2705},[414,81568,16892],{"class":2698},[414,81570,81571],{"class":2705}," IAtsGroup[]; ",[414,81573,81574],{"class":3527},"\u002F\u002F The departments\u002Fdivisions\u002Fteams that this job belongs to\n",[22,81576,81577],{},[31,81578,77572],{},[2354,81580,81581,81589,81599],{},[2357,81582,81583,77592,81585,79364,81587],{},[31,81584,77579],{},[36,81586,78615],{},[36,81588,81519],{},[2357,81590,81591,77592,81593,78695,81595,81598],{},[31,81592,77591],{},[36,81594,78615],{},[36,81596,81597],{},"IAtsGroup"," objects instead of department strings",[2357,81600,81601,81603],{},[31,81602,79099],{}," Provides group IDs, names, and types (TEAM, GROUP, DEPARTMENT, DIVISION, etc.)",[22,81605,81606],{},[31,81607,17183],{},[2584,81609,81611],{"className":2689,"code":81610,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nconst job = {\n    name: 'Software Engineer',\n    departments: ['Engineering', 'Product']\n}\n\n\u002F\u002F 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",[36,81612,81613,81617,81628,81637,81650,81654,81658,81662,81672,81680,81684,81692,81700,81706,81711,81719,81727,81733,81737],{"__ignoreMap":2433},[414,81614,81615],{"class":2593,"line":2594},[414,81616,77611],{"class":3527},[414,81618,81619,81621,81624,81626],{"class":2593,"line":2434},[414,81620,2745],{"class":2698},[414,81622,81623],{"class":2607}," job",[414,81625,2817],{"class":2698},[414,81627,2748],{"class":2705},[414,81629,81630,81632,81635],{"class":2593,"line":2613},[414,81631,28908],{"class":2705},[414,81633,81634],{"class":2601},"'Software Engineer'",[414,81636,2757],{"class":2705},[414,81638,81639,81642,81644,81646,81648],{"class":2593,"line":2625},[414,81640,81641],{"class":2705},"    departments: [",[414,81643,78801],{"class":2601},[414,81645,319],{"class":2705},[414,81647,78990],{"class":2601},[414,81649,9376],{"class":2705},[414,81651,81652],{"class":2593,"line":2677},[414,81653,3035],{"class":2705},[414,81655,81656],{"class":2593,"line":2751},[414,81657,2740],{"emptyLinePlaceholder":2459},[414,81659,81660],{"class":2593,"line":2760},[414,81661,77649],{"class":3527},[414,81663,81664,81666,81668,81670],{"class":2593,"line":2768},[414,81665,2745],{"class":2698},[414,81667,81623],{"class":2607},[414,81669,2817],{"class":2698},[414,81671,2748],{"class":2705},[414,81673,81674,81676,81678],{"class":2593,"line":2776},[414,81675,28908],{"class":2705},[414,81677,81634],{"class":2601},[414,81679,2757],{"class":2705},[414,81681,81682],{"class":2593,"line":2784},[414,81683,78783],{"class":2705},[414,81685,81686,81688,81690],{"class":2593,"line":2792},[414,81687,78788],{"class":2705},[414,81689,78791],{"class":2601},[414,81691,2757],{"class":2705},[414,81693,81694,81696,81698],{"class":2593,"line":2804},[414,81695,78798],{"class":2705},[414,81697,78801],{"class":2601},[414,81699,2757],{"class":2705},[414,81701,81702,81704],{"class":2593,"line":2809},[414,81703,78808],{"class":2705},[414,81705,78811],{"class":2601},[414,81707,81708],{"class":2593,"line":2829},[414,81709,81710],{"class":2705},"    }, {\n",[414,81712,81713,81715,81717],{"class":2593,"line":2843},[414,81714,78788],{"class":2705},[414,81716,78981],{"class":2601},[414,81718,2757],{"class":2705},[414,81720,81721,81723,81725],{"class":2593,"line":2849},[414,81722,78798],{"class":2705},[414,81724,78990],{"class":2601},[414,81726,2757],{"class":2705},[414,81728,81729,81731],{"class":2593,"line":2854},[414,81730,78808],{"class":2705},[414,81732,78811],{"class":2601},[414,81734,81735],{"class":2593,"line":2880},[414,81736,78816],{"class":2705},[414,81738,81739],{"class":2593,"line":3253},[414,81740,3035],{"class":2705},[19,81742],{},[55,81744,77426],{"id":81745},"ticketing-fields",[3629,81747,77450,81749,20790,81752],{"id":81748},"field-category-category_id",[36,81750,81751],{},"category",[36,81753,81754],{},"category_id",[22,81756,81757],{},[31,81758,78127],{},[2354,81760,81761],{},[2357,81762,81763,77938,81766],{},[36,81764,81765],{},"ITicketingTicket",[36,81767,81768],{},"src\u002Fmodels\u002FUnifiedTicketing.ts",[22,81770,81771],{},[31,81772,77529],{},[2584,81774,81776],{"className":2689,"code":81775,"language":2691,"meta":2433,"style":2433},"category?: string; \u002F\u002F @deprecated; use category_id\n",[36,81777,81778],{"__ignoreMap":2433},[414,81779,81780,81782,81784,81786],{"class":2593,"line":2594},[414,81781,81751],{"class":2705},[414,81783,16892],{"class":2698},[414,81785,77543],{"class":2705},[414,81787,81788],{"class":3527},"\u002F\u002F @deprecated; use category_id\n",[22,81790,81791],{},[31,81792,77551],{},[2584,81794,81796],{"className":2689,"code":81795,"language":2691,"meta":2433,"style":2433},"category_id?: string;\n",[36,81797,81798],{"__ignoreMap":2433},[414,81799,81800,81802,81804],{"class":2593,"line":2594},[414,81801,81754],{"class":2705},[414,81803,16892],{"class":2698},[414,81805,78009],{"class":2705},[22,81807,81808],{},[31,81809,77572],{},[2354,81811,81812,81820,81827],{},[2357,81813,81814,77592,81816,75043,81818,2977],{},[31,81815,77579],{},[36,81817,81754],{},[36,81819,81751],{},[2357,81821,81822,77592,81824,81826],{},[31,81823,77591],{},[36,81825,81754],{}," when creating or updating tickets",[2357,81828,81829,81831,81832,81834],{},[31,81830,79830],{}," Using ",[36,81833,81754],{}," maintains consistency with other ID-based relationships",[22,81836,81837],{},[31,81838,17183],{},[2584,81840,81842],{"className":2689,"code":81841,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nconst ticket = {\n    subject: 'Support Request',\n    category: 'technical'\n}\n\n\u002F\u002F After\nconst ticket = {\n    subject: 'Support Request',\n    category_id: 'category_123'\n}\n",[36,81843,81844,81848,81859,81868,81876,81880,81884,81888,81898,81906,81914],{"__ignoreMap":2433},[414,81845,81846],{"class":2593,"line":2594},[414,81847,77611],{"class":3527},[414,81849,81850,81852,81855,81857],{"class":2593,"line":2434},[414,81851,2745],{"class":2698},[414,81853,81854],{"class":2607}," ticket",[414,81856,2817],{"class":2698},[414,81858,2748],{"class":2705},[414,81860,81861,81863,81866],{"class":2593,"line":2613},[414,81862,18343],{"class":2705},[414,81864,81865],{"class":2601},"'Support Request'",[414,81867,2757],{"class":2705},[414,81869,81870,81873],{"class":2593,"line":2625},[414,81871,81872],{"class":2705},"    category: ",[414,81874,81875],{"class":2601},"'technical'\n",[414,81877,81878],{"class":2593,"line":2677},[414,81879,3035],{"class":2705},[414,81881,81882],{"class":2593,"line":2751},[414,81883,2740],{"emptyLinePlaceholder":2459},[414,81885,81886],{"class":2593,"line":2760},[414,81887,77649],{"class":3527},[414,81889,81890,81892,81894,81896],{"class":2593,"line":2768},[414,81891,2745],{"class":2698},[414,81893,81854],{"class":2607},[414,81895,2817],{"class":2698},[414,81897,2748],{"class":2705},[414,81899,81900,81902,81904],{"class":2593,"line":2776},[414,81901,18343],{"class":2705},[414,81903,81865],{"class":2601},[414,81905,2757],{"class":2705},[414,81907,81908,81911],{"class":2593,"line":2784},[414,81909,81910],{"class":2705},"    category_id: ",[414,81912,81913],{"class":2601},"'category_123'\n",[414,81915,81916],{"class":2593,"line":2792},[414,81917,3035],{"class":2705},[19,81919],{},[55,81921,77429],{"id":81922},"calendar-fields",[3629,81924,78826,81926,20790,81929],{"id":81925},"fieldprimary-is_primary",[36,81927,81928],{},"primary",[36,81930,81931],{},"is_primary",[22,81933,81934],{},[31,81935,78127],{},[2354,81937,81938],{},[2357,81939,81940,77938,81943],{},[36,81941,81942],{},"ICalendarCalendar",[36,81944,81945],{},"src\u002Fmodels\u002FUnifiedCalendar.ts",[22,81947,81948],{},[31,81949,77529],{},[2584,81951,81953],{"className":2689,"code":81952,"language":2691,"meta":2433,"style":2433},"primary?: boolean; \u002F\u002F @deprecated\n",[36,81954,81955],{"__ignoreMap":2433},[414,81956,81957,81959,81961,81964],{"class":2593,"line":2594},[414,81958,81928],{"class":2705},[414,81960,16892],{"class":2698},[414,81962,81963],{"class":2705}," boolean; ",[414,81965,78653],{"class":3527},[22,81967,81968],{},[31,81969,77551],{},[2584,81971,81973],{"className":2689,"code":81972,"language":2691,"meta":2433,"style":2433},"is_primary?: boolean;\n",[36,81974,81975],{"__ignoreMap":2433},[414,81976,81977,81979,81981],{"class":2593,"line":2594},[414,81978,81931],{"class":2705},[414,81980,16892],{"class":2698},[414,81982,81983],{"class":2705}," boolean;\n",[19,81985],{},[55,81987,77432],{"id":81988},"query-parameters-filters",[3629,81990,81992,20790,81995],{"id":81991},"expand_recurring_events-expand",[36,81993,81994],{},"expand_recurring_events",[36,81996,81997],{},"expand",[22,81999,82000],{},[31,82001,77468],{},[2354,82003,82004],{},[2357,82005,82006],{},[36,82007,82008],{},"ICalendarEvent",[22,82010,82011],{},[31,82012,82013],{},"Deprecated Parameter:",[2584,82015,82017],{"className":2689,"code":82016,"language":2691,"meta":2433,"style":2433},"expand_recurring_events?: boolean; \u002F\u002F @deprecated; use expand\n",[36,82018,82019],{"__ignoreMap":2433},[414,82020,82021,82023,82025,82027],{"class":2593,"line":2594},[414,82022,81994],{"class":2705},[414,82024,16892],{"class":2698},[414,82026,81963],{"class":2705},[414,82028,82029],{"class":3527},"\u002F\u002F @deprecated; use expand\n",[22,82031,82032],{},[31,82033,77551],{},[2584,82035,82037],{"className":2689,"code":82036,"language":2691,"meta":2433,"style":2433},"expand?: boolean;\n",[36,82038,82039],{"__ignoreMap":2433},[414,82040,82041,82043,82045],{"class":2593,"line":2594},[414,82042,81997],{"class":2705},[414,82044,16892],{"class":2698},[414,82046,81983],{"class":2705},[22,82048,82049],{},[31,82050,77572],{},[2354,82052,82053,82064],{},[2357,82054,82055,82058,82059,82061,82062],{},[31,82056,82057],{},"API Calls:"," Replace ",[36,82060,81994],{}," query parameter with ",[36,82063,81997],{},[2357,82065,82066,34,82069,82071],{},[31,82067,82068],{},"More Flexible:",[36,82070,81997],{}," supports expanding multiple event types, not just recurring events",[22,82073,82074],{},[31,82075,17183],{},[2584,82077,82079],{"className":2689,"code":82078,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nGET \u002Fapi\u002Fcalendar\u002Fevents?expand_recurring_events=true\n\n\u002F\u002F After\nGET \u002Fapi\u002Fcalendar\u002Fevents?expand=true\n",[36,82080,82081,82085,82111,82115,82119],{"__ignoreMap":2433},[414,82082,82083],{"class":2593,"line":2594},[414,82084,77611],{"class":3527},[414,82086,82087,82089,82091,82093,82095,82098,82100,82103,82105,82107,82109],{"class":2593,"line":2434},[414,82088,9294],{"class":2607},[414,82090,11295],{"class":2698},[414,82092,34178],{"class":2705},[414,82094,23303],{"class":2698},[414,82096,82097],{"class":2705},"calendar",[414,82099,23303],{"class":2698},[414,82101,82102],{"class":2705},"events",[414,82104,3610],{"class":2698},[414,82106,81994],{"class":2705},[414,82108,2798],{"class":2698},[414,82110,10733],{"class":2607},[414,82112,82113],{"class":2593,"line":2613},[414,82114,2740],{"emptyLinePlaceholder":2459},[414,82116,82117],{"class":2593,"line":2625},[414,82118,77649],{"class":3527},[414,82120,82121,82123,82125,82127,82129,82131,82133,82135,82137,82139,82141],{"class":2593,"line":2677},[414,82122,9294],{"class":2607},[414,82124,11295],{"class":2698},[414,82126,34178],{"class":2705},[414,82128,23303],{"class":2698},[414,82130,82097],{"class":2705},[414,82132,23303],{"class":2698},[414,82134,82102],{"class":2705},[414,82136,3610],{"class":2698},[414,82138,81997],{"class":2705},[414,82140,2798],{"class":2698},[414,82142,10733],{"class":2607},[19,82144],{},[3629,82146,82148,20790,82151],{"id":82147},"end_le-end_lt",[36,82149,82150],{},"end_le",[36,82152,82153],{},"end_lt",[22,82155,82156],{},[31,82157,77468],{},[2354,82159,82160,82164,82169,82174,82179,82184,82189,82194,82199,82204,82208,82213,82217,82222,82227],{},[2357,82161,82162],{},[36,82163,82008],{},[2357,82165,82166],{},[36,82167,82168],{},"ICalendarBusy",[2357,82170,82171],{},[36,82172,82173],{},"ICalendarRecording",[2357,82175,82176],{},[36,82177,82178],{},"IUcCall",[2357,82180,82181],{},[36,82182,82183],{},"IUcRecording",[2357,82185,82186],{},[36,82187,82188],{},"IHrisTimeoff",[2357,82190,82191],{},[36,82192,82193],{},"IHrisTimeshift",[2357,82195,82196],{},[36,82197,82198],{},"IAccountingBalancesheet",[2357,82200,82201],{},[36,82202,82203],{},"IAccountingCashflow",[2357,82205,82206],{},[36,82207,80223],{},[2357,82209,82210],{},[36,82211,82212],{},"IAccountingTrialbalance",[2357,82214,82215],{},[36,82216,78458],{},[2357,82218,82219],{},[36,82220,82221],{},"IPaymentSubscription",[2357,82223,82224],{},[36,82225,82226],{},"IPaymentPayment",[2357,82228,82229],{},[36,82230,82231],{},"IPaymentPayout",[22,82233,82234],{},[31,82235,82013],{},[2584,82237,82239],{"className":2689,"code":82238,"language":2691,"meta":2433,"style":2433},"end_le?: string | Date; \u002F\u002F @deprecated; use end_lt\n",[36,82240,82241],{"__ignoreMap":2433},[414,82242,82243,82245,82247,82249,82251,82254],{"class":2593,"line":2594},[414,82244,82150],{"class":2705},[414,82246,16892],{"class":2698},[414,82248,68800],{"class":2705},[414,82250,79766],{"class":2698},[414,82252,82253],{"class":2705}," Date; ",[414,82255,82256],{"class":3527},"\u002F\u002F @deprecated; use end_lt\n",[22,82258,82259],{},[31,82260,77551],{},[2584,82262,82264],{"className":2689,"code":82263,"language":2691,"meta":2433,"style":2433},"end_lt?: string | Date;\n",[36,82265,82266],{"__ignoreMap":2433},[414,82267,82268,82270,82272,82274,82276],{"class":2593,"line":2594},[414,82269,82153],{"class":2705},[414,82271,16892],{"class":2698},[414,82273,68800],{"class":2705},[414,82275,79766],{"class":2698},[414,82277,82278],{"class":2705}," Date;\n",[22,82280,82281],{},[31,82282,77572],{},[2354,82284,82285,82295],{},[2357,82286,82287,82058,82289,82291,82292,82294],{},[31,82288,82057],{},[36,82290,82150],{}," (less than or equal) with ",[36,82293,82153],{}," (less than)",[2357,82296,82297,82299],{},[31,82298,79830],{}," Aligns with standard date range filtering conventions",[22,82301,82302],{},[31,82303,17183],{},[2584,82305,82307],{"className":2689,"code":82306,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nGET \u002Fapi\u002Fcalendar\u002Fevents?end_le=2024-12-31\n\n\u002F\u002F After\nGET \u002Fapi\u002Fcalendar\u002Fevents?end_lt=2025-01-01\n\u002F\u002F Note: Adjust date by +1 day if you need inclusive end date\n",[36,82308,82309,82313,82348,82352,82356,82391],{"__ignoreMap":2433},[414,82310,82311],{"class":2593,"line":2594},[414,82312,77611],{"class":3527},[414,82314,82315,82317,82319,82321,82323,82325,82327,82329,82331,82333,82335,82338,82340,82343,82345],{"class":2593,"line":2434},[414,82316,9294],{"class":2607},[414,82318,11295],{"class":2698},[414,82320,34178],{"class":2705},[414,82322,23303],{"class":2698},[414,82324,82097],{"class":2705},[414,82326,23303],{"class":2698},[414,82328,82102],{"class":2705},[414,82330,3610],{"class":2698},[414,82332,82150],{"class":2705},[414,82334,2798],{"class":2698},[414,82336,82337],{"class":2607},"2024",[414,82339,34146],{"class":2698},[414,82341,82342],{"class":2607},"12",[414,82344,34146],{"class":2698},[414,82346,82347],{"class":2607},"31\n",[414,82349,82350],{"class":2593,"line":2613},[414,82351,2740],{"emptyLinePlaceholder":2459},[414,82353,82354],{"class":2593,"line":2625},[414,82355,77649],{"class":3527},[414,82357,82358,82360,82362,82364,82366,82368,82370,82372,82374,82376,82378,82381,82383,82386,82388],{"class":2593,"line":2677},[414,82359,9294],{"class":2607},[414,82361,11295],{"class":2698},[414,82363,34178],{"class":2705},[414,82365,23303],{"class":2698},[414,82367,82097],{"class":2705},[414,82369,23303],{"class":2698},[414,82371,82102],{"class":2705},[414,82373,3610],{"class":2698},[414,82375,82153],{"class":2705},[414,82377,2798],{"class":2698},[414,82379,82380],{"class":2607},"2025",[414,82382,34146],{"class":2698},[414,82384,82385],{"class":2607},"01",[414,82387,34146],{"class":2698},[414,82389,82390],{"class":2607},"01\n",[414,82392,82393],{"class":2593,"line":2751},[414,82394,82395],{"class":3527},"\u002F\u002F Note: Adjust date by +1 day if you need inclusive end date\n",[2584,82397,82400],{"className":82398,"code":82399,"language":2652},[50343],"\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; \u002F\u002F @deprecated; use sig256 instead\n",[36,82401,82399],{"__ignoreMap":2433},[22,82403,82404],{},[31,82405,77551],{},[2584,82407,82409],{"className":2689,"code":82408,"language":2691,"meta":2433,"style":2433},"sig256?: string; \u002F\u002F HMAC-SHA256(workspace.secret, data + nonce)\n",[36,82410,82411],{"__ignoreMap":2433},[414,82412,82413,82415,82417,82419],{"class":2593,"line":2594},[414,82414,45956],{"class":2705},[414,82416,16892],{"class":2698},[414,82418,77543],{"class":2705},[414,82420,82421],{"class":3527},"\u002F\u002F HMAC-SHA256(workspace.secret, data + nonce)\n",[22,82423,82424],{},[31,82425,77572],{},[2354,82427,82428,82438,82449],{},[2357,82429,82430,77592,82433,75043,82435,82437],{},[31,82431,82432],{},"Webhook Verification:",[36,82434,45956],{},[36,82436,22218],{}," for webhook signature verification",[2357,82439,82440,34,82443,82445,82446,82448],{},[31,82441,82442],{},"Security:",[36,82444,45956],{}," uses HMAC-SHA256 which is more secure than the previous signature algorithm. ",[36,82447,22218],{}," used HMAC-SHA1, which is now deprecated.",[2357,82450,82451,82454,82455,26211],{},[31,82452,82453],{},"Verification:"," Update your webhook verification code to check ",[36,82456,45956],{},[22,82458,82459],{},[31,82460,17183],{},[2584,82462,82464],{"className":2689,"code":82463,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nconst isValid = verifySignature(webhook.sig, payload, secret, 'sha');\n\n\u002F\u002F After\nconst isValid = verifySignature(webhook.sig256, payload, secret, ‘sha256');\n",[36,82465,82466,82470,82490,82494,82498],{"__ignoreMap":2433},[414,82467,82468],{"class":2593,"line":2594},[414,82469,77611],{"class":3527},[414,82471,82472,82474,82477,82479,82482,82485,82488],{"class":2593,"line":2434},[414,82473,2745],{"class":2698},[414,82475,82476],{"class":2607}," isValid",[414,82478,2817],{"class":2698},[414,82480,82481],{"class":2597}," verifySignature",[414,82483,82484],{"class":2705},"(webhook.sig, payload, secret, ",[414,82486,82487],{"class":2601},"'sha'",[414,82489,3156],{"class":2705},[414,82491,82492],{"class":2593,"line":2613},[414,82493,2740],{"emptyLinePlaceholder":2459},[414,82495,82496],{"class":2593,"line":2625},[414,82497,77649],{"class":3527},[414,82499,82500,82502,82504,82506,82508,82511,82514],{"class":2593,"line":2677},[414,82501,2745],{"class":2698},[414,82503,82476],{"class":2607},[414,82505,2817],{"class":2698},[414,82507,82481],{"class":2597},[414,82509,82510],{"class":2705},"(webhook.sig256, payload, secret, ‘sha256",[414,82512,82513],{"class":2601},"')",[414,82515,2706],{"class":7401},[2584,82517,82520],{"className":82518,"code":82519,"language":2652},[50343],"\n\n---\n\n\n## Deprecated Objects\u002FUsage 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\u002Fmodels\u002FUnifiedAccounting.ts`\n\n**Deprecated Pattern:**\n\n\n```typescript\ninterface IAccountingInvoice {\n  type: 'BILL',  \u002F\u002F @deprecated - use IAccountingBill instead\n  ...\n}\n",[36,82521,82519],{"__ignoreMap":2433},[22,82523,82524],{},[31,82525,77551],{},[2584,82527,82529],{"className":2689,"code":82528,"language":2691,"meta":2433,"style":2433},"interface IAccountingBill {\n    ...\n}\n",[36,82530,82531,82540,82544],{"__ignoreMap":2433},[414,82532,82533,82535,82538],{"class":2593,"line":2594},[414,82534,16879],{"class":2698},[414,82536,82537],{"class":2597}," IAccountingBill",[414,82539,2748],{"class":2705},[414,82541,82542],{"class":2593,"line":2434},[414,82543,7470],{"class":2698},[414,82545,82546],{"class":2593,"line":2613},[414,82547,3035],{"class":2705},[22,82549,82550],{},[31,82551,82552],{},"Key Differences:",[2354,82554,82555,82567,82574,82584],{},[2357,82556,82557,82560,82561,75043,82564],{},[36,82558,82559],{},"IAccountingBill"," uses ",[36,82562,82563],{},"bill_number",[36,82565,82566],{},"invoice_number",[2357,82568,82569,82571,82572,26211],{},[36,82570,82559],{}," does not have the deprecated ",[36,82573,3397],{},[2357,82575,82576,82571,82578,82580,82581,82583],{},[36,82577,82559],{},[36,82579,79731],{}," field (uses ",[36,82582,79734],{}," instead)",[2357,82585,82586],{},"More semantic clarity: a Bill is clearly distinct from an Invoice",[22,82588,82589],{},[31,82590,77572],{},[2354,82592,82593,82607],{},[2357,82594,82595,77592,82597,82600,82601,82603,82604],{},[31,82596,77579],{},[36,82598,82599],{},"accounting_bill"," endpoints instead of ",[36,82602,63041],{}," endpoints with ",[36,82605,82606],{},"type='BILL'",[2357,82608,82609,77592,82611,82613,82614,27087,82616],{},[31,82610,77591],{},[36,82612,82599],{}," create\u002Fupdate endpoints instead of ",[36,82615,63041],{},[36,82617,82606],{},[22,82619,82620,82623],{},[31,82621,82622],{},"Field Mapping:"," When migrating data:",[2354,82625,82626,82632,82638],{},[2357,82627,82628,20790,82630],{},[36,82629,82566],{},[36,82631,82563],{},[2357,82633,82634,82635,82637],{},"Remove ",[36,82636,3397],{}," field (no longer needed)",[2357,82639,82640,20790,82642,82644],{},[36,82641,79731],{},[36,82643,79734],{}," (if still using deprecated field)",[22,82646,82647],{},[31,82648,82649],{},"API Endpoints:",[2354,82651,82652,82661],{},[2357,82653,82654,82655,27087,82658],{},"❌ Deprecated: ",[36,82656,82657],{},"POST \u002Faccounting\u002Finvoice",[36,82659,82660],{},"type: 'BILL'",[2357,82662,82663,82664],{},"✅ Use: ",[36,82665,82666],{},"POST \u002Faccounting\u002Fbill",[22,82668,82669],{},[31,82670,17183],{},[2584,82672,82674],{"className":2689,"code":82673,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Before\nPOST \u002Faccounting\u002Finvoice\n{\n    'type': 'BILL',\n    'invoice_number': 'BILL-001',\n    'contact_id': 'contact_123',\n    'total_amount': 1000\n}\n\n\u002F\u002F After\nPOST \u002Faccounting\u002Fbill\n{\n    'bill_number': 'BILL-001',\n    'contact_id': 'contact_123',\n    'total_amount': 1000\n}\n",[36,82675,82676,82680,82694,82698,82710,82722,82733,82743,82747,82751,82755,82768,82772,82783,82793,82801],{"__ignoreMap":2433},[414,82677,82678],{"class":2593,"line":2594},[414,82679,77611],{"class":3527},[414,82681,82682,82684,82686,82689,82691],{"class":2593,"line":2434},[414,82683,45857],{"class":2607},[414,82685,11295],{"class":2698},[414,82687,82688],{"class":2705},"accounting",[414,82690,23303],{"class":2698},[414,82692,82693],{"class":2705},"invoice\n",[414,82695,82696],{"class":2593,"line":2613},[414,82697,8916],{"class":2705},[414,82699,82700,82703,82705,82708],{"class":2593,"line":2625},[414,82701,82702],{"class":2601},"    'type'",[414,82704,7340],{"class":2705},[414,82706,82707],{"class":2601},"'BILL'",[414,82709,2757],{"class":2705},[414,82711,82712,82715,82717,82720],{"class":2593,"line":2677},[414,82713,82714],{"class":2601},"    'invoice_number'",[414,82716,7340],{"class":2705},[414,82718,82719],{"class":2601},"'BILL-001'",[414,82721,2757],{"class":2705},[414,82723,82724,82727,82729,82731],{"class":2593,"line":2751},[414,82725,82726],{"class":2601},"    'contact_id'",[414,82728,7340],{"class":2705},[414,82730,80164],{"class":2601},[414,82732,2757],{"class":2705},[414,82734,82735,82738,82740],{"class":2593,"line":2760},[414,82736,82737],{"class":2601},"    'total_amount'",[414,82739,7340],{"class":2705},[414,82741,82742],{"class":2607},"1000\n",[414,82744,82745],{"class":2593,"line":2768},[414,82746,3035],{"class":2705},[414,82748,82749],{"class":2593,"line":2776},[414,82750,2740],{"emptyLinePlaceholder":2459},[414,82752,82753],{"class":2593,"line":2784},[414,82754,77649],{"class":3527},[414,82756,82757,82759,82761,82763,82765],{"class":2593,"line":2792},[414,82758,45857],{"class":2607},[414,82760,11295],{"class":2698},[414,82762,82688],{"class":2705},[414,82764,23303],{"class":2698},[414,82766,82767],{"class":2705},"bill\n",[414,82769,82770],{"class":2593,"line":2804},[414,82771,8916],{"class":2705},[414,82773,82774,82777,82779,82781],{"class":2593,"line":2809},[414,82775,82776],{"class":2601},"    'bill_number'",[414,82778,7340],{"class":2705},[414,82780,82719],{"class":2601},[414,82782,2757],{"class":2705},[414,82784,82785,82787,82789,82791],{"class":2593,"line":2829},[414,82786,82726],{"class":2601},[414,82788,7340],{"class":2705},[414,82790,80164],{"class":2601},[414,82792,2757],{"class":2705},[414,82794,82795,82797,82799],{"class":2593,"line":2843},[414,82796,82737],{"class":2601},[414,82798,7340],{"class":2705},[414,82800,82742],{"class":2607},[414,82802,82803],{"class":2593,"line":2849},[414,82804,3035],{"class":2705},[19,82806],{},[3629,82808,82810,82813],{"id":82809},"iaccountingreport-use-individual-report-objects",[36,82811,82812],{},"IAccountingReport"," → Use Individual Report Objects",[22,82815,82816,82819],{},[31,82817,82818],{},"Status:"," Deprecated object",[2354,82821,82822],{},[2357,82823,82824,82825,82827],{},"Instead of using ",[36,82826,82812],{},", use the individual report objects directly",[22,82829,82830],{},[31,82831,78127],{},[2354,82833,82834],{},[2357,82835,82836,77938,82838],{},[36,82837,82812],{},[36,82839,80007],{},[22,82841,82842],{},[31,82843,82844],{},"Deprecated Object Structure:",[2584,82846,82848],{"className":2689,"code":82847,"language":2691,"meta":2433,"style":2433},"interface IAccountingReport {\n  type?: TAccountingReportType; \u002F\u002F Enum: TRIAL_BALANCE, BALANCE_SHEET, PROFIT_AND_LOSS  \n  ...\n}\n",[36,82849,82850,82859,82874,82878],{"__ignoreMap":2433},[414,82851,82852,82854,82857],{"class":2593,"line":2594},[414,82853,16879],{"class":2698},[414,82855,82856],{"class":2597}," IAccountingReport",[414,82858,2748],{"class":2705},[414,82860,82861,82864,82866,82869,82871],{"class":2593,"line":2434},[414,82862,82863],{"class":2971},"  type",[414,82865,16892],{"class":2698},[414,82867,82868],{"class":2597}," TAccountingReportType",[414,82870,3394],{"class":2705},[414,82872,82873],{"class":3527},"\u002F\u002F Enum: TRIAL_BALANCE, BALANCE_SHEET, PROFIT_AND_LOSS  \n",[414,82875,82876],{"class":2593,"line":2613},[414,82877,17361],{"class":2698},[414,82879,82880],{"class":2593,"line":2625},[414,82881,3035],{"class":2705},[22,82883,82884,82886],{},[31,82885,77551],{}," Use individual report objects directly",[22,82888,82889],{},[31,82890,82891],{},"Balance Sheet:",[2584,82893,82895],{"className":2689,"code":82894,"language":2691,"meta":2433,"style":2433},"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",[36,82896,82897,82906,82917,82938,82958,82979,83000,83010,83021,83032,83045,83056,83067,83078],{"__ignoreMap":2433},[414,82898,82899,82901,82904],{"class":2593,"line":2594},[414,82900,16879],{"class":2698},[414,82902,82903],{"class":2597}," IAccountingBalancesheet",[414,82905,2748],{"class":2705},[414,82907,82908,82910,82912,82914],{"class":2593,"line":2434},[414,82909,16889],{"class":2971},[414,82911,16892],{"class":2698},[414,82913,2977],{"class":2607},[414,82915,82916],{"class":2705},";  \n",[414,82918,82919,82921,82923,82925,82927,82929,82931,82933,82935],{"class":2593,"line":2613},[414,82920,16901],{"class":2971},[414,82922,16892],{"class":2698},[414,82924,3970],{"class":2705},[414,82926,9031],{"class":2607},[414,82928,3447],{"class":2698},[414,82930,16912],{"class":2597},[414,82932,3447],{"class":2698},[414,82934,3679],{"class":2607},[414,82936,82937],{"class":2705},");  \n",[414,82939,82940,82942,82944,82946,82948,82950,82952,82954,82956],{"class":2593,"line":2625},[414,82941,16923],{"class":2971},[414,82943,16892],{"class":2698},[414,82945,3970],{"class":2705},[414,82947,9031],{"class":2607},[414,82949,3447],{"class":2698},[414,82951,16912],{"class":2597},[414,82953,3447],{"class":2698},[414,82955,3679],{"class":2607},[414,82957,82937],{"class":2705},[414,82959,82960,82963,82965,82967,82969,82971,82973,82975,82977],{"class":2593,"line":2677},[414,82961,82962],{"class":2971},"  start_at",[414,82964,16892],{"class":2698},[414,82966,3970],{"class":2705},[414,82968,9031],{"class":2607},[414,82970,3447],{"class":2698},[414,82972,16912],{"class":2597},[414,82974,3447],{"class":2698},[414,82976,3679],{"class":2607},[414,82978,82937],{"class":2705},[414,82980,82981,82984,82986,82988,82990,82992,82994,82996,82998],{"class":2593,"line":2751},[414,82982,82983],{"class":2971},"  end_at",[414,82985,16892],{"class":2698},[414,82987,3970],{"class":2705},[414,82989,9031],{"class":2607},[414,82991,3447],{"class":2698},[414,82993,16912],{"class":2597},[414,82995,3447],{"class":2698},[414,82997,3679],{"class":2607},[414,82999,82937],{"class":2705},[414,83001,83002,83004,83006,83008],{"class":2593,"line":2760},[414,83003,16944],{"class":2971},[414,83005,16892],{"class":2698},[414,83007,2977],{"class":2607},[414,83009,82916],{"class":2705},[414,83011,83012,83015,83017,83019],{"class":2593,"line":2768},[414,83013,83014],{"class":2971},"  currency",[414,83016,16892],{"class":2698},[414,83018,2977],{"class":2607},[414,83020,82916],{"class":2705},[414,83022,83023,83026,83028,83030],{"class":2593,"line":2776},[414,83024,83025],{"class":2971},"  net_assets_amount",[414,83027,16892],{"class":2698},[414,83029,3679],{"class":2607},[414,83031,82916],{"class":2705},[414,83033,83034,83037,83039,83042],{"class":2593,"line":2784},[414,83035,83036],{"class":2971},"  assets",[414,83038,16892],{"class":2698},[414,83040,83041],{"class":2597}," IAccountingBalancesheetItem",[414,83043,83044],{"class":2705},"[];  \n",[414,83046,83047,83050,83052,83054],{"class":2593,"line":2792},[414,83048,83049],{"class":2971},"  liabilities",[414,83051,16892],{"class":2698},[414,83053,83041],{"class":2597},[414,83055,83044],{"class":2705},[414,83057,83058,83061,83063,83065],{"class":2593,"line":2804},[414,83059,83060],{"class":2971},"  equity",[414,83062,16892],{"class":2698},[414,83064,83041],{"class":2597},[414,83066,83044],{"class":2705},[414,83068,83069,83072,83074,83076],{"class":2593,"line":2809},[414,83070,83071],{"class":2971},"  raw",[414,83073,16892],{"class":2698},[414,83075,17305],{"class":2607},[414,83077,2706],{"class":2705},[414,83079,83080],{"class":2593,"line":2829},[414,83081,3035],{"class":2705},[22,83083,83084],{},[31,83085,83086],{},"Profit and Loss:",[2584,83088,83090],{"className":2689,"code":83089,"language":2691,"meta":2433,"style":2433},"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",[36,83091,83092,83101,83111,83131,83151,83162,83182,83202,83212,83222,83233,83244,83255,83266,83277,83288,83299,83309],{"__ignoreMap":2433},[414,83093,83094,83096,83099],{"class":2593,"line":2594},[414,83095,16879],{"class":2698},[414,83097,83098],{"class":2597}," IAccountingProfitloss",[414,83100,2748],{"class":2705},[414,83102,83103,83105,83107,83109],{"class":2593,"line":2434},[414,83104,16889],{"class":2971},[414,83106,16892],{"class":2698},[414,83108,2977],{"class":2607},[414,83110,82916],{"class":2705},[414,83112,83113,83115,83117,83119,83121,83123,83125,83127,83129],{"class":2593,"line":2613},[414,83114,16901],{"class":2971},[414,83116,16892],{"class":2698},[414,83118,3970],{"class":2705},[414,83120,9031],{"class":2607},[414,83122,3447],{"class":2698},[414,83124,16912],{"class":2597},[414,83126,3447],{"class":2698},[414,83128,3679],{"class":2607},[414,83130,82937],{"class":2705},[414,83132,83133,83135,83137,83139,83141,83143,83145,83147,83149],{"class":2593,"line":2625},[414,83134,16923],{"class":2971},[414,83136,16892],{"class":2698},[414,83138,3970],{"class":2705},[414,83140,9031],{"class":2607},[414,83142,3447],{"class":2698},[414,83144,16912],{"class":2597},[414,83146,3447],{"class":2698},[414,83148,3679],{"class":2607},[414,83150,82937],{"class":2705},[414,83152,83153,83156,83158,83160],{"class":2593,"line":2677},[414,83154,83155],{"class":2971},"  category_ids",[414,83157,16892],{"class":2698},[414,83159,2977],{"class":2607},[414,83161,83044],{"class":2705},[414,83163,83164,83166,83168,83170,83172,83174,83176,83178,83180],{"class":2593,"line":2751},[414,83165,82962],{"class":2971},[414,83167,16892],{"class":2698},[414,83169,3970],{"class":2705},[414,83171,9031],{"class":2607},[414,83173,3447],{"class":2698},[414,83175,16912],{"class":2597},[414,83177,3447],{"class":2698},[414,83179,3679],{"class":2607},[414,83181,82937],{"class":2705},[414,83183,83184,83186,83188,83190,83192,83194,83196,83198,83200],{"class":2593,"line":2760},[414,83185,82983],{"class":2971},[414,83187,16892],{"class":2698},[414,83189,3970],{"class":2705},[414,83191,9031],{"class":2607},[414,83193,3447],{"class":2698},[414,83195,16912],{"class":2597},[414,83197,3447],{"class":2698},[414,83199,3679],{"class":2607},[414,83201,82937],{"class":2705},[414,83203,83204,83206,83208,83210],{"class":2593,"line":2768},[414,83205,16944],{"class":2971},[414,83207,16892],{"class":2698},[414,83209,2977],{"class":2607},[414,83211,82916],{"class":2705},[414,83213,83214,83216,83218,83220],{"class":2593,"line":2776},[414,83215,83014],{"class":2971},[414,83217,16892],{"class":2698},[414,83219,2977],{"class":2607},[414,83221,82916],{"class":2705},[414,83223,83224,83227,83229,83231],{"class":2593,"line":2784},[414,83225,83226],{"class":2971},"  income_sections",[414,83228,16892],{"class":2698},[414,83230,81320],{"class":2597},[414,83232,83044],{"class":2705},[414,83234,83235,83238,83240,83242],{"class":2593,"line":2792},[414,83236,83237],{"class":2971},"  expenses_sections",[414,83239,16892],{"class":2698},[414,83241,81320],{"class":2597},[414,83243,83044],{"class":2705},[414,83245,83246,83249,83251,83253],{"class":2593,"line":2804},[414,83247,83248],{"class":2971},"  cost_of_goods_sold_sections",[414,83250,16892],{"class":2698},[414,83252,81320],{"class":2597},[414,83254,83044],{"class":2705},[414,83256,83257,83260,83262,83264],{"class":2593,"line":2809},[414,83258,83259],{"class":2971},"  income_total_amount",[414,83261,16892],{"class":2698},[414,83263,3679],{"class":2607},[414,83265,82916],{"class":2705},[414,83267,83268,83271,83273,83275],{"class":2593,"line":2829},[414,83269,83270],{"class":2971},"  net_income_amount",[414,83272,16892],{"class":2698},[414,83274,3679],{"class":2607},[414,83276,82916],{"class":2705},[414,83278,83279,83282,83284,83286],{"class":2593,"line":2843},[414,83280,83281],{"class":2971},"  expenses_total_amount",[414,83283,16892],{"class":2698},[414,83285,3679],{"class":2607},[414,83287,82916],{"class":2705},[414,83289,83290,83293,83295,83297],{"class":2593,"line":2849},[414,83291,83292],{"class":2971},"  cost_of_goods_sold_total_amount",[414,83294,16892],{"class":2698},[414,83296,3679],{"class":2607},[414,83298,82916],{"class":2705},[414,83300,83301,83303,83305,83307],{"class":2593,"line":2854},[414,83302,83071],{"class":2971},[414,83304,16892],{"class":2698},[414,83306,17305],{"class":2607},[414,83308,2706],{"class":2705},[414,83310,83311],{"class":2593,"line":2880},[414,83312,3035],{"class":2705},[22,83314,83315],{},[31,83316,83317],{},"Trial Balance:",[2584,83319,83321],{"className":2689,"code":83320,"language":2691,"meta":2433,"style":2433},"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",[36,83322,83323,83332,83342,83362,83382,83402,83412,83422,83442,83453,83464,83476,83486],{"__ignoreMap":2433},[414,83324,83325,83327,83330],{"class":2593,"line":2594},[414,83326,16879],{"class":2698},[414,83328,83329],{"class":2597}," IAccountingTrialbalance",[414,83331,2748],{"class":2705},[414,83333,83334,83336,83338,83340],{"class":2593,"line":2434},[414,83335,16889],{"class":2971},[414,83337,16892],{"class":2698},[414,83339,2977],{"class":2607},[414,83341,82916],{"class":2705},[414,83343,83344,83346,83348,83350,83352,83354,83356,83358,83360],{"class":2593,"line":2613},[414,83345,16901],{"class":2971},[414,83347,16892],{"class":2698},[414,83349,3970],{"class":2705},[414,83351,9031],{"class":2607},[414,83353,3447],{"class":2698},[414,83355,16912],{"class":2597},[414,83357,3447],{"class":2698},[414,83359,3679],{"class":2607},[414,83361,82937],{"class":2705},[414,83363,83364,83366,83368,83370,83372,83374,83376,83378,83380],{"class":2593,"line":2625},[414,83365,16923],{"class":2971},[414,83367,16892],{"class":2698},[414,83369,3970],{"class":2705},[414,83371,9031],{"class":2607},[414,83373,3447],{"class":2698},[414,83375,16912],{"class":2597},[414,83377,3447],{"class":2698},[414,83379,3679],{"class":2607},[414,83381,82937],{"class":2705},[414,83383,83384,83386,83388,83390,83392,83394,83396,83398,83400],{"class":2593,"line":2677},[414,83385,82962],{"class":2971},[414,83387,16892],{"class":2698},[414,83389,3970],{"class":2705},[414,83391,9031],{"class":2607},[414,83393,3447],{"class":2698},[414,83395,16912],{"class":2597},[414,83397,3447],{"class":2698},[414,83399,3679],{"class":2607},[414,83401,82937],{"class":2705},[414,83403,83404,83406,83408,83410],{"class":2593,"line":2751},[414,83405,16944],{"class":2971},[414,83407,16892],{"class":2698},[414,83409,2977],{"class":2607},[414,83411,82916],{"class":2705},[414,83413,83414,83416,83418,83420],{"class":2593,"line":2760},[414,83415,83014],{"class":2971},[414,83417,16892],{"class":2698},[414,83419,2977],{"class":2607},[414,83421,82916],{"class":2705},[414,83423,83424,83426,83428,83430,83432,83434,83436,83438,83440],{"class":2593,"line":2768},[414,83425,82983],{"class":2971},[414,83427,16892],{"class":2698},[414,83429,3970],{"class":2705},[414,83431,9031],{"class":2607},[414,83433,3447],{"class":2698},[414,83435,16912],{"class":2597},[414,83437,3447],{"class":2698},[414,83439,3679],{"class":2607},[414,83441,82937],{"class":2705},[414,83443,83444,83447,83449,83451],{"class":2593,"line":2776},[414,83445,83446],{"class":2971},"  total_debit_amount",[414,83448,16892],{"class":2698},[414,83450,3679],{"class":2607},[414,83452,82916],{"class":2705},[414,83454,83455,83458,83460,83462],{"class":2593,"line":2784},[414,83456,83457],{"class":2971},"  total_credit_amount",[414,83459,16892],{"class":2698},[414,83461,3679],{"class":2607},[414,83463,82916],{"class":2705},[414,83465,83466,83469,83471,83474],{"class":2593,"line":2792},[414,83467,83468],{"class":2971},"  sub_items",[414,83470,16892],{"class":2698},[414,83472,83473],{"class":2597}," IAccountingTrialbalanceSubItem",[414,83475,83044],{"class":2705},[414,83477,83478,83480,83482,83484],{"class":2593,"line":2804},[414,83479,83071],{"class":2971},[414,83481,16892],{"class":2698},[414,83483,17305],{"class":2607},[414,83485,2706],{"class":2705},[414,83487,83488],{"class":2593,"line":2809},[414,83489,3035],{"class":2705},[22,83491,83492],{},[31,83493,83494],{},"Cash Flow:",[2584,83496,83498],{"className":2689,"code":83497,"language":2691,"meta":2433,"style":2433},"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; \u002F\u002F e.g. \"Cash Flow Statement Q1 2020\"  \n  currency?: string; \u002F\u002F ISO 4217, e.g. \"USD\"  \n  cash_beginning_amount?: number; \u002F\u002F Cash at beginning of period  \n  cash_ending_amount?: number; \u002F\u002F Cash at end of period  \n  net_change_in_cash_amount?: number; \u002F\u002F 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; \u002F\u002F e.g. \"Operating Activities\"  \n  total_amount?: number; \u002F\u002F Net cash provided\u002Fused by this section  \n  items?: IAccountingCashflowItem[];\n}\n\ninterface IAccountingCashflowItem {\n  account_id?: string; \u002F\u002F If attributable to a specific GL account  \n  name?: string; \u002F\u002F e.g. \"Net Income\", \"Depreciation\", \"Equipment\"  \n  amount?: number; \u002F\u002F Positive = inflow, Negative = outflow  \n  transaction_ids?: string[]; \u002F\u002F Optional linkage to transactions  \n  sub_items?: IAccountingCashflowItem[];\n}\n",[36,83499,83500,83509,83519,83539,83559,83579,83599,83609,83632,83645,83659,83673,83687,83699,83710,83730,83734,83738,83746,83760,83774,83786,83790,83794,83802,83816,83829,83843,83857,83867],{"__ignoreMap":2433},[414,83501,83502,83504,83507],{"class":2593,"line":2594},[414,83503,16879],{"class":2698},[414,83505,83506],{"class":2597}," IAccountingCashflow",[414,83508,2748],{"class":2705},[414,83510,83511,83513,83515,83517],{"class":2593,"line":2434},[414,83512,16889],{"class":2971},[414,83514,16892],{"class":2698},[414,83516,2977],{"class":2607},[414,83518,82916],{"class":2705},[414,83520,83521,83523,83525,83527,83529,83531,83533,83535,83537],{"class":2593,"line":2613},[414,83522,16901],{"class":2971},[414,83524,16892],{"class":2698},[414,83526,3970],{"class":2705},[414,83528,9031],{"class":2607},[414,83530,3447],{"class":2698},[414,83532,16912],{"class":2597},[414,83534,3447],{"class":2698},[414,83536,3679],{"class":2607},[414,83538,82937],{"class":2705},[414,83540,83541,83543,83545,83547,83549,83551,83553,83555,83557],{"class":2593,"line":2625},[414,83542,16923],{"class":2971},[414,83544,16892],{"class":2698},[414,83546,3970],{"class":2705},[414,83548,9031],{"class":2607},[414,83550,3447],{"class":2698},[414,83552,16912],{"class":2597},[414,83554,3447],{"class":2698},[414,83556,3679],{"class":2607},[414,83558,82937],{"class":2705},[414,83560,83561,83563,83565,83567,83569,83571,83573,83575,83577],{"class":2593,"line":2677},[414,83562,82962],{"class":2971},[414,83564,16892],{"class":2698},[414,83566,3970],{"class":2705},[414,83568,9031],{"class":2607},[414,83570,3447],{"class":2698},[414,83572,16912],{"class":2597},[414,83574,3447],{"class":2698},[414,83576,3679],{"class":2607},[414,83578,82937],{"class":2705},[414,83580,83581,83583,83585,83587,83589,83591,83593,83595,83597],{"class":2593,"line":2751},[414,83582,82983],{"class":2971},[414,83584,16892],{"class":2698},[414,83586,3970],{"class":2705},[414,83588,9031],{"class":2607},[414,83590,3447],{"class":2698},[414,83592,16912],{"class":2597},[414,83594,3447],{"class":2698},[414,83596,3679],{"class":2607},[414,83598,82937],{"class":2705},[414,83600,83601,83603,83605,83607],{"class":2593,"line":2760},[414,83602,83155],{"class":2971},[414,83604,16892],{"class":2698},[414,83606,2977],{"class":2607},[414,83608,83044],{"class":2705},[414,83610,83611,83614,83616,83618,83621,83623,83625,83627,83629],{"class":2593,"line":2768},[414,83612,83613],{"class":2971},"  contact_id",[414,83615,16892],{"class":2698},[414,83617,2977],{"class":2607},[414,83619,83620],{"class":2705},";  ",[414,83622,9043],{"class":2971},[414,83624,16892],{"class":2698},[414,83626,2977],{"class":2607},[414,83628,3394],{"class":2705},[414,83630,83631],{"class":3527},"\u002F\u002F e.g. \"Cash Flow Statement Q1 2020\"  \n",[414,83633,83634,83636,83638,83640,83642],{"class":2593,"line":2776},[414,83635,83014],{"class":2971},[414,83637,16892],{"class":2698},[414,83639,2977],{"class":2607},[414,83641,3394],{"class":2705},[414,83643,83644],{"class":3527},"\u002F\u002F ISO 4217, e.g. \"USD\"  \n",[414,83646,83647,83650,83652,83654,83656],{"class":2593,"line":2784},[414,83648,83649],{"class":2971},"  cash_beginning_amount",[414,83651,16892],{"class":2698},[414,83653,3679],{"class":2607},[414,83655,3394],{"class":2705},[414,83657,83658],{"class":3527},"\u002F\u002F Cash at beginning of period  \n",[414,83660,83661,83664,83666,83668,83670],{"class":2593,"line":2792},[414,83662,83663],{"class":2971},"  cash_ending_amount",[414,83665,16892],{"class":2698},[414,83667,3679],{"class":2607},[414,83669,3394],{"class":2705},[414,83671,83672],{"class":3527},"\u002F\u002F Cash at end of period  \n",[414,83674,83675,83678,83680,83682,83684],{"class":2593,"line":2804},[414,83676,83677],{"class":2971},"  net_change_in_cash_amount",[414,83679,16892],{"class":2698},[414,83681,3679],{"class":2607},[414,83683,3394],{"class":2705},[414,83685,83686],{"class":3527},"\u002F\u002F Usually ending - beginning  \n",[414,83688,83689,83692,83694,83697],{"class":2593,"line":2809},[414,83690,83691],{"class":2971},"  operating_sections",[414,83693,16892],{"class":2698},[414,83695,83696],{"class":2597}," IAccountingCashflowSection",[414,83698,83044],{"class":2705},[414,83700,83701,83704,83706,83708],{"class":2593,"line":2829},[414,83702,83703],{"class":2971},"  investing_sections",[414,83705,16892],{"class":2698},[414,83707,83696],{"class":2597},[414,83709,83044],{"class":2705},[414,83711,83712,83715,83717,83719,83722,83724,83726,83728],{"class":2593,"line":2843},[414,83713,83714],{"class":2971},"  financing_sections",[414,83716,16892],{"class":2698},[414,83718,83696],{"class":2597},[414,83720,83721],{"class":2705},"[];  ",[414,83723,96],{"class":2971},[414,83725,16892],{"class":2698},[414,83727,17305],{"class":2607},[414,83729,2706],{"class":2705},[414,83731,83732],{"class":2593,"line":2849},[414,83733,3035],{"class":2705},[414,83735,83736],{"class":2593,"line":2854},[414,83737,2740],{"emptyLinePlaceholder":2459},[414,83739,83740,83742,83744],{"class":2593,"line":2880},[414,83741,16879],{"class":2698},[414,83743,83696],{"class":2597},[414,83745,2748],{"class":2705},[414,83747,83748,83751,83753,83755,83757],{"class":2593,"line":3253},[414,83749,83750],{"class":2971},"  section_name",[414,83752,16892],{"class":2698},[414,83754,2977],{"class":2607},[414,83756,3394],{"class":2705},[414,83758,83759],{"class":3527},"\u002F\u002F e.g. \"Operating Activities\"  \n",[414,83761,83762,83765,83767,83769,83771],{"class":2593,"line":3261},[414,83763,83764],{"class":2971},"  total_amount",[414,83766,16892],{"class":2698},[414,83768,3679],{"class":2607},[414,83770,3394],{"class":2705},[414,83772,83773],{"class":3527},"\u002F\u002F Net cash provided\u002Fused by this section  \n",[414,83775,83776,83779,83781,83784],{"class":2593,"line":3279},[414,83777,83778],{"class":2971},"  items",[414,83780,16892],{"class":2698},[414,83782,83783],{"class":2597}," IAccountingCashflowItem",[414,83785,17001],{"class":2705},[414,83787,83788],{"class":2593,"line":3313},[414,83789,3035],{"class":2705},[414,83791,83792],{"class":2593,"line":3326},[414,83793,2740],{"emptyLinePlaceholder":2459},[414,83795,83796,83798,83800],{"class":2593,"line":3339},[414,83797,16879],{"class":2698},[414,83799,83783],{"class":2597},[414,83801,2748],{"class":2705},[414,83803,83804,83807,83809,83811,83813],{"class":2593,"line":3359},[414,83805,83806],{"class":2971},"  account_id",[414,83808,16892],{"class":2698},[414,83810,2977],{"class":2607},[414,83812,3394],{"class":2705},[414,83814,83815],{"class":3527},"\u002F\u002F If attributable to a specific GL account  \n",[414,83817,83818,83820,83822,83824,83826],{"class":2593,"line":6453},[414,83819,16944],{"class":2971},[414,83821,16892],{"class":2698},[414,83823,2977],{"class":2607},[414,83825,3394],{"class":2705},[414,83827,83828],{"class":3527},"\u002F\u002F e.g. \"Net Income\", \"Depreciation\", \"Equipment\"  \n",[414,83830,83831,83834,83836,83838,83840],{"class":2593,"line":6459},[414,83832,83833],{"class":2971},"  amount",[414,83835,16892],{"class":2698},[414,83837,3679],{"class":2607},[414,83839,3394],{"class":2705},[414,83841,83842],{"class":3527},"\u002F\u002F Positive = inflow, Negative = outflow  \n",[414,83844,83845,83848,83850,83852,83854],{"class":2593,"line":6465},[414,83846,83847],{"class":2971},"  transaction_ids",[414,83849,16892],{"class":2698},[414,83851,2977],{"class":2607},[414,83853,25593],{"class":2705},[414,83855,83856],{"class":3527},"\u002F\u002F Optional linkage to transactions  \n",[414,83858,83859,83861,83863,83865],{"class":2593,"line":6471},[414,83860,83468],{"class":2971},[414,83862,16892],{"class":2698},[414,83864,83783],{"class":2597},[414,83866,17001],{"class":2705},[414,83868,83869],{"class":2593,"line":6477},[414,83870,3035],{"class":2705},[22,83872,83873],{},[31,83874,77572],{},[2354,83876,83877,83886,83895,83904,83912,83918,83923],{},[2357,83878,83879,83881,83882,83885],{},[31,83880,77579],{}," Instead of using ",[36,83883,83884],{},"accounting_report"," endpoints, use the specific report endpoints",[2357,83887,82654,83888,83891,83892],{},[36,83889,83890],{},"GET \u002Faccounting\u002Freport?type=BALANCE_SHEET",".  ✅ Use: ",[36,83893,83894],{},"GET \u002Faccounting\u002Fbalancesheet",[2357,83896,82654,83897,83900,83901],{},[36,83898,83899],{},"GET \u002Faccounting\u002Freport?type=PROFIT_AND_LOSS",". ✅ Use: ",[36,83902,83903],{},"GET \u002Faccounting\u002Fprofitloss",[2357,83905,82654,83906,83900,83909],{},[36,83907,83908],{},"GET \u002Faccounting\u002Freport?type=TRIAL_BALANCE",[36,83910,83911],{},"GET \u002Faccounting\u002Ftrialbalance",[2357,83913,82663,83914,83917],{},[36,83915,83916],{},"GET \u002Faccounting\u002Fcashflow"," (Cash flow was never part of the deprecated report object, but should be accessed directly)",[2357,83919,83920,83922],{},[31,83921,77591],{}," Create individual report objects directly instead of wrapping them in a report object",[2357,83924,83925,83928,83929,319,83932,11260],{},[31,83926,83927],{},"Field Access:"," Access report data directly from the individual objects instead of through ",[36,83930,83931],{},"report.balance_sheet",[36,83933,83934],{},"report.profit_and_loss",[22,83936,83937],{},[31,83938,17183],{},[2584,83940,83942],{"className":2689,"code":83941,"language":2691,"meta":2433,"style":2433},"\u002F\u002F 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\u002F\u002F After\nconst balanceSheet = await getAccountingBalancesheet({\n  start_at: '2024-01-01',  \n  end_at: '2024-12-31'\n});\nconst assets = balanceSheet.assets;\n",[36,83943,83944,83948,83964,83974,83983,83991,83995,84007,84011,84015,84031,84039,84045,84049],{"__ignoreMap":2433},[414,83945,83946],{"class":2593,"line":2594},[414,83947,77611],{"class":3527},[414,83949,83950,83952,83955,83957,83959,83962],{"class":2593,"line":2434},[414,83951,2745],{"class":2698},[414,83953,83954],{"class":2607}," report",[414,83956,2817],{"class":2698},[414,83958,3002],{"class":2698},[414,83960,83961],{"class":2597}," getAccountingReport",[414,83963,2826],{"class":2705},[414,83965,83966,83969,83972],{"class":2593,"line":2613},[414,83967,83968],{"class":2705},"  type: ",[414,83970,83971],{"class":2601},"'BALANCE_SHEET'",[414,83973,7346],{"class":2705},[414,83975,83976,83979,83981],{"class":2593,"line":2625},[414,83977,83978],{"class":2705},"  start_at: ",[414,83980,80326],{"class":2601},[414,83982,7346],{"class":2705},[414,83984,83985,83988],{"class":2593,"line":2677},[414,83986,83987],{"class":2705},"  end_at: ",[414,83989,83990],{"class":2601},"'2024-12-31'\n",[414,83992,83993],{"class":2593,"line":2751},[414,83994,2846],{"class":2705},[414,83996,83997,83999,84002,84004],{"class":2593,"line":2760},[414,83998,2745],{"class":2698},[414,84000,84001],{"class":2607}," assets",[414,84003,2817],{"class":2698},[414,84005,84006],{"class":2705}," report.balance_sheet?.assets;\n",[414,84008,84009],{"class":2593,"line":2768},[414,84010,2740],{"emptyLinePlaceholder":2459},[414,84012,84013],{"class":2593,"line":2776},[414,84014,77649],{"class":3527},[414,84016,84017,84019,84022,84024,84026,84029],{"class":2593,"line":2784},[414,84018,2745],{"class":2698},[414,84020,84021],{"class":2607}," balanceSheet",[414,84023,2817],{"class":2698},[414,84025,3002],{"class":2698},[414,84027,84028],{"class":2597}," getAccountingBalancesheet",[414,84030,2826],{"class":2705},[414,84032,84033,84035,84037],{"class":2593,"line":2792},[414,84034,83978],{"class":2705},[414,84036,80326],{"class":2601},[414,84038,7346],{"class":2705},[414,84040,84041,84043],{"class":2593,"line":2804},[414,84042,83987],{"class":2705},[414,84044,83990],{"class":2601},[414,84046,84047],{"class":2593,"line":2809},[414,84048,2846],{"class":2705},[414,84050,84051,84053,84055,84057],{"class":2593,"line":2829},[414,84052,2745],{"class":2698},[414,84054,84001],{"class":2607},[414,84056,2817],{"class":2698},[414,84058,84059],{"class":2705}," balanceSheet.assets;\n",[22,84061,84062],{},[31,84063,84064],{},"Benefits of Using Individual Objects:",[2354,84066,84067,84073,84079,84085],{},[2357,84068,84069,84072],{},[31,84070,84071],{},"Simpler API:"," Each report type has its own dedicated endpoint",[2357,84074,84075,84078],{},[31,84076,84077],{},"Better Type Safety:"," TypeScript can better infer types for specific report objects",[2357,84080,84081,84084],{},[31,84082,84083],{},"Clearer Intent:"," Code is more explicit about which report type is being accessed",[2357,84086,84087,84090],{},[31,84088,84089],{},"Easier Maintenance:"," Individual objects are easier to extend and modify independently",[19,84092],{},[55,84094,77441],{"id":84095},"deprecated-typesinterfaces",[3629,84097,84099,741,84101],{"id":84098},"iaccountingprofitlosscategory-and-iaccountingprofitlosssubcategory",[36,84100,81199],{},[36,84102,81202],{},[22,84104,84105,84107,84108],{},[31,84106,82818],{}," Deprecated types - These interfaces are deprecated in favor of ",[36,84109,81230],{},[22,84111,84112],{},[31,84113,84114],{},"Affected Files:",[2354,84116,84117,84121,84130],{},[2357,84118,84119],{},[36,84120,80007],{},[2357,84122,84123,84126,84127,2980],{},[36,84124,84125],{},"src\u002Fmodels\u002FUnifiedAccounting.joi.ts"," (marked as ",[36,84128,84129],{},"@deprecated",[2357,84131,84132],{},[36,84133,84134],{},"src\u002Fmodels\u002FUnifiedAccounting.proto",[22,84136,84137],{},[31,84138,81208],{},[2584,84140,84142],{"className":2689,"code":84141,"language":2691,"meta":2433,"style":2433},"interface IAccountingProfitlossCategory {\n  name?: string;  amount?: number;  sub_items?: IAccountingProfitlossSubcategory[];}\ninterface IAccountingProfitlossSubcategory {\n  name?: string;  amount?: number;  transaction_ids?: string[];}\n",[36,84143,84144,84152,84181,84189],{"__ignoreMap":2433},[414,84145,84146,84148,84150],{"class":2593,"line":2594},[414,84147,16879],{"class":2698},[414,84149,81288],{"class":2597},[414,84151,2748],{"class":2705},[414,84153,84154,84156,84158,84160,84162,84164,84166,84168,84170,84173,84175,84178],{"class":2593,"line":2434},[414,84155,16944],{"class":2971},[414,84157,16892],{"class":2698},[414,84159,2977],{"class":2607},[414,84161,83620],{"class":2705},[414,84163,31646],{"class":2971},[414,84165,16892],{"class":2698},[414,84167,3679],{"class":2607},[414,84169,83620],{"class":2705},[414,84171,84172],{"class":2971},"sub_items",[414,84174,16892],{"class":2698},[414,84176,84177],{"class":2597}," IAccountingProfitlossSubcategory",[414,84179,84180],{"class":2705},"[];}\n",[414,84182,84183,84185,84187],{"class":2593,"line":2613},[414,84184,16879],{"class":2698},[414,84186,84177],{"class":2597},[414,84188,2748],{"class":2705},[414,84190,84191,84193,84195,84197,84199,84201,84203,84205,84207,84210,84212,84214],{"class":2593,"line":2625},[414,84192,16944],{"class":2971},[414,84194,16892],{"class":2698},[414,84196,2977],{"class":2607},[414,84198,83620],{"class":2705},[414,84200,31646],{"class":2971},[414,84202,16892],{"class":2698},[414,84204,3679],{"class":2607},[414,84206,83620],{"class":2705},[414,84208,84209],{"class":2971},"transaction_ids",[414,84211,16892],{"class":2698},[414,84213,2977],{"class":2607},[414,84215,84180],{"class":2705},[22,84217,84218],{},[31,84219,77551],{},[2584,84221,84223],{"className":2689,"code":84222,"language":2691,"meta":2433,"style":2433},"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",[36,84224,84225,84233,84272,84280],{"__ignoreMap":2433},[414,84226,84227,84229,84231],{"class":2593,"line":2594},[414,84228,16879],{"class":2698},[414,84230,81320],{"class":2597},[414,84232,2748],{"class":2705},[414,84234,84235,84238,84240,84242,84244,84247,84249,84251,84253,84256,84258,84260,84262,84265,84267,84270],{"class":2593,"line":2434},[414,84236,84237],{"class":2971},"  section_type",[414,84239,16892],{"class":2698},[414,84241,2977],{"class":2607},[414,84243,83620],{"class":2705},[414,84245,84246],{"class":2971},"section_name",[414,84248,16892],{"class":2698},[414,84250,2977],{"class":2607},[414,84252,83620],{"class":2705},[414,84254,84255],{"class":2971},"total_amount",[414,84257,16892],{"class":2698},[414,84259,3679],{"class":2607},[414,84261,83620],{"class":2705},[414,84263,84264],{"class":2971},"accounts",[414,84266,16892],{"class":2698},[414,84268,84269],{"class":2597}," IAccountingProfitlossAccount",[414,84271,84180],{"class":2705},[414,84273,84274,84276,84278],{"class":2593,"line":2613},[414,84275,16879],{"class":2698},[414,84277,84269],{"class":2597},[414,84279,2748],{"class":2705},[414,84281,84282,84284,84286,84288,84290,84293,84295,84297,84299,84301,84303,84305,84307,84309,84311,84313],{"class":2593,"line":2625},[414,84283,83806],{"class":2971},[414,84285,16892],{"class":2698},[414,84287,2977],{"class":2607},[414,84289,83620],{"class":2705},[414,84291,84292],{"class":2971},"account_name",[414,84294,16892],{"class":2698},[414,84296,2977],{"class":2607},[414,84298,83620],{"class":2705},[414,84300,84255],{"class":2971},[414,84302,16892],{"class":2698},[414,84304,3679],{"class":2607},[414,84306,83620],{"class":2705},[414,84308,84209],{"class":2971},[414,84310,16892],{"class":2698},[414,84312,2977],{"class":2607},[414,84314,84180],{"class":2705},[22,84316,84317],{},[31,84318,77572],{},[2354,84320,84321,84326,84329],{},[2357,84322,84323,84324],{},"Update TypeScript type definitions to use ",[36,84325,81230],{},[2357,84327,84328],{},"Update code that creates or manipulates profit\u002Floss categories to use sections instead",[2357,84330,84331],{},"The new structure provides better organization with accounts grouped under sections",[19,84333],{},[55,84335,84337],{"id":84336},"summary-by-category","Summary by Category",[155,84339,84340,84352],{},[158,84341,84342],{},[161,84343,84344,84346,84349],{},[164,84345,23364],{},[164,84347,84348],{},"Deprecated Fields Count",[164,84350,84351],{},"Primary Changes",[174,84353,84354,84371,84387,84405,84425,84435,84451,84463,84473,84485,84504,84521],{},[161,84355,84356,84358,84360],{},[179,84357,5842],{},[179,84359,39125],{},[179,84361,84362,20790,84364,319,84366,20790,84368,84370],{},[36,84363,77453],{},[36,84365,17412],{},[36,84367,3397],{},[36,84369,17098],{}," (affects 6 models)",[161,84372,84373,84376,84379],{},[179,84374,84375],{},"Parent\u002FRelationship",[179,84377,84378],{},"4",[179,84380,84381,84382,20790,84385],{},"Various ",[36,84383,84384],{},"parent_*_id",[36,84386,54970],{},[161,84388,84389,84391,84393],{},[179,84390,44410],{},[179,84392,35871],{},[179,84394,84395,319,84397,319,84399,20790,84401,23303,84403],{},[36,84396,78612],{},[36,84398,78829],{},[36,84400,79015],{},[36,84402,78615],{},[36,84404,79018],{},[161,84406,84407,84409,84411],{},[179,84408,23751],{},[179,84410,84378],{},[179,84412,84413,319,84415,319,84417,319,84419,20790,84421,23303,84423],{},[36,84414,63783],{},[36,84416,79287],{},[36,84418,78445],{},[36,84420,79502],{},[36,84422,79281],{},[36,84424,54970],{},[161,84426,84427,84429,84432],{},[179,84428,5829],{},[179,84430,84431],{},"8",[179,84433,84434],{},"Multiple field replacements and structural changes",[161,84436,84437,84439,84441],{},[179,84438,21821],{},[179,84440,39125],{},[179,84442,84443,20790,84445,319,84447,20790,84449],{},[36,84444,81337],{},[36,84446,81340],{},[36,84448,81519],{},[36,84450,78615],{},[161,84452,84453,84455,84457],{},[179,84454,23886],{},[179,84456,15737],{},[179,84458,84459,20790,84461],{},[36,84460,81751],{},[36,84462,81754],{},[161,84464,84465,84468,84470],{},[179,84466,84467],{},"Query Parameters",[179,84469,35871],{},[179,84471,84472],{},"Date filter and expand parameter updates",[161,84474,84475,84477,84479],{},[179,84476,46006],{},[179,84478,15737],{},[179,84480,84481,20790,84483],{},[36,84482,22218],{},[36,84484,45956],{},[161,84486,84487,84492,84496],{},[179,84488,84489],{},[31,84490,84491],{},"Deprecated Objects",[179,84493,84494],{},[31,84495,39125],{},[179,84497,84498,27087,84500,319,84502],{},[36,84499,79745],{},[36,84501,82606],{},[36,84503,82812],{},[161,84505,84506,84511,84515],{},[179,84507,84508],{},[31,84509,84510],{},"Deprecated Types",[179,84512,84513],{},[31,84514,39125],{},[179,84516,84517,319,84519],{},[36,84518,81199],{},[36,84520,81202],{},[161,84522,84523,84528,84530],{},[179,84524,84525],{},[31,84526,84527],{},"Total Deprecated Fields:",[179,84529],{},[179,84531],{},[2354,84533,84534,84537,84540],{},[2357,84535,84536],{},"27 unique fields",[2357,84538,84539],{},"2 deprecated objects",[2357,84541,84542],{},"2 deprecated types across all categories",[19,84544],{},[55,84546,84548],{"id":84547},"general-migration-guidelines","General Migration Guidelines",[3629,84550,84552,84553],{"id":84551},"_1-backward-compatibility","1. ",[31,84554,84555],{},"Backward Compatibility",[2354,84557,84558,84563],{},[2357,84559,84560,84561],{},"Deprecated fields will still be supported until  ",[36,84562,77397],{},[2357,84564,84565],{},"Plan to migrate as soon as possible to avoid breaking changes in future API versions",[3629,84567,84569,84570],{"id":84568},"_2-testing","2. ",[31,84571,84572],{},"Testing",[2354,84574,84575,84578],{},[2357,84576,84577],{},"Test all migrations thoroughly in a development environment",[2357,84579,84580],{},"Verify that data reads and writes work correctly with the new fields",[3629,84582,84584,84585],{"id":84583},"_3-data-migration","3. ",[31,84586,84587],{},"Data Migration",[2354,84589,84590],{},[2357,84591,84592,84593],{},"For existing data using deprecated fields, consider:\n",[2354,84594,84595,84598,84601],{},[2357,84596,84597],{},"Running a one-time migration script to populate new fields from old fields",[2357,84599,84600],{},"Updating your application code to read from both old and new fields during transition",[2357,84602,84603],{},"Gradually migrating writes to use only new fields",[3629,84605,84607],{"id":84606},"_4-documentation",[31,84608,84609],{},"4. Documentation",[2354,84611,84612,84615,84618],{},[2357,84613,84614],{},"Update your internal documentation and code comments",[2357,84616,84617],{},"Notify your team about these changes",[2357,84619,84620],{},"Update API integration tests to use new field names",[4156,84622,84623],{},"html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html pre.shiki code .sgQC_, html code.shiki .sgQC_{--shiki-default:#FDAEB7;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic;--shiki-light:#B31D28;--shiki-light-font-style:italic}",{"title":2433,"searchDepth":2434,"depth":2434,"links":84625},[84626,84627,84633,84645,84653,84661,84681,84687,84691,84695,84703,84707,84708],{"id":77402,"depth":2434,"text":77403},{"id":77446,"depth":2434,"text":77408,"children":84628},[84629,84631],{"id":77449,"depth":2613,"text":84630},"Field: key → slug",{"id":77679,"depth":2613,"text":84632},"Field: type → format",{"id":77902,"depth":2434,"text":77411,"children":84634},[84635,84637,84639,84641,84643],{"id":77905,"depth":2613,"text":84636},"Field: parent_space_id → parent_id",{"id":77913,"depth":2613,"text":84638},"Field: parent_page_id → parent_id",{"id":78117,"depth":2613,"text":84640},"Field: parent_channel_id → parent_id",{"id":78280,"depth":2613,"text":84642},"Field: parent_account_id → parent_id",{"id":78442,"depth":2613,"text":84644},"Field: parent_message_id → parent_id",{"id":78606,"depth":2434,"text":77414,"children":84646},[84647,84649,84651],{"id":78609,"depth":2613,"text":84648},"Field: department → groups",{"id":78825,"depth":2613,"text":84650},"Field:division → groups",{"id":79012,"depth":2613,"text":84652},"Field: location → locations",{"id":79272,"depth":2434,"text":79273,"children":84654},[84655,84657,84659],{"id":79276,"depth":2613,"text":84656},"Field: channel_id → channels",{"id":79284,"depth":2613,"text":84658},"Field: channel_ids → channels",{"id":79499,"depth":2613,"text":84660},"Field: root_message_id → Removed",{"id":79725,"depth":2434,"text":77420,"children":84662},[84663,84665,84667,84669,84671,84673,84675,84677,84679],{"id":79728,"depth":2613,"text":84664},"Field: invoice_at → posted_at",{"id":79922,"depth":2613,"text":84666},"Field: type → Removed",{"id":79988,"depth":2613,"text":84668},"Field: contact_id → contacts",{"id":80206,"depth":2613,"text":84670},"Field: income → income_sections",{"id":80453,"depth":2613,"text":84672},"Field:expenses → expenses_sections",{"id":80645,"depth":2613,"text":84674},"Field:cost_of_goods_sold → cost_of_goods_sold_sections",{"id":80837,"depth":2613,"text":84676},"Field:gross_profit_amount → Calculate from income_total_amount and cost_of_goods_sold_total_amount",{"id":81054,"depth":2613,"text":84678},"Field: net_profit_amount → net_income_amount",{"id":81196,"depth":2613,"text":84680},"Field: IAccountingProfitlossCategory and IAccountingProfitlossSubcategory → Deprecated Types",{"id":81331,"depth":2434,"text":77423,"children":84682},[84683,84685],{"id":81334,"depth":2613,"text":84684},"Field:document_id → document_ids",{"id":81516,"depth":2613,"text":84686},"Field: departments → groups",{"id":81745,"depth":2434,"text":77426,"children":84688},[84689],{"id":81748,"depth":2613,"text":84690},"Field: category → category_id",{"id":81922,"depth":2434,"text":77429,"children":84692},[84693],{"id":81925,"depth":2613,"text":84694},"Field:primary → is_primary",{"id":81988,"depth":2434,"text":77432,"children":84696},[84697,84699,84701],{"id":81991,"depth":2613,"text":84698},"expand_recurring_events → expand",{"id":82147,"depth":2613,"text":84700},"end_le → end_lt",{"id":82809,"depth":2613,"text":84702},"IAccountingReport → Use Individual Report Objects",{"id":84095,"depth":2434,"text":77441,"children":84704},[84705],{"id":84098,"depth":2613,"text":84706},"IAccountingProfitlossCategory and IAccountingProfitlossSubcategory",{"id":84336,"depth":2434,"text":84337},{"id":84547,"depth":2434,"text":84548,"children":84709},[84710,84712,84714,84716],{"id":84551,"depth":2613,"text":84711},"1. Backward Compatibility",{"id":84568,"depth":2613,"text":84713},"2. Testing",{"id":84583,"depth":2613,"text":84715},"3. Data Migration",{"id":84606,"depth":2613,"text":84609},"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...",{"img":84719,"date":84720,"updated":84721,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fnotice_of_deprecation_of_fields_and_objects_nov_2025-icon.png","2025-11-10T00:00:00.000Z","2026-05-28T14:02:38.273Z","\u002Fguides\u002Fnotice_of_deprecation_of_fields_and_objects_nov_2025",{"title":77361,"description":84717},"guides\u002Fnotice_of_deprecation_of_fields_and_objects_nov_2025","iVb2goH6K8aMUu_s-N6F3-bwqKIPZ6udUUllG6gawgo",{"id":84727,"title":84728,"body":84729,"description":84921,"extension":2452,"meta":84922,"navigation":2459,"path":84927,"seo":84928,"stem":84929,"__hash__":84930},"guides\u002Fguides\u002Foracle_hcm_taleo_oauth_credentials_guide.md","Oracle HCM \u002F Taleo OAuth Credentials Guide",{"type":12,"value":84730,"toc":84915},[84731,84734,84736,84741,84744,84753,84756,84762,84765,84773,84778,84784,84789,84792,84806,84809,84814,84834,84839,84842,84845,84848,84859,84864,84867,84873,84876,84882,84885,84893,84899],[15,84732,84728],{"id":84733},"oracle-hcm-taleo-oauth-credentials-guide",[19,84735],{},[22,84737,84738],{},[25,84739,84740],{},"April 6, 2026",[22,84742,84743],{},"To connect Oracle HCM \u002F Taleo to Unified, you only need to collect these 3 values from Oracle:",[2354,84745,84746,84748,84750],{},[2357,84747,4491],{},[2357,84749,4494],{},[2357,84751,84752],{},"Servername",[22,84754,84755],{},"You will enter those directly into Unified.",[55,84757,84759],{"id":84758},"what-to-enter-in-unified",[31,84760,84761],{},"What To Enter In Unified",[22,84763,84764],{},"When creating the Oracle HCM \u002F Taleo connection, fill in:",[2354,84766,84767,84769,84771],{},[2357,84768,4491],{},[2357,84770,4494],{},[2357,84772,84752],{},[22,84774,84775],{},[31,84776,84777],{},"Example Servername",[55,84779,84781],{"id":84780},"how-to-get-these-values-from-oracle",[31,84782,84783],{},"How To Get These Values From Oracle",[22,84785,84786],{},[31,84787,84788],{},"1. Find Your Servername",[22,84790,84791],{},"Ask your Oracle administrator for your Oracle Fusion HCM host name.",[22,84793,84794,84795,84798,84799],{},"It usually looks like:\n",[36,84796,84797],{},"\u003Ctenant>.fa.\u003Cregion>.oraclecloud.com","\nExample:\n",[41,84800,84803],{"href":84801,"rel":84802},"https:\u002F\u002Fexample.fa.us2.oraclecloud.com\u002F",[45],[36,84804,84805],{},"example.fa.us2.oraclecloud.com",[22,84807,84808],{},"This exact value is what you should enter into Unified as the Servername.",[22,84810,84811],{},[31,84812,84813],{},"2. Create A Confidential Application In Oracle",[2510,84815,84816,84819,84822,84825,84828,84831],{},[2357,84817,84818],{},"Sign in to Oracle as an administrator",[2357,84820,84821],{},"Open Integrated applications",[2357,84823,84824],{},"Click Add application",[2357,84826,84827],{},"Choose Confidential Application",[2357,84829,84830],{},"Enter a name such as Unified Oracle HCM Integration",[2357,84832,84833],{},"Continue through the setup",[22,84835,84836],{},[31,84837,84838],{},"3. Enable OAuth Client Access",[22,84840,84841],{},"During application setup, make sure OAuth client access is enabled for the application.",[22,84843,84844],{},"For this Unified connection, Oracle should issue credentials for a confidential application that can request access tokens for the HCM \u002F Taleo APIs.",[22,84846,84847],{},"Your Oracle administrator may need to:",[2354,84849,84850,84853,84856],{},[2357,84851,84852],{},"enable OAuth for the app",[2357,84854,84855],{},"allow the app to access the appropriate Oracle HCM \u002F Taleo resources",[2357,84857,84858],{},"activate the application once setup is complete",[22,84860,84861],{},[31,84862,84863],{},"4. Copy The Credentials",[22,84865,84866],{},"After the confidential application is created and activated, open the application details and copy:",[2354,84868,84869,84871],{},[2357,84870,4491],{},[2357,84872,4494],{},[22,84874,84875],{},"These are the exact values to enter into Unified.",[55,84877,84879],{"id":84878},"final-checklist",[31,84880,84881],{},"Final Checklist",[22,84883,84884],{},"Before creating the connection in Unified, make sure you have:",[2354,84886,84887,84889,84891],{},[2357,84888,4491],{},[2357,84890,4494],{},[2357,84892,84752],{},[55,84894,84896],{"id":84895},"oraclereferences",[31,84897,84898],{},"Oracle References",[2354,84900,84901,84908],{},[2357,84902,84903,84904],{},"OAuth configuration: ",[41,84905,84906],{"href":84906,"rel":84907},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fcloud\u002Fsaas\u002Fapplications-common\u002F25d\u002Foaext\u002Fconfigure-oauth.html",[45],[2357,84909,84910,84911],{},"HCM REST API: ",[41,84912,84913],{"href":84913,"rel":84914},"https:\u002F\u002Fdocs.oracle.com\u002Fen\u002Fcloud\u002Fsaas\u002Fhuman-resources\u002Ffarws\u002Findex.html",[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":84916},[84917,84918,84919,84920],{"id":84758,"depth":2434,"text":84761},{"id":84780,"depth":2434,"text":84783},{"id":84878,"depth":2434,"text":84881},{"id":84895,"depth":2434,"text":84898},"To connect Oracle HCM \u002F Taleo to Unified, you only need to collect these 3 values from Oracle,",{"img":84923,"date":84924,"updated":84925,"tag":2457,"integrations":84926},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Foracle_hcm_taleo_oauth_credentials_guide-icon.png","2026-04-06T15:35:00.000Z","2026-08-23T14:53:22.375Z","oraclehcm, oracletaleo","\u002Fguides\u002Foracle_hcm_taleo_oauth_credentials_guide",{"title":84728,"description":84921},"guides\u002Foracle_hcm_taleo_oauth_credentials_guide","qaVGfn0m5WVPQ9orP4hExhGfntGf7iG9jRQLowRel0A",{"id":84932,"title":84933,"body":84934,"description":85477,"extension":2452,"meta":85478,"navigation":2459,"path":85482,"seo":85483,"stem":85484,"__hash__":85485},"guides\u002Fguides\u002Fretrieval_augmented_generation_rag.md","Retrieval-Augmented Generation (RAG)",{"type":12,"value":84935,"toc":85464},[84936,84939,84941,84946,84951,84957,84968,84975,84998,85001,85005,85008,85011,85022,85028,85036,85042,85046,85049,85052,85068,85073,85079,85083,85086,85091,85110,85113,85118,85132,85135,85138,85141,85145,85148,85151,85195,85198,85204,85211,85215,85218,85221,85241,85247,85253,85257,85260,85280,85288,85294,85296,85299,85302,85305,85309,85312,85325,85328,85339,85343,85346,85363,85366,85370,85373,85413,85416,85419,85454,85459],[15,84937,84933],{"id":84938},"retrieval-augmented-generation-rag",[19,84940],{},[22,84942,84943],{},[25,84944,84945],{},"February 13, 2026",[22,84947,84948],{},[25,84949,84950],{},"Last updated: October 2026",[22,84952,84953,84954,97],{},"This page explains how to implement a RAG pipeline using ",[41,84955,123],{"href":121,"rel":84956},[45],[22,84958,84959,84960,84963,84964,84967],{},"RAG is an implementation pattern built on top of ",[41,84961,123],{"href":121,"rel":84962},[45],"'s APIs. ",[41,84965,123],{"href":121,"rel":84966},[45]," reads records from the source at request time, returns them in one data model per category, and delivers change events as webhooks on supported integrations. You are responsible for embeddings, vector storage and retrieval.",[22,84969,84970,84971,84974],{},"At a high level, RAG with ",[41,84972,123],{"href":121,"rel":84973},[45]," follows this sequence:",[2510,84976,84977,84980,84983,84986,84989,84992,84995],{},[2357,84978,84979],{},"Subscribe to webhooks.",[2357,84981,84982],{},"Receive created or updated objects.",[2357,84984,84985],{},"Retrieve full content from the source API.",[2357,84987,84988],{},"Chunk the content.",[2357,84990,84991],{},"Generate embeddings.",[2357,84993,84994],{},"Store embeddings in your vector database.",[2357,84996,84997],{},"On query, retrieve relevant chunks and generate a response.",[22,84999,85000],{},"The pattern is the same across categories.",[55,85002,85004],{"id":85003},"what-rag-means-in-practice","What RAG Means in Practice",[22,85006,85007],{},"RAG allows you to answer questions using customer data from connected SaaS platforms.",[22,85009,85010],{},"Instead of relying only on model training data, your application:",[2354,85012,85013,85016,85019],{},[2357,85014,85015],{},"Retrieves relevant customer records.",[2357,85017,85018],{},"Supplies those records as context.",[2357,85020,85021],{},"Generates a response grounded in that context.",[22,85023,85024,85027],{},[41,85025,123],{"href":121,"rel":85026},[45]," reads records directly from the source APIs at request time and sends change events on supported integrations. Records come back:",[2354,85029,85030,85033],{},[2357,85031,85032],{},"In the same fields, whichever provider they come from.",[2357,85034,85035],{},"As the source holds them at the moment of the request.",[22,85037,85038,85041],{},[41,85039,123],{"href":121,"rel":85040},[45]," does not store embeddings or maintain a vector index.",[55,85043,85045],{"id":85044},"step-1-connect-data-sources","Step 1: Connect Data Sources",[22,85047,85048],{},"Authorize integrations using Embedded Auth.",[22,85050,85051],{},"Common RAG source categories include:",[2354,85053,85054,85057,85060,85062,85064,85066],{},[2357,85055,85056],{},"File Storage",[2357,85058,85059],{},"Knowledge Management",[2357,85061,23529],{},[2357,85063,23886],{},[2357,85065,21821],{},[2357,85067,23751],{},[22,85069,85070,85071,97],{},"Each authorized integration returns a ",[36,85072,85],{},[22,85074,85075,85076,85078],{},"RAG pipelines should treat ",[36,85077,85],{}," as the tenant boundary.",[55,85080,85082],{"id":85081},"step-2-subscribe-to-object-updates","Step 2: Subscribe to Object Updates",[22,85084,85085],{},"Create webhook subscriptions for the objects you want to index.",[22,85087,85088],{},[31,85089,85090],{},"Backfill on first subscription",[22,85092,37296,85093,85096,85097,85100,85101,85103,85104,4149,85106,85109],{},[36,85094,85095],{},"include_all: true"," when creating the webhook subscription. This delivers all existing records to your endpoint before transitioning to incremental updates. Pages are delivered with ",[36,85098,85099],{},"type: INITIAL-PARTIAL","; the final page is tagged ",[36,85102,46150],{},". After that, the same subscription delivers ongoing changes tagged ",[36,85105,5571],{},[36,85107,85108],{},"VIRTUAL"," depending on whether the source integration supports native webhooks.",[22,85111,85112],{},"Your endpoint receives the same payload structure for backfill and incremental updates, so no separate backfill handler is required.",[22,85114,85115],{},[31,85116,85117],{},"On created or updated events:",[2354,85119,85120,85123,85126],{},[2357,85121,85122],{},"Your endpoint receives the event.",[2357,85124,85125],{},"You call the appropriate retrieve endpoint to fetch the latest version of the object.",[2357,85127,85128,85129,85131],{},"If the object contains a ",[36,85130,55034],{},", fetch the content from that URL.",[22,85133,85134],{},"List endpoints often return metadata but not full content. For RAG, you must explicitly retrieve full text before chunking.",[22,85136,85137],{},"Native webhooks forward the vendor's events. Virtual webhooks use the same payload and detect changes at an interval you set, as often as every minute on paid plans.",[22,85139,85140],{},"Webhooks are recommended over polling for RAG ingestion.",[55,85142,85144],{"id":85143},"step-3-chunk-and-embed","Step 3: Chunk and Embed",[22,85146,85147],{},"Large text (files, pages, tickets, resumes, notes, transcripts) should be split into chunks before embedding.",[22,85149,85150],{},"Each chunk should include stable metadata such as:",[2354,85152,85153,85158,85171,85177,85182],{},[2357,85154,85155,85157],{},[36,85156,85],{}," — tenant boundary; required for all retrieval filters",[2357,85159,85160,85162,85163,319,85166,319,85168],{},[36,85161,17057],{}," — e.g. ",[36,85164,85165],{},"crm_deal",[36,85167,4931],{},[36,85169,85170],{},"ticketing_ticket",[2357,85172,85173,85176],{},[36,85174,85175],{},"object_id"," — source record ID; used to target re-embedding on update",[2357,85178,85179,85181],{},[36,85180,27112],{}," — timestamp of the source record's last update",[2357,85183,85184,85187,85188,85190,85191,85194],{},[36,85185,85186],{},"is_latest"," — boolean flag indicating whether this chunk is current; set to ",[36,85189,10771],{}," when a record updates and new chunks are inserted. This field is not returned by ",[41,85192,123],{"href":121,"rel":85193},[45],"; you maintain it in your vector store schema.",[22,85196,85197],{},"You may also include other returned fields as metadata filters.",[22,85199,85200,85203],{},[41,85201,123],{"href":121,"rel":85202},[45]," returns each object in the same fields whichever provider it comes from, so any field it returns can be stored as metadata in your vector index and used for filtering at retrieval time.",[22,85205,85206,85207,85210],{},"You generate embeddings using the embedding model of your choice. ",[41,85208,123],{"href":121,"rel":85209},[45],"'s Generative AI API can create embeddings on supported integrations, but embeddings and indexes are stored in your infrastructure.",[55,85212,85214],{"id":85213},"step-4-store-in-a-vector-database","Step 4: Store in a Vector Database",[22,85216,85217],{},"Store embeddings in your vector database (for example, Pinecone or pgvector).",[22,85219,85220],{},"Include metadata to support:",[2354,85222,85223,85228,85233,85238],{},[2357,85224,85225,85226,2980],{},"Tenant isolation (",[36,85227,85],{},[2357,85229,85230,85231,2980],{},"Object filtering (",[36,85232,17057],{},[2357,85234,85235,85236,2980],{},"Update replacement (",[36,85237,27112],{},[2357,85239,85240],{},"Permission enforcement (see below)",[22,85242,85243,85246],{},[41,85244,123],{"href":121,"rel":85245},[45]," does not:",[2584,85248,85251],{"className":85249,"code":85250,"language":2652},[50343],"- Cache end-customer payloads\n- Store embeddings\n- Maintain a vector index\n",[36,85252,85250],{"__ignoreMap":2433},[55,85254,85256],{"id":85255},"step-5-retrieve-and-generate","Step 5: Retrieve and Generate",[22,85258,85259],{},"When a user submits a query:",[2510,85261,85262,85265,85268,85274,85277],{},[2357,85263,85264],{},"Embed the query.",[2357,85266,85267],{},"Retrieve the top matching chunks from your vector database.",[2357,85269,85270,85271,85273],{},"Filter by ",[36,85272,85],{}," and any relevant metadata.",[2357,85275,85276],{},"Pass retrieved context to your model.",[2357,85278,85279],{},"Return the generated answer.",[22,85281,85282,85283,4149,85285,97],{},"If required, include citations that map back to ",[36,85284,85175],{},[36,85286,85287],{},"web_url",[22,85289,85290,85293],{},[41,85291,123],{"href":121,"rel":85292},[45]," does not perform retrieval. It delivers change events; your application re-embeds and replaces vectors to keep the index in step with the source.",[55,85295,52165],{"id":38588},[22,85297,85298],{},"File objects include explicit permissions metadata.",[22,85300,85301],{},"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",[22,85303,85304],{},"Always filter retrieval results by tenant and permission constraints before generation.",[55,85306,85308],{"id":85307},"how-current-is-the-index","How current is the index?",[22,85310,85311],{},"For RAG pipelines, how current the index is depends on how changes reach you:",[2354,85313,85314,85317,85320],{},[2357,85315,85316],{},"Native webhooks forward the vendor's events.",[2357,85318,85319],{},"Virtual webhooks detect changes at an interval you set, as often as every minute on paid plans.",[2357,85321,85322,85323],{},"Most list endpoints support pagination and incremental filtering via ",[36,85324,24782],{},[22,85326,85327],{},"To keep embeddings current:",[2354,85329,85330,85333,85336],{},[2357,85331,85332],{},"Re-fetch objects on update events.",[2357,85334,85335],{},"Re-chunk and re-embed.",[2357,85337,85338],{},"Replace outdated vectors in your index.",[55,85340,85342],{"id":85341},"when-to-use-rag","When to Use RAG",[22,85344,85345],{},"Use this pattern when you need to:",[2354,85347,85348,85351,85354,85357,85360],{},[2357,85349,85350],{},"Build enterprise search across connected platforms.",[2357,85352,85353],{},"Ground AI responses in customer documents or records.",[2357,85355,85356],{},"Enable resume or candidate search.",[2357,85358,85359],{},"Support contract or document Q&A.",[2357,85361,85362],{},"Build account-level CRM assistants.",[22,85364,85365],{},"The ingestion architecture is consistent across categories. Object models and content retrieval methods vary by API.",[55,85367,85369],{"id":85368},"related-apis","Related APIs",[22,85371,85372],{},"RAG pipelines commonly use:",[2354,85374,85375,85382,85388,85395,85402,85407],{},[2357,85376,85377],{},[41,85378,85381],{"href":85379,"rel":85380},"https:\u002F\u002Fdocs.unified.to\u002Fstorage\u002Foverview",[45],"File Storage API",[2357,85383,85384],{},[41,85385,85387],{"href":28766,"rel":85386},[45],"Knowledge Management API",[2357,85389,85390],{},[41,85391,85394],{"href":85392,"rel":85393},"https:\u002F\u002Fdocs.unified.to\u002Fcrm\u002Foverview",[45],"CRM API",[2357,85396,85397],{},[41,85398,85401],{"href":85399,"rel":85400},"https:\u002F\u002Fdocs.unified.to\u002Fticketing\u002Foverview",[45],"Ticketing API",[2357,85403,85404],{},[41,85405,27779],{"href":27797,"rel":85406},[45],[2357,85408,85409],{},[41,85410,85412],{"href":30483,"rel":85411},[45],"Messaging API",[22,85414,85415],{},"Refer to category documentation for supported objects and webhook availability.",[55,85417,85418],{"id":74615},"Related Guides",[2354,85420,85421,85427,85433,85440,85447],{},[2357,85422,85423],{},[41,85424,34056],{"href":85425,"rel":85426},"https:\u002F\u002Funified.to\u002Fblog\u002Fhow_to_build_enterprise_search_using_rag",[45],[2357,85428,85429],{},[41,85430,2466],{"href":85431,"rel":85432},"https:\u002F\u002Funified.to\u002Fblog\u002Fats_to_vector_db_how_to_power_talent_intelligence_with_real_time_data",[45],[2357,85434,85435],{},[41,85436,85439],{"href":85437,"rel":85438},"https:\u002F\u002Funified.to\u002Fblog\u002Fhow_to_build_an_ai_powered_meeting_recording_summarization_with_unified",[45],"How to Build an AI-Powered Meeting Recording Summarization",[2357,85441,85442],{},[41,85443,85446],{"href":85444,"rel":85445},"https:\u002F\u002Funified.to\u002Fblog\u002Fhow_to_train_ai_with_crm_data_using_unified_crm_api",[45],"How to Train AI with CRM Data using Unified's CRM API",[2357,85448,85449],{},[41,85450,85453],{"href":85451,"rel":85452},"https:\u002F\u002Funified.to\u002Fblog\u002Fhow_to_train_ai_with_hris_data_with_unified_hr_and_directory_api",[45],"How to Train AI with HRIS Data with Unified's HR & Directory API",[22,85455,85456],{},[41,85457,53067],{"href":21420,"rel":85458},[45],[22,85460,85461],{},[41,85462,53073],{"href":4152,"rel":85463},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":85465},[85466,85467,85468,85469,85470,85471,85472,85473,85474,85475,85476],{"id":85003,"depth":2434,"text":85004},{"id":85044,"depth":2434,"text":85045},{"id":85081,"depth":2434,"text":85082},{"id":85143,"depth":2434,"text":85144},{"id":85213,"depth":2434,"text":85214},{"id":85255,"depth":2434,"text":85256},{"id":38588,"depth":2434,"text":52165},{"id":85307,"depth":2434,"text":85308},{"id":85341,"depth":2434,"text":85342},{"id":85368,"depth":2434,"text":85369},{"id":74615,"depth":2434,"text":85418},"This page explains how to implement a RAG pipeline using Unified.to.",{"img":85479,"date":85480,"updated":85481,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fretrieval_augmented_generation_rag-icon.png","2026-02-13T01:40:00.000Z","2026-10-21T00:26:47.660Z","\u002Fguides\u002Fretrieval_augmented_generation_rag",{"title":84933,"description":85477},"guides\u002Fretrieval_augmented_generation_rag","0B9e0yEg_9jqTDw5wIJ4ApE3o0usKUC2UF7g-5wmV3k",{"id":85487,"title":85488,"body":85489,"description":85997,"extension":2452,"meta":85998,"navigation":2459,"path":86002,"seo":86003,"stem":86004,"__hash__":86005},"guides\u002Fguides\u002Fsalesforce_external_client_apps_on_multiple_organizations.md","SalesForce (External Client Apps) on Multiple Organizations",{"type":12,"value":85490,"toc":85993},[85491,85494,85496,85501,85504,85509,85513,85558,85568,85574,85757,85760,85765,85774,85784,85799,85804,85810,85816,85821,85875,85889,85892,85922,85927,85933,85961,85964,85968,85971,85991],[15,85492,85488],{"id":85493},"salesforce-external-client-apps-on-multiple-organizations",[19,85495],{},[22,85497,85498],{},[25,85499,85500],{},"April 15, 2026",[22,85502,85503],{},"This guide will walk you through the required steps to support using a Salesforce External Client App (ECA) across multiple organizations. When an ECA is created in Salesforce, it can only connect to users within the organization that created it. To allow the ECA to be used across multiple organizations, you must complete the required setup steps before it can connect to users outside the original organization. The customer's Salesforce admin does not need to give anyone their Salesforce credentials, they can run the second set of steps below.",[4937,85505,85506],{},[22,85507,85508],{},"⚠️ This setup resolves the error 'Cross-org OAuth flows are not supported for this external client app'. That error usually means the External Client App was created in your SourceOrg but has not yet been installed\u002Fdeployed\u002Fapproved in the customer's TargetOrg.",[3629,85510,85512],{"id":85511},"terminology","Terminology",[155,85514,85515,85524],{},[158,85516,85517],{},[161,85518,85519,85522],{},[164,85520,85521],{},"Term",[164,85523,74486],{},[174,85525,85526,85534,85542,85550],{},[161,85527,85528,85531],{},[179,85529,85530],{},"SourceOrg",[179,85532,85533],{},"The Salesforce org where the External Client App was created",[161,85535,85536,85539],{},[179,85537,85538],{},"TargetOrg",[179,85540,85541],{},"The customer's Salesforce org where users are trying to connect",[161,85543,85544,85547],{},[179,85545,85546],{},"APP_API_NAME",[179,85548,85549],{},"API Name of the External Client App",[161,85551,85552,85555],{},[179,85553,85554],{},"OAUTH_SETTINGS_API_NAME",[179,85556,85557],{},"Metadata name of the OAuth settings attached to the External Client App",[2510,85559,85560],{},[2357,85561,85562,85563,97],{},"The first thing you need to do is create an ECA within Salesforce. If you have already done this proceed to step 2, otherwise check out our ",[41,85564,85567],{"href":85565,"rel":85566},"https:\u002F\u002Funified.to\u002Fblog\u002Fhow_to_register_a_salesforce_developer_app_and_get_oauth_2_credentials",[45],"how to guide",[22,85569,85570],{},[4201,85571],{"alt":85572,"src":85573},"Screenshot_2026-04-29_at_11.06.56_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fsalesforce_external_client_apps_on_multiple_organizations-0.png",[2510,85575,85576,85583,85608,85622,85649,85725],{},[2357,85577,85578],{},[41,85579,85582],{"href":85580,"rel":85581},"https:\u002F\u002Fdeveloper.salesforce.com\u002Ftools\u002Fsalesforcecli",[45],"Install SalesForce CLI",[2357,85584,85585,85586],{},"Generate a SalesForce project",[2584,85587,85589],{"className":17934,"code":85588,"language":17936,"meta":2433,"style":2433},"sf project generate --name unified-sf\n",[36,85590,85591],{"__ignoreMap":2433},[414,85592,85593,85596,85599,85602,85605],{"class":2593,"line":2594},[414,85594,85595],{"class":2597},"sf",[414,85597,85598],{"class":2601}," project",[414,85600,85601],{"class":2601}," generate",[414,85603,85604],{"class":2607}," --name",[414,85606,85607],{"class":2601}," unified-sf\n",[2357,85609,85610,85611],{},"Navigate into project",[2584,85612,85614],{"className":17934,"code":85613,"language":17936,"meta":2433,"style":2433},"cd unified-sf\n",[36,85615,85616],{"__ignoreMap":2433},[414,85617,85618,85620],{"class":2593,"line":2594},[414,85619,2608],{"class":2607},[414,85621,85607],{"class":2601},[2357,85623,85624,85625],{},"Login to your Source organization, this is the organization where you have created the External client app",[2584,85626,85628],{"className":17934,"code":85627,"language":17936,"meta":2433,"style":2433},"sf org login web --alias SourceOrg\n",[36,85629,85630],{"__ignoreMap":2433},[414,85631,85632,85634,85637,85640,85643,85646],{"class":2593,"line":2594},[414,85633,85595],{"class":2597},[414,85635,85636],{"class":2601}," org",[414,85638,85639],{"class":2601}," login",[414,85641,85642],{"class":2601}," web",[414,85644,85645],{"class":2607}," --alias",[414,85647,85648],{"class":2601}," SourceOrg\n",[2357,85650,85651,85652,85699],{},"Retrieve the app metadata (Replace APP_API_NAME with your app name, which can be found at Setup → External Client Apps → open your app → settings → basic information → API Name",[2584,85653,85655],{"className":17934,"code":85654,"language":17936,"meta":2433,"style":2433},"sf project retrieve start --metadata ExternalClientApplication:APP_API_NAME --target-org SourceOrg\nsf project retrieve start --metadata ExtlClntAppOauthSettings --target-org SourceOrg\n",[36,85656,85657,85680],{"__ignoreMap":2433},[414,85658,85659,85661,85663,85666,85669,85672,85675,85678],{"class":2593,"line":2594},[414,85660,85595],{"class":2597},[414,85662,85598],{"class":2601},[414,85664,85665],{"class":2601}," retrieve",[414,85667,85668],{"class":2601}," start",[414,85670,85671],{"class":2607}," --metadata",[414,85673,85674],{"class":2601}," ExternalClientApplication:APP_API_NAME",[414,85676,85677],{"class":2607}," --target-org",[414,85679,85648],{"class":2601},[414,85681,85682,85684,85686,85688,85690,85692,85695,85697],{"class":2593,"line":2434},[414,85683,85595],{"class":2597},[414,85685,85598],{"class":2601},[414,85687,85665],{"class":2601},[414,85689,85668],{"class":2601},[414,85691,85671],{"class":2607},[414,85693,85694],{"class":2601}," ExtlClntAppOauthSettings",[414,85696,85677],{"class":2607},[414,85698,85648],{"class":2601},[4937,85700,85701],{},[22,85702,85703,85704,85707,85708,85711,85712,45022,85715,85717,85718,85720,85721,85724],{},"ℹ️ After retrieval, look in ",[36,85705,85706],{},"force-app\u002Fmain\u002Fdefault\u002FextlClntAppOauthSettings\u002F"," for a file like ",[36,85709,85710],{},"salesforce-test-app_oauth.extlClntAppOauthSettings-meta.xml",". The part before ",[36,85713,85714],{},".extlClntAppOauthSettings-meta.xml",[36,85716,85554],{},". It is usually NOT the same as ",[36,85719,85546],{}," (it often ends with ",[36,85722,85723],{},"_oauth","), so confirm it from the retrieved file name instead of guessing.",[2357,85726,85727,85728],{},"Create a zip of the project folder to give to the customer who wants to install your app.",[2584,85729,85731],{"className":17934,"code":85730,"language":17936,"meta":2433,"style":2433},"zip -r ..\u002Fmy_project.zip . --exclude \"*\u002F.git\u002F*\" --exclude \"*\u002F.sfdx\u002F*\"\n",[36,85732,85733],{"__ignoreMap":2433},[414,85734,85735,85738,85741,85744,85746,85749,85752,85754],{"class":2593,"line":2594},[414,85736,85737],{"class":2597},"zip",[414,85739,85740],{"class":2607}," -r",[414,85742,85743],{"class":2601}," ..\u002Fmy_project.zip",[414,85745,46583],{"class":2601},[414,85747,85748],{"class":2607}," --exclude",[414,85750,85751],{"class":2601}," \"*\u002F.git\u002F*\"",[414,85753,85748],{"class":2607},[414,85755,85756],{"class":2601}," \"*\u002F.sfdx\u002F*\"\n",[22,85758,85759],{},"Customer Steps (Customer Salesforce admin)",[2510,85761,85762],{},[2357,85763,85764],{},"Customer opens the project folder",[2584,85766,85768],{"className":16485,"code":85767,"language":16487,"meta":2433,"style":2433},"cd my_project\n",[36,85769,85770],{"__ignoreMap":2433},[414,85771,85772],{"class":2593,"line":2594},[414,85773,85767],{"class":2705},[2510,85775,85776,85781],{},[2357,85777,85778],{},[41,85779,85582],{"href":85580,"rel":85780},[45],[2357,85782,85783],{},"Customer admin logs into the TargetOrg",[2584,85785,85787],{"className":16485,"code":85786,"language":16487,"meta":2433,"style":2433},"sf org login web --alias TargetOrg\n",[36,85788,85789],{"__ignoreMap":2433},[414,85790,85791,85794,85796],{"class":2593,"line":2594},[414,85792,85793],{"class":2705},"sf org login web ",[414,85795,46376],{"class":2698},[414,85797,85798],{"class":2705},"alias TargetOrg\n",[2510,85800,85801],{},[2357,85802,85803],{},"The customer will need to make some changes within their Salesforce to deploy the app. In the SalesForce Dev Hub > Settings > Setup > Dev Hub, enable both 'Enable Unlocked Packages and Second-Generation Managed Packages' and 'Enable Dev Hub'",[22,85805,85806],{},[4201,85807],{"alt":85808,"src":85809},"Screenshot_2026-04-15_at_3.37.45_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fsalesforce_external_client_apps_on_multiple_organizations-1.png",[22,85811,85812],{},[4201,85813],{"alt":85814,"src":85815},"Screenshot_2026-04-15_at_1.44.39_PM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fsalesforce_external_client_apps_on_multiple_organizations-2.png",[2510,85817,85818],{},[2357,85819,85820],{},"Customer deploys the ECA app",[2584,85822,85824],{"className":16485,"code":85823,"language":16487,"meta":2433,"style":2433},"sf project deploy start --metadata ExternalClientApplication:APP_API_NAME --target-org TargetOrg\nsf project deploy start --metadata ExtlClntAppOauthSettings:APP_API_NAME_oauth --target-org TargetOrg\n",[36,85825,85826,85853],{"__ignoreMap":2433},[414,85827,85828,85831,85833,85836,85839,85841,85843,85846,85848,85850],{"class":2593,"line":2594},[414,85829,85830],{"class":2705},"sf project deploy start ",[414,85832,46376],{"class":2698},[414,85834,85835],{"class":2705},"metadata ",[414,85837,85838],{"class":2597},"ExternalClientApplication",[414,85840,2646],{"class":2705},[414,85842,85546],{"class":2607},[414,85844,85845],{"class":2698}," --",[414,85847,26733],{"class":2705},[414,85849,34146],{"class":2698},[414,85851,85852],{"class":2705},"org TargetOrg\n",[414,85854,85855,85857,85859,85861,85864,85867,85869,85871,85873],{"class":2593,"line":2434},[414,85856,85830],{"class":2705},[414,85858,46376],{"class":2698},[414,85860,85835],{"class":2705},[414,85862,85863],{"class":2597},"ExtlClntAppOauthSettings",[414,85865,85866],{"class":2705},":APP_API_NAME_oauth ",[414,85868,46376],{"class":2698},[414,85870,26733],{"class":2705},[414,85872,34146],{"class":2698},[414,85874,85852],{"class":2705},[4937,85876,85877],{},[22,85878,85879,85880,85883,85884,85886,85887,20056],{},"ℹ️ Replace ",[36,85881,85882],{},"APP_API_NAME_oauth"," above with the real ",[36,85885,85554],{}," from the retrieved file name (it may differ from ",[36,85888,85546],{},[22,85890,85891],{},"Alternative: deploy both metadata types together:",[2584,85893,85895],{"className":17934,"code":85894,"language":17936,"meta":2433,"style":2433},"sf project deploy start --metadata ExternalClientApplication --metadata ExtlClntAppOauthSettings --target-org TargetOrg\n",[36,85896,85897],{"__ignoreMap":2433},[414,85898,85899,85901,85903,85906,85908,85910,85913,85915,85917,85919],{"class":2593,"line":2594},[414,85900,85595],{"class":2597},[414,85902,85598],{"class":2601},[414,85904,85905],{"class":2601}," deploy",[414,85907,85668],{"class":2601},[414,85909,85671],{"class":2607},[414,85911,85912],{"class":2601}," ExternalClientApplication",[414,85914,85671],{"class":2607},[414,85916,85694],{"class":2601},[414,85918,85677],{"class":2607},[414,85920,85921],{"class":2601}," TargetOrg\n",[2510,85923,85924],{},[2357,85925,85926],{},"The customer can then verify that the app has been added to their organization by visiting Setup → External Client Apps → external client app manager where they should see your app installed.",[22,85928,85929],{},[4201,85930],{"alt":85931,"src":85932},"Screenshot_2026-04-29_at_11.06.47_AM.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fsalesforce_external_client_apps_on_multiple_organizations-3.png",[2510,85934,85935,85958],{},[2357,85936,85937,85938],{},"Configure and approve access in the TargetOrg. The admin should review and configure:\n",[2354,85939,85940,85943,85946,85949,85952,85955],{},[2357,85941,85942],{},"Permitted users",[2357,85944,85945],{},"Profiles \u002F permission sets",[2357,85947,85948],{},"OAuth policies",[2357,85950,85951],{},"Refresh token policy",[2357,85953,85954],{},"IP restrictions, if applicable",[2357,85956,85957],{},"Admin-approved users, if the org requires admin approval",[2357,85959,85960],{},"The customer can now create a connection to your app",[22,85962,85963],{},"Once the app is deployed and access is granted, the end user can retry the normal Salesforce connection flow through Unified and the cross-org OAuth error will be resolved.",[55,85965,85967],{"id":85966},"long-term-application-distribution-recommendation","Long-term application-distribution recommendation",[22,85969,85970],{},"For repeated customer onboarding, the preferred long-term approach is to package the External Client App as a Salesforce package and share a package install link with customer Salesforce admins, instead of asking each admin to manually run metadata deployment commands.",[2510,85972,85973,85976,85979,85982,85985,85988],{},[2357,85974,85975],{},"You create the External Client App once in SourceOrg.",[2357,85977,85978],{},"You package the app and OAuth settings.",[2357,85980,85981],{},"You share the package install link with customer admins.",[2357,85983,85984],{},"The customer Salesforce admin installs the package into TargetOrg.",[2357,85986,85987],{},"The customer Salesforce admin approves\u002Fconfigures access.",[2357,85989,85990],{},"End users connect normally through OAuth.",[4156,85992,18665],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":85994},[85995,85996],{"id":85511,"depth":2613,"text":85512},{"id":85966,"depth":2434,"text":85967},"This guide will walk you through the required steps to support using a Salesforce External Client App (ECA) across multiple organizations. When an ECA is...",{"img":85999,"date":86000,"updated":86001,"tag":2457,"integrations":57520},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fsalesforce_external_client_apps_on_multiple_organizations-icon.png","2026-04-15T18:48:00.000Z","2026-08-23T14:53:19.436Z","\u002Fguides\u002Fsalesforce_external_client_apps_on_multiple_organizations",{"title":85488,"description":85997},"guides\u002Fsalesforce_external_client_apps_on_multiple_organizations","EogZ_WyHaVR6jmLVZJ-DXLZi2eJWla4FlwqM2XfDXZI",{"id":86007,"title":86008,"body":86009,"description":86487,"extension":2452,"meta":86488,"navigation":2459,"path":86493,"seo":86494,"stem":86495,"__hash__":86496},"guides\u002Fguides\u002Fsaml_single_sign_on.md","SAML Single-Sign-On",{"type":12,"value":86010,"toc":86479},[86011,86014,86016,86021,86024,86035,86038,86044,86049,86074,86079,86089,86094,86164,86169,86200,86205,86225,86230,86256,86261,86266,86277,86282,86293,86296,86302,86307,86313,86334,86362,86368,86371,86431,86437,86458,86462,86465,86473,86476],[15,86012,86008],{"id":86013},"saml-single-sign-on",[19,86015],{},[22,86017,86018],{},[25,86019,86020],{},"September 28, 2025",[22,86022,86023],{},"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).",[22,86025,86026,86029,86030,86034],{},[41,86027,123],{"href":121,"rel":86028},[45]," supports SAML sign-in to your workspace with JumpCloud, Okta, Microsoft Entra and Google Workspace Directory, on the Pro and Scale plans (as of 8 October 2026).  ",[41,86031,86033],{"href":20543,"rel":86032},[45],"Let us know"," if you need another SAML identity provider.",[22,86036,86037],{},"Here's how SAML works:",[55,86039,86041],{"id":86040},"saml-authentication-flow",[31,86042,86043],{},"SAML Authentication Flow",[22,86045,86046],{},[31,86047,86048],{},"Key Components:",[2510,86050,86051,86057,86063,86068],{},[2357,86052,86053,86056],{},[31,86054,86055],{},"Identity Provider (IdP)"," - The system that authenticates users (e.g., Active Directory, Okta, Azure AD)",[2357,86058,86059,86062],{},[31,86060,86061],{},"Service Provider (SP)"," - The application the user wants to access (e.g., your Unified.to app)",[2357,86064,86065,86067],{},[31,86066,4690],{}," - The person trying to log in",[2357,86069,86070,86073],{},[31,86071,86072],{},"SAML Assertion"," - XML document containing authentication\u002Fauthorization information",[22,86075,86076],{},[31,86077,86078],{},"Typical SAML SSO Flow:",[2510,86080,86081,86083,86085,86087],{},[2357,86082],{},[2357,86084],{},[2357,86086],{},[2357,86088],{},[22,86090,86091],{},[31,86092,86093],{},"Detailed Steps:",[2510,86095,86096,86109,86122,86135,86148],{},[2357,86097,86098,86101],{},[31,86099,86100],{},"User Access Request",[2354,86102,86103,86106],{},[2357,86104,86105],{},"User visits your application and clicks \"SAML SSO\" login",[2357,86107,86108],{},"Application generates a SAML Authentication Request (AuthnRequest)",[2357,86110,86111,86114],{},[31,86112,86113],{},"Redirect to Identity Provider",[2354,86115,86116,86119],{},[2357,86117,86118],{},"User is redirected to their organization's IdP",[2357,86120,86121],{},"AuthnRequest contains information about the SP and requested attributes",[2357,86123,86124,86127],{},[31,86125,86126],{},"User Authentication",[2354,86128,86129,86132],{},[2357,86130,86131],{},"User enters their organizational credentials",[2357,86133,86134],{},"IdP validates the credentials",[2357,86136,86137,86140],{},[31,86138,86139],{},"SAML Response Generation",[2354,86141,86142,86145],{},[2357,86143,86144],{},"IdP creates a SAML Response containing a SAML Assertion",[2357,86146,86147],{},"Assertion includes user identity, authentication method, session info, etc.",[2357,86149,86150,86153],{},[31,86151,86152],{},"Response Processing",[2354,86154,86155,86158,86161],{},[2357,86156,86157],{},"IdP redirects user back to SP with the SAML Response",[2357,86159,86160],{},"SP validates the assertion signature and extracts user information",[2357,86162,86163],{},"User is logged into the application",[22,86165,86166],{},[31,86167,86168],{},"SAML Assertion Contents:",[2354,86170,86171,86176,86182,86188,86194],{},[2357,86172,86173,86175],{},[31,86174,7799],{},": Who the user is (NameID, email, etc.)",[2357,86177,86178,86181],{},[31,86179,86180],{},"Authentication Statement",": How they were authenticated",[2357,86183,86184,86187],{},[31,86185,86186],{},"Attribute Statement",": Additional user attributes (roles, groups, etc.)",[2357,86189,86190,86193],{},[31,86191,86192],{},"Conditions",": Validity period, audience restrictions",[2357,86195,86196,86199],{},[31,86197,86198],{},"Signature",": Cryptographic proof of authenticity",[22,86201,86202],{},[31,86203,86204],{},"Common SAML Bindings:",[2354,86206,86207,86213,86219],{},[2357,86208,86209,86212],{},[31,86210,86211],{},"HTTP Redirect",": Data passed via URL parameters",[2357,86214,86215,86218],{},[31,86216,86217],{},"HTTP POST",": Data posted in form fields",[2357,86220,86221,86224],{},[31,86222,86223],{},"HTTP Artifact",": Reference token exchanged for full assertion",[22,86226,86227],{},[31,86228,86229],{},"Security Features:",[2354,86231,86232,86238,86244,86250],{},[2357,86233,86234,86237],{},[31,86235,86236],{},"Digital Signatures",": Ensure assertions haven't been tampered with",[2357,86239,86240,86243],{},[31,86241,86242],{},"Encryption",": Protect sensitive data in transit",[2357,86245,86246,86249],{},[31,86247,86248],{},"Time-based Conditions",": Assertions expire after set time",[2357,86251,86252,86255],{},[31,86253,86254],{},"Audience Restrictions",": Limit which SPs can use the assertion",[22,86257,86258],{},[31,86259,86260],{},"Configuration Requirements:",[22,86262,86263],{},[31,86264,86265],{},"For Service Provider (your app):",[2354,86267,86268,86271,86274],{},[2357,86269,86270],{},"SAML metadata XML with entity ID, ACS URL, certificate",[2357,86272,86273],{},"User attribute mapping (email, name, roles)",[2357,86275,86276],{},"Certificate for signature validation",[22,86278,86279],{},[31,86280,86281],{},"For Identity Provider:",[2354,86283,86284,86287,86290],{},[2357,86285,86286],{},"SP metadata containing endpoints and certificate",[2357,86288,86289],{},"User attribute configuration",[2357,86291,86292],{},"SSO URL configuration",[22,86294,86295],{},"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.",[55,86297,86299],{"id":86298},"jumpcloud-saml-integration-setup",[31,86300,86301],{},"JumpCloud SAML Integration Setup",[22,86303,86304],{},[31,86305,86306],{},"1. JumpCloud Configuration (Identity Provider Side)",[3629,86308,86310],{"id":86309},"step-1-create-sso-application-in-jumpcloud",[31,86311,86312],{},"Step 1: Create SSO Application in JumpCloud",[2510,86314,86315,86318,86323,86328,86331],{},[2357,86316,86317],{},"Log into JumpCloud Admin Portal",[2357,86319,7120,86320],{},[31,86321,86322],{},"SSO Applications",[2357,86324,6184,86325],{},[31,86326,86327],{},"+ Add New Application",[2357,86329,86330],{},"Search for \"Custom SAML Application\" or \"Custom App\"",[2357,86332,86333],{},"Configure the application:",[2354,86335,86336,86342,86352],{},[2357,86337,86338,86341],{},[31,86339,86340],{},"Display Label",": \"Unified.to\" (or your app name)",[2357,86343,86344,51878,86347,86351],{},[31,86345,86346],{},"IdP Entity ID",[41,86348,86349],{"href":86349,"rel":86350},"https:\u002F\u002Fsso.jumpcloud.com\u002Fsaml2\u002Funified-to",[45]," (or your preferred ID)",[2357,86353,86354,86357,86358,2980],{},[31,86355,86356],{},"SP Entity ID",": Your application's entity ID (e.g., ",[41,86359,86360],{"href":86360,"rel":86361},"https:\u002F\u002Fapi.unified.to\u002Fsaml\u002Fmetadata",[45],[3629,86363,86365],{"id":86364},"step-2-configure-saml-attributes",[31,86366,86367],{},"Step 2: Configure SAML Attributes",[22,86369,86370],{},"In the JumpCloud SSO configuration:",[2354,86372,86373,86382,86390,86396],{},[2357,86374,86375,7340,86378,86381],{},[31,86376,86377],{},"ACS URL",[36,86379,86380],{},"https:\u002F\u002Fapi.unified.to\u002Fsaml\u002Facs"," (your assertion consumer service endpoint)",[2357,86383,86384,51878,86387],{},[31,86385,86386],{},"Audience",[41,86388,86360],{"href":86360,"rel":86389},[45],[2357,86391,86392,86395],{},[31,86393,86394],{},"Name ID Format",": urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress",[2357,86397,86398,38099,86401],{},[31,86399,86400],{},"Attribute Mappings",[2354,86402,86403,86410,86417,86424],{},[2357,86404,86405,86406],{},"email → ",[41,86407,86408],{"href":86408,"rel":86409},"https:\u002F\u002Fschemas.xmlsoap.org\u002Fws\u002F2005\u002F05\u002Fidentity\u002Fclaims\u002Femailaddress",[45],[2357,86411,86412,86413],{},"firstName → ",[41,86414,86415],{"href":86415,"rel":86416},"https:\u002F\u002Fschemas.xmlsoap.org\u002Fws\u002F2005\u002F05\u002Fidentity\u002Fclaims\u002Fgivenname",[45],[2357,86418,86419,86420],{},"lastName → ",[41,86421,86422],{"href":86422,"rel":86423},"https:\u002F\u002Fschemas.xmlsoap.org\u002Fws\u002F2005\u002F05\u002Fidentity\u002Fclaims\u002Fsurname",[45],[2357,86425,86426,86427],{},"username → ",[41,86428,86429],{"href":86429,"rel":86430},"https:\u002F\u002Fschemas.xmlsoap.org\u002Fws\u002F2005\u002F05\u002Fidentity\u002Fclaims\u002Fname",[45],[3629,86432,86434],{"id":86433},"step-3-get-jumpcloud-metadata",[31,86435,86436],{},"Step 3: Get JumpCloud Metadata",[2354,86438,86439,86442,86451],{},[2357,86440,86441],{},"Download the IdP metadata XML from JumpCloud",[2357,86443,7105,86444,86447,86448,2980],{},[31,86445,86446],{},"SSO URL"," (usually ",[41,86449,86349],{"href":86349,"rel":86450},[45],[2357,86452,86453,86454,86457],{},"Get the ",[31,86455,86456],{},"X.509 Certificate"," for signature validation",[15,86459,86461],{"id":86460},"configure-saml-on-unified","Configure SAML on Unified",[22,86463,86464],{},"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.",[22,86466,86467,86468,97],{},"Then proceed to the workspace settings and choose ",[41,86469,86472],{"href":86470,"rel":86471},"https:\u002F\u002Fapp.unified.to\u002Fsettings\u002Fsaml",[45],"SAML",[22,86474,86475],{},"Select your Identity Provider. Either upload the SAML manifest XML file or input the SAML configuration settings from your identity provider.",[22,86477,86478],{},"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":2433,"searchDepth":2434,"depth":2434,"links":86480},[86481,86482],{"id":86040,"depth":2434,"text":86043},{"id":86298,"depth":2434,"text":86301,"children":86483},[86484,86485,86486],{"id":86309,"depth":2613,"text":86312},{"id":86364,"depth":2613,"text":86367},{"id":86433,"depth":2613,"text":86436},"SAML (Security Assertion Markup Language) is an XML-based standard for exchanging authentication and authorization data between parties, particularly between...",{"img":86489,"date":86490,"updated":86491,"tag":2457,"integrations":86492},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fsaml_single_sign_on-icon.webp","2025-09-28T00:00:00.000Z","2026-10-08T23:04:04.617Z","jumpcloud","\u002Fguides\u002Fsaml_single_sign_on",{"title":86008,"description":86487},"guides\u002Fsaml_single_sign_on","uT3JzNRM723f1FEaU3kXN-QujXcjkXKvIWHF0WvSSEY",{"id":86498,"title":86499,"body":86500,"description":87606,"extension":2452,"meta":87607,"navigation":2459,"path":87612,"seo":87613,"stem":87614,"__hash__":87615},"guides\u002Fguides\u002Fscaling_mcp_tools_with_anthropic_and_openai_defer_loading.md","Scaling MCP Tools with Anthropic's (& OpenAI's) Defer Loading",{"type":12,"value":86501,"toc":87586},[86502,86505,86507,86512,86519,86528,86531,86545,86551,86555,86558,86561,86572,86576,86582,86586,86594,86605,86613,86624,86627,86653,86657,86672,86705,86773,86781,86907,86921,86934,86937,86941,86944,86948,86951,86979,86983,86989,86996,87000,87003,87092,87096,87104,87151,87155,87158,87184,87188,87193,87210,87215,87226,87230,87233,87496,87498,87542,87546,87551,87577,87580,87583],[15,86503,86499],{"id":86504},"scaling-mcp-tools-with-anthropics-openais-defer-loading",[19,86506],{},[22,86508,86509],{},[25,86510,86511],{},"December 25, 2025",[22,86513,86514,86515,86518],{},"Learn how to use Anthropic's and OpenAI's ",[36,86516,86517],{},"defer_loading"," tool search features with Unified's MCP server to efficiently manage hundreds of tools while maintaining high accuracy and context efficiency.",[22,86520,86521,86522,86527],{},"When building AI applications with MCP servers, including the ",[41,86523,86526],{"href":86524,"rel":86525},"https:\u002F\u002Fwww.notion.so\u002Fmcp\u002Foverview",[45],"Unified MCP server",", you quickly encounter a critical challenge: most LLM models struggle with large numbers of tools.",[22,86529,86530],{},"While Unified can provide thousands of tools across different integrations, traditional approaches hit two key limitations:",[2354,86532,86533,86539],{},[2357,86534,86535,86538],{},[31,86536,86537],{},"Context window bloat",": Tool definitions consume massive portions of your context (50 tools ≈ 10-20K tokens)",[2357,86540,86541,86544],{},[31,86542,86543],{},"Tool selection degradation",": An LLM's ability to correctly select tools degrades significantly beyond 30-50 tools",[22,86546,86547,86548,86550],{},"Anthropic's new ",[31,86549,86517],{}," feature solves both first problems by dynamically discovering and loading tools on-demand instead of loading all tool definitions upfront.",[55,86552,86554],{"id":86553},"the-problem-too-many-tools","The Problem: Too Many Tools",[22,86556,86557],{},"The Unified MCP 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 supports 22,566 tools.",[22,86559,86560],{},"Traditional approach problems:",[2354,86562,86563,86566,86569],{},[2357,86564,86565],{},"Loading 200 tool definitions uses 40,000-80,000 tokens",[2357,86567,86568],{},"The LLM API struggles to select the correct tool from such a large set",[2357,86570,86571],{},"You waste context on tools that won't be used in that conversation",[55,86573,86575],{"id":86574},"the-solution-anthropics-defer-loading-tool-search","The Solution: Anthropic's Defer Loading Tool Search",[22,86577,86578,86579,86581],{},"Anthropic's ",[36,86580,86517],{}," feature works with two tool search variants:",[3629,86583,86585],{"id":86584},"tool-search-variants","Tool Search Variants",[22,86587,86588,3970,86591,2980],{},[31,86589,86590],{},"1. Regex Tool Search",[36,86592,86593],{},"tool_search_tool_regex_20251119",[2354,86595,86596,86599,86602],{},[2357,86597,86598],{},"Claude constructs regex patterns to search for tools",[2357,86600,86601],{},"Best for exact matches and pattern-based discovery",[2357,86603,86604],{},"Fast and efficient for well-named tools",[22,86606,86607,3970,86610,2980],{},[31,86608,86609],{},"2. BM25 Tool Search",[36,86611,86612],{},"tool_search_tool_bm25_20251119",[2354,86614,86615,86618,86621],{},[2357,86616,86617],{},"Claude uses natural language queries to search",[2357,86619,86620],{},"Better for semantic understanding",[2357,86622,86623],{},"More flexible for varied naming conventions",[3629,86625,86626],{"id":65088},"How It Works",[2510,86628,86629,86632,86638,86641,86644,86647,86650],{},[2357,86630,86631],{},"You include a tool search tool in your tools list",[2357,86633,86634,86635],{},"You provide all tool definitions with ",[36,86636,86637],{},"defer_loading: true",[2357,86639,86640],{},"Claude sees only the tool search tool initially",[2357,86642,86643],{},"When Claude needs additional tools, it searches dynamically",[2357,86645,86646],{},"The API returns 3-5 most relevant tools",[2357,86648,86649],{},"These are automatically expanded into full definitions",[2357,86651,86652],{},"Claude selects and invokes the appropriate tool",[55,86654,86656],{"id":86655},"implementation","Implementation",[22,86658,86659,86660,86662,86663,86667,86668,86671],{},"To use the new ",[36,86661,86517],{}," tool option, follow these instructions (found ",[41,86664,28103],{"href":86665,"rel":86666},"https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fagents-and-tools\u002Ftool-use\u002Ftool-search-tool#mcp-integration",[45],") when calling Anthropic's ",[36,86669,86670],{},"\u002Fv1\u002Fmessages"," API:",[2354,86673,86674,86688],{},[2357,86675,86676,86677,86680,86681,86684,86685],{},"Add ",[36,86678,86679],{},"\"mcp-client-2025-11-20\"","  to the ",[36,86682,86683],{},"anthropic-beta"," header:\n",[36,86686,86687],{},"anthropic-beta: advanced-tool-use-2025-11-20,mcp-client-2025-11-20",[2357,86689,86690,86691,41511,86693,41515,86695,86697,86698,86700,86701,86704],{},"Add the Unified MCP server's URL for your region (US ",[36,86692,41510],{},[36,86694,41514],{},[36,86696,41518],{},"). Pass a connection-scoped signed token (generated with ",[36,86699,37830],{},", mode=user; works for one connection only) in ",[36,86702,86703],{},"authorization_token",", never in the URL, and keep your workspace API key on your server.",[2584,86706,86708],{"className":7323,"code":86707,"language":7325,"meta":2433,"style":2433},"\"mcp_servers\": [\n  {\n    \"type\": \"url\",\n    \"name\": \"unified-salesforce-server\",\n    \"url\": \"https:\u002F\u002Fmcp-api.unified.to\u002Fmcp?connection=y\",\n    \"authorization_token\": \"\u003Cconnection-scoped signed token>\"\n  }\n],\n",[36,86709,86710,86717,86721,86732,86743,86755,86765,86769],{"__ignoreMap":2433},[414,86711,86712,86715],{"class":2593,"line":2594},[414,86713,86714],{"class":2601},"\"mcp_servers\"",[414,86716,8960],{"class":2705},[414,86718,86719],{"class":2593,"line":2434},[414,86720,18235],{"class":2705},[414,86722,86723,86725,86727,86730],{"class":2593,"line":2613},[414,86724,7337],{"class":2607},[414,86726,7340],{"class":2705},[414,86728,86729],{"class":2601},"\"url\"",[414,86731,2757],{"class":2705},[414,86733,86734,86736,86738,86741],{"class":2593,"line":2625},[414,86735,38476],{"class":2607},[414,86737,7340],{"class":2705},[414,86739,86740],{"class":2601},"\"unified-salesforce-server\"",[414,86742,2757],{"class":2705},[414,86744,86745,86748,86750,86753],{"class":2593,"line":2677},[414,86746,86747],{"class":2607},"    \"url\"",[414,86749,7340],{"class":2705},[414,86751,86752],{"class":2601},"\"https:\u002F\u002Fmcp-api.unified.to\u002Fmcp?connection=y\"",[414,86754,2757],{"class":2705},[414,86756,86757,86760,86762],{"class":2593,"line":2751},[414,86758,86759],{"class":2607},"    \"authorization_token\"",[414,86761,7340],{"class":2705},[414,86763,86764],{"class":2601},"\"\u003Cconnection-scoped signed token>\"\n",[414,86766,86767],{"class":2593,"line":2760},[414,86768,4032],{"class":2705},[414,86770,86771],{"class":2593,"line":2768},[414,86772,10497],{"class":2705},[2354,86774,86775],{},[2357,86776,86777,86778,86780],{},"Then add an additional ",[36,86779,38594],{}," array with configuration on which tools to defer:",[2584,86782,86784],{"className":7323,"code":86783,"language":7325,"meta":2433,"style":2433},"\"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",[36,86785,86786,86793,86797,86808,86817,86821,86825,86836,86847,86854,86863,86867,86874,86881,86891,86895,86899,86903],{"__ignoreMap":2433},[414,86787,86788,86791],{"class":2593,"line":2594},[414,86789,86790],{"class":2601},"\"tools\"",[414,86792,8960],{"class":2705},[414,86794,86795],{"class":2593,"line":2434},[414,86796,18235],{"class":2705},[414,86798,86799,86801,86803,86806],{"class":2593,"line":2613},[414,86800,7337],{"class":2607},[414,86802,7340],{"class":2705},[414,86804,86805],{"class":2601},"\"tool_search_tool_regex_20251119\"",[414,86807,2757],{"class":2705},[414,86809,86810,86812,86814],{"class":2593,"line":2625},[414,86811,38476],{"class":2607},[414,86813,7340],{"class":2705},[414,86815,86816],{"class":2601},"\"tool_search_tool_regex\"\n",[414,86818,86819],{"class":2593,"line":2677},[414,86820,16052],{"class":2705},[414,86822,86823],{"class":2593,"line":2751},[414,86824,18235],{"class":2705},[414,86826,86827,86829,86831,86834],{"class":2593,"line":2760},[414,86828,7337],{"class":2607},[414,86830,7340],{"class":2705},[414,86832,86833],{"class":2601},"\"mcp_toolset\"",[414,86835,2757],{"class":2705},[414,86837,86838,86841,86843,86845],{"class":2593,"line":2768},[414,86839,86840],{"class":2607},"    \"mcp_server_name\"",[414,86842,7340],{"class":2705},[414,86844,86740],{"class":2601},[414,86846,2757],{"class":2705},[414,86848,86849,86852],{"class":2593,"line":2776},[414,86850,86851],{"class":2607},"    \"default_config\"",[414,86853,10477],{"class":2705},[414,86855,86856,86859,86861],{"class":2593,"line":2784},[414,86857,86858],{"class":2607},"      \"defer_loading\"",[414,86860,7340],{"class":2705},[414,86862,10733],{"class":2607},[414,86864,86865],{"class":2593,"line":2792},[414,86866,3548],{"class":2705},[414,86868,86869,86872],{"class":2593,"line":2804},[414,86870,86871],{"class":2607},"    \"configs\"",[414,86873,10477],{"class":2705},[414,86875,86876,86879],{"class":2593,"line":2809},[414,86877,86878],{"class":2607},"      \"list_crm_contacts\"",[414,86880,10477],{"class":2705},[414,86882,86883,86886,86888],{"class":2593,"line":2829},[414,86884,86885],{"class":2607},"        \"defer_loading\"",[414,86887,7340],{"class":2705},[414,86889,86890],{"class":2607},"false\n",[414,86892,86893],{"class":2593,"line":2843},[414,86894,28493],{"class":2705},[414,86896,86897],{"class":2593,"line":2849},[414,86898,10535],{"class":2705},[414,86900,86901],{"class":2593,"line":2854},[414,86902,4032],{"class":2705},[414,86904,86905],{"class":2593,"line":2880},[414,86906,10497],{"class":2705},[2354,86908,86909,86915],{},[2357,86910,9188,86911,86914],{},[36,86912,86913],{},"default_config.defer_loading: true"," option to make all tools deferrable",[2357,86916,9188,86917,86920],{},[36,86918,86919],{},"configs.{tool_id}.defer_loading: true\u002Ffalse"," to set an individual tool to defer (or not)",[22,86922,86923,86924,86926,86927,86930,86931,86933],{},"Or, alternatively, you can call the Unified MCP ",[36,86925,37858],{}," endpoint with parameters ",[36,86928,86929],{},"?type=anthropic&defer_tools=all"," and then feed that ",[36,86932,38594],{}," result into Anthropic's API.",[55,86935,86936],{"id":16608},"Best Practices",[3629,86938,86940],{"id":86939},"_1-keep-core-tools-non-deferred","1. Keep Core Tools Non-Deferred",[22,86942,86943],{},"If you have 3-5 tools that are frequently used, keep them as non-deferred.",[3629,86945,86947],{"id":86946},"_2-use-permissions-to-scope-tools","2. Use Permissions to Scope Tools",[22,86949,86950],{},"Reduce the tool catalog size by requesting only the permissions you need:",[2584,86952,86954],{"className":2689,"code":86953,"language":2691,"meta":2433,"style":2433},"\u002F\u002F Instead of all tools across all categories\npermissions: 'crm_contact_read,crm_contact_write,crm_deal_read'\n\n\u002F\u002F This is better than loading 200+ tools from all categories\n",[36,86955,86956,86961,86970,86974],{"__ignoreMap":2433},[414,86957,86958],{"class":2593,"line":2594},[414,86959,86960],{"class":3527},"\u002F\u002F Instead of all tools across all categories\n",[414,86962,86963,86965,86967],{"class":2593,"line":2434},[414,86964,38588],{"class":2597},[414,86966,7340],{"class":2705},[414,86968,86969],{"class":2601},"'crm_contact_read,crm_contact_write,crm_deal_read'\n",[414,86971,86972],{"class":2593,"line":2613},[414,86973,2740],{"emptyLinePlaceholder":2459},[414,86975,86976],{"class":2593,"line":2625},[414,86977,86978],{"class":3527},"\u002F\u002F This is better than loading 200+ tools from all categories\n",[3629,86980,86982],{"id":86981},"_3-restrict-tools","3. Restrict Tools",[22,86984,86985,86986,86988],{},"Use the Unified MCP ",[36,86987,38594],{}," parameter to restrict which tools will be returned back to the LLM API.",[22,86990,86991,86992,86995],{},"This has a different effect than the ",[36,86993,86994],{},"defer_tools"," 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.",[3629,86997,86999],{"id":86998},"_4-monitor-token-usage","4. Monitor Token Usage",[22,87001,87002],{},"Track your token consumption to understand the benefits:",[2584,87004,87006],{"className":2689,"code":87005,"language":2691,"meta":2433,"style":2433},"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",[36,87007,87008,87035,87061],{"__ignoreMap":2433},[414,87009,87010,87012,87014,87016,87019,87021,87023,87026,87028,87031,87033],{"class":2593,"line":2594},[414,87011,39099],{"class":2705},[414,87013,4064],{"class":2597},[414,87015,2968],{"class":2705},[414,87017,87018],{"class":2601},"`Input tokens: ${",[414,87020,28533],{"class":2705},[414,87022,97],{"class":2601},[414,87024,87025],{"class":2705},"usage",[414,87027,97],{"class":2601},[414,87029,87030],{"class":2705},"input_tokens",[414,87032,3308],{"class":2601},[414,87034,3156],{"class":2705},[414,87036,87037,87039,87041,87043,87046,87048,87050,87052,87054,87057,87059],{"class":2593,"line":2434},[414,87038,39099],{"class":2705},[414,87040,4064],{"class":2597},[414,87042,2968],{"class":2705},[414,87044,87045],{"class":2601},"`Output tokens: ${",[414,87047,28533],{"class":2705},[414,87049,97],{"class":2601},[414,87051,87025],{"class":2705},[414,87053,97],{"class":2601},[414,87055,87056],{"class":2705},"output_tokens",[414,87058,3308],{"class":2601},[414,87060,3156],{"class":2705},[414,87062,87063,87065,87067,87069,87072,87074,87076,87078,87080,87083,87085,87088,87090],{"class":2593,"line":2613},[414,87064,39099],{"class":2705},[414,87066,4064],{"class":2597},[414,87068,2968],{"class":2705},[414,87070,87071],{"class":2601},"`Tool search requests: ${",[414,87073,28533],{"class":2705},[414,87075,97],{"class":2601},[414,87077,87025],{"class":2705},[414,87079,97],{"class":2601},[414,87081,87082],{"class":2705},"server_tool_use",[414,87084,40393],{"class":2601},[414,87086,87087],{"class":2705},"tool_search_requests",[414,87089,3308],{"class":2601},[414,87091,3156],{"class":2705},[3629,87093,87095],{"id":87094},"_5-combine-with-prompt-caching","5. Combine with Prompt Caching",[22,87097,3370,87098,87103],{},[41,87099,87102],{"href":87100,"rel":87101},"https:\u002F\u002Fwww.notion.so\u002Fguides\u002Fbuilding_ai_applications_with_unified_and_langbase",[45],"prompt caching"," with defer_loading for multi-turn conversations:",[2584,87105,87107],{"className":2689,"code":87106,"language":2691,"meta":2433,"style":2433},"messages.push({\n    role: \"user\",\n    content: \"Now find their recent deals\",\n    cache_control: { type: \"ephemeral\" }\n});\n",[36,87108,87109,87118,87127,87137,87147],{"__ignoreMap":2433},[414,87110,87111,87114,87116],{"class":2593,"line":2594},[414,87112,87113],{"class":2705},"messages.",[414,87115,25040],{"class":2597},[414,87117,2826],{"class":2705},[414,87119,87120,87123,87125],{"class":2593,"line":2434},[414,87121,87122],{"class":2705},"    role: ",[414,87124,38071],{"class":2601},[414,87126,2757],{"class":2705},[414,87128,87129,87132,87135],{"class":2593,"line":2613},[414,87130,87131],{"class":2705},"    content: ",[414,87133,87134],{"class":2601},"\"Now find their recent deals\"",[414,87136,2757],{"class":2705},[414,87138,87139,87142,87145],{"class":2593,"line":2625},[414,87140,87141],{"class":2705},"    cache_control: { type: ",[414,87143,87144],{"class":2601},"\"ephemeral\"",[414,87146,8986],{"class":2705},[414,87148,87149],{"class":2593,"line":2677},[414,87150,2846],{"class":2705},[55,87152,87154],{"id":87153},"tool-search-limits","Tool Search Limits",[22,87156,87157],{},"Be aware of these limits:",[2354,87159,87160,87166,87172,87178],{},[2357,87161,87162,87165],{},[31,87163,87164],{},"Maximum tools",": 10,000 tools in your catalog",[2357,87167,87168,87171],{},[31,87169,87170],{},"Search results",": Returns 3-5 most relevant tools per search",[2357,87173,87174,87177],{},[31,87175,87176],{},"Pattern length",": Maximum 200 characters for regex patterns",[2357,87179,87180,87183],{},[31,87181,87182],{},"Model support",": Claude Sonnet 4.5+ and Opus 4.5+ only",[55,87185,87187],{"id":87186},"when-to-use-defer-loading","When to Use Defer Loading",[22,87189,87190],{},[31,87191,87192],{},"Good use cases:",[2354,87194,87195,87198,87201,87204,87207],{},[2357,87196,87197],{},"20+ tools available from Unified connections",[2357,87199,87200],{},"Multiple integrations (CRM + ATS + HRIS + Storage)",[2357,87202,87203],{},"Building multi-tenant applications where each tenant has different integrations",[2357,87205,87206],{},"Context window is getting tight with tool definitions",[2357,87208,87209],{},"Tool selection accuracy is degrading",[22,87211,87212],{},[31,87213,87214],{},"When traditional tool calling might be better:",[2354,87216,87217,87220,87223],{},[2357,87218,87219],{},"Less than 10 tools total",[2357,87221,87222],{},"All tools are frequently used in every request",[2357,87224,87225],{},"Very focused single-integration use case",[55,87227,87229],{"id":87228},"real-world-example-multi-integration-assistant","Real-World Example: Multi-Integration Assistant",[22,87231,87232],{},"Here's a practical example of a customer support assistant that accesses multiple integrations:",[2584,87234,87236],{"className":2689,"code":87235,"language":2691,"meta":2433,"style":2433},"async function createSupportAssistant(crm_connection_id, hris_connection_id, zendesk_connection_id) {\n    \u002F\u002F 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    \u002F\u002F Combine all tools with defer_loading\n    const tools = [\n        ...crmTools,\n        ...ticketingTools,\n        ...hrisTools\n    ];\n\n    \u002F\u002F 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",[36,87237,87238,87264,87269,87303,87332,87361,87365,87370,87380,87388,87395,87402,87407,87411,87416,87428,87438,87448,87457,87462,87470,87478,87483,87488,87492],{"__ignoreMap":2433},[414,87239,87240,87242,87244,87247,87249,87252,87254,87257,87259,87262],{"class":2593,"line":2594},[414,87241,3928],{"class":2698},[414,87243,2962],{"class":2698},[414,87245,87246],{"class":2597}," createSupportAssistant",[414,87248,2968],{"class":2705},[414,87250,87251],{"class":2971},"crm_connection_id",[414,87253,319],{"class":2705},[414,87255,87256],{"class":2971},"hris_connection_id",[414,87258,319],{"class":2705},[414,87260,87261],{"class":2971},"zendesk_connection_id",[414,87263,3826],{"class":2705},[414,87265,87266],{"class":2593,"line":2434},[414,87267,87268],{"class":3527},"    \u002F\u002F Fetch tools from multiple Unified connections\n",[414,87270,87271,87273,87276,87278,87280,87283,87286,87289,87292,87295,87298,87301],{"class":2593,"line":2613},[414,87272,3986],{"class":2698},[414,87274,87275],{"class":2607}," crmTools",[414,87277,2817],{"class":2698},[414,87279,3002],{"class":2698},[414,87281,87282],{"class":2597}," fetchUnifiedTools",[414,87284,87285],{"class":2705},"(crm_connection_id, ",[414,87287,87288],{"class":2601},"'crm_contact_read,crm_deal_read'",[414,87290,87291],{"class":2705},", { type: ",[414,87293,87294],{"class":2601},"'anthropic'",[414,87296,87297],{"class":2705},", defer_tools: ",[414,87299,87300],{"class":2601},"'list_crm_'",[414,87302,2846],{"class":2705},[414,87304,87305,87307,87310,87312,87314,87316,87319,87322,87324,87326,87328,87330],{"class":2593,"line":2625},[414,87306,3986],{"class":2698},[414,87308,87309],{"class":2607}," ticketingTools",[414,87311,2817],{"class":2698},[414,87313,3002],{"class":2698},[414,87315,87282],{"class":2597},[414,87317,87318],{"class":2705},"(zendesk_connection_id, ",[414,87320,87321],{"class":2601},"'ticketing_ticket_read,ticketing_ticket_write'",[414,87323,87291],{"class":2705},[414,87325,87294],{"class":2601},[414,87327,87297],{"class":2705},[414,87329,87300],{"class":2601},[414,87331,2846],{"class":2705},[414,87333,87334,87336,87339,87341,87343,87345,87348,87351,87353,87355,87357,87359],{"class":2593,"line":2677},[414,87335,3986],{"class":2698},[414,87337,87338],{"class":2607}," hrisTools",[414,87340,2817],{"class":2698},[414,87342,3002],{"class":2698},[414,87344,87282],{"class":2597},[414,87346,87347],{"class":2705},"(hris_connection_id, ",[414,87349,87350],{"class":2601},"'hris_employee_read'",[414,87352,87291],{"class":2705},[414,87354,87294],{"class":2601},[414,87356,87297],{"class":2705},[414,87358,87300],{"class":2601},[414,87360,2846],{"class":2705},[414,87362,87363],{"class":2593,"line":2751},[414,87364,2740],{"emptyLinePlaceholder":2459},[414,87366,87367],{"class":2593,"line":2760},[414,87368,87369],{"class":3527},"    \u002F\u002F Combine all tools with defer_loading\n",[414,87371,87372,87374,87376,87378],{"class":2593,"line":2768},[414,87373,3986],{"class":2698},[414,87375,40189],{"class":2607},[414,87377,2817],{"class":2698},[414,87379,3258],{"class":2705},[414,87381,87382,87385],{"class":2593,"line":2776},[414,87383,87384],{"class":2698},"        ...",[414,87386,87387],{"class":2705},"crmTools,\n",[414,87389,87390,87392],{"class":2593,"line":2784},[414,87391,87384],{"class":2698},[414,87393,87394],{"class":2705},"ticketingTools,\n",[414,87396,87397,87399],{"class":2593,"line":2792},[414,87398,87384],{"class":2698},[414,87400,87401],{"class":2705},"hrisTools\n",[414,87403,87404],{"class":2593,"line":2804},[414,87405,87406],{"class":2705},"    ];\n",[414,87408,87409],{"class":2593,"line":2809},[414,87410,2740],{"emptyLinePlaceholder":2459},[414,87412,87413],{"class":2593,"line":2829},[414,87414,87415],{"class":3527},"    \u002F\u002F Total: 150+ tools, with all listX tools being deffered\n",[414,87417,87418,87420,87422,87424,87426],{"class":2593,"line":2843},[414,87419,25149],{"class":2698},[414,87421,3002],{"class":2698},[414,87423,38941],{"class":2705},[414,87425,28901],{"class":2597},[414,87427,2826],{"class":2705},[414,87429,87430,87433,87436],{"class":2593,"line":2849},[414,87431,87432],{"class":2705},"        model: ",[414,87434,87435],{"class":2601},"\"claude-sonnet-4-5-20250929\"",[414,87437,2757],{"class":2705},[414,87439,87440,87443,87446],{"class":2593,"line":2854},[414,87441,87442],{"class":2705},"        betas: [",[414,87444,87445],{"class":2601},"\"advanced-tool-use-2025-11-20\"",[414,87447,10497],{"class":2705},[414,87449,87450,87453,87455],{"class":2593,"line":2880},[414,87451,87452],{"class":2705},"        max_tokens: ",[414,87454,38131],{"class":2607},[414,87456,2757],{"class":2705},[414,87458,87459],{"class":2593,"line":3253},[414,87460,87461],{"class":2705},"        messages: [{\n",[414,87463,87464,87466,87468],{"class":2593,"line":3261},[414,87465,38973],{"class":2705},[414,87467,38071],{"class":2601},[414,87469,2757],{"class":2705},[414,87471,87472,87475],{"class":2593,"line":3279},[414,87473,87474],{"class":2705},"            content: ",[414,87476,87477],{"class":2601},"\"Customer John Doe from Acme Corp called about ticket #12345. Show me his account info, open tickets, and any recent deals.\"\n",[414,87479,87480],{"class":2593,"line":3313},[414,87481,87482],{"class":2705},"        }],\n",[414,87484,87485],{"class":2593,"line":3326},[414,87486,87487],{"class":2705},"        tools: tools\n",[414,87489,87490],{"class":2593,"line":3339},[414,87491,25779],{"class":2705},[414,87493,87494],{"class":2593,"line":3359},[414,87495,3035],{"class":2705},[55,87497,23949],{"id":23948},[2354,87499,87500,87507,87514,87521,87528,87534],{},[2357,87501,87502],{},[41,87503,87506],{"href":87504,"rel":87505},"https:\u002F\u002Fdocs.unified.to\u002Fmcp\u002Foverview",[45],"Unified MCP Server Overview",[2357,87508,87509],{},[41,87510,87513],{"href":87511,"rel":87512},"https:\u002F\u002Fdocs.unified.to\u002Fmcp\u002Finstallation",[45],"MCP Installation & Usage",[2357,87515,87516],{},[41,87517,87520],{"href":87518,"rel":87519},"https:\u002F\u002Fdocs.unified.to\u002Fmcp\u002Fserver-options",[45],"MCP Server Options",[2357,87522,87523],{},[41,87524,87527],{"href":87525,"rel":87526},"https:\u002F\u002Fplatform.claude.com\u002Fdocs\u002Fen\u002Fagents-and-tools\u002Ftool-use\u002Ftool-search-tool",[45],"Anthropic Tool Search Documentation",[2357,87529,87530],{},[41,87531,87533],{"href":86665,"rel":87532},[45],"Anthropic MCP Integration Guide",[2357,87535,87536,87541],{},[41,87537,87540],{"href":87538,"rel":87539},"https:\u002F\u002Funified.to\u002Fblog\u002Fbest_mcp_servers_for_connecting_ai_agents_to_saas_apis",[45],"Best MCP Servers for Connecting AI Agents to SaaS APIs",": how ten MCP servers compare on tool filtering, deferred loading and scope",[55,87543,87545],{"id":87544},"tldr","TLDR",[22,87547,86578,87548,87550],{},[36,87549,86517],{}," 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:",[2354,87552,87553,87559,87565,87571],{},[2357,87554,87555,87558],{},[31,87556,87557],{},"Scale to hundreds of tools"," across multiple integrations",[2357,87560,87561,87564],{},[31,87562,87563],{},"Reduce context usage"," by 80-90%",[2357,87566,87567,87570],{},[31,87568,87569],{},"Improve tool selection accuracy"," significantly",[2357,87572,87573,87576],{},[31,87574,87575],{},"Build more capable AI assistants"," that access diverse data sources",[22,87578,87579],{},"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.",[22,87581,87582],{},"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.",[4156,87584,87585],{},"html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}",{"title":2433,"searchDepth":2434,"depth":2434,"links":87587},[87588,87589,87593,87594,87601,87602,87603,87604,87605],{"id":86553,"depth":2434,"text":86554},{"id":86574,"depth":2434,"text":86575,"children":87590},[87591,87592],{"id":86584,"depth":2613,"text":86585},{"id":65088,"depth":2613,"text":86626},{"id":86655,"depth":2434,"text":86656},{"id":16608,"depth":2434,"text":86936,"children":87595},[87596,87597,87598,87599,87600],{"id":86939,"depth":2613,"text":86940},{"id":86946,"depth":2613,"text":86947},{"id":86981,"depth":2613,"text":86982},{"id":86998,"depth":2613,"text":86999},{"id":87094,"depth":2613,"text":87095},{"id":87153,"depth":2434,"text":87154},{"id":87186,"depth":2434,"text":87187},{"id":87228,"depth":2434,"text":87229},{"id":23948,"depth":2434,"text":23949},{"id":87544,"depth":2434,"text":87545},"Learn how to use Anthropic's and OpenAI's `defer_loading` tool search features with Unified's MCP server to efficiently manage hundreds of tools while...",{"img":87608,"date":87609,"updated":87610,"tag":2457,"integrations":87611},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fscaling_mcp_tools_with_anthropic_and_openai_defer_loading-icon.png","2025-12-25T18:46:00.000Z","2026-10-12T21:49:40.095Z","anthropic, openai","\u002Fguides\u002Fscaling_mcp_tools_with_anthropic_and_openai_defer_loading",{"title":86499,"description":87606},"guides\u002Fscaling_mcp_tools_with_anthropic_and_openai_defer_loading","PLKle0ZPrkake3sSM6holMmi6he0kKueor39SgCStPo",{"id":87617,"title":87618,"body":87619,"description":87903,"extension":2452,"meta":87904,"navigation":2459,"path":87908,"seo":87909,"stem":87910,"__hash__":87911},"guides\u002Fguides\u002Fset_environments_for_your_unified_workspace.md","Set Environments for your Unified.to Workspace",{"type":12,"value":87620,"toc":87894},[87621,87624,87626,87631,87634,87643,87647,87650,87653,87659,87663,87689,87693,87713,87717,87720,87725,87732,87735,87740,87747,87750,87755,87762,87765,87770,87777,87780,87784,87787,87792,87808,87813,87847,87851,87854,87874,87877,87881,87884,87887],[15,87622,87618],{"id":87623},"set-environments-for-your-unifiedto-workspace",[19,87625],{},[22,87627,87628],{},[25,87629,87630],{},"June 7, 2023",[22,87632,87633],{},"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 Unified API.",[22,87635,87636],{},[41,87637,87640],{"href":87638,"rel":87639},"https:\u002F\u002Fapp.unified.to\u002F?utm_source=blog&utm_medium=blog&utm_campaign=environments&utm_content=environments_blog",[45],[31,87641,87642],{},"Try it now",[55,87644,87646],{"id":87645},"what-is-an-environment","What is an environment?",[22,87648,87649],{},"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.",[22,87651,87652],{},"Environments can be added under any plan in your Unified.to account's Workspace.",[22,87654,87655],{},[4201,87656],{"alt":87657,"src":87658},"UnifiedAPI_Environments.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fset_environments_for_your_unified_workspace-0.png",[55,87660,87662],{"id":87661},"capabilities-of-environments","Capabilities of environments",[2354,87664,87665,87671,87677,87683],{},[2357,87666,87667,87670],{},[31,87668,87669],{},"Integration testing:"," Before releasing integrations to production, you can now test them in a different environment.",[2357,87672,87673,87676],{},[31,87674,87675],{},"Multiple environments:"," You can set up multiple environments such as production, staging, and others personalized to you and your team's needs.",[2357,87678,87679,87682],{},[31,87680,87681],{},"Environment-specific integrations:"," You can now decide which integrations are active in each environment.",[2357,87684,87685,87688],{},[31,87686,87687],{},"Application credential assignment:"," Choose which application credentials to use for each integration in each environment.",[55,87690,87692],{"id":87691},"benefits-of-environments","Benefits of environments",[2354,87694,87695,87701,87707],{},[2357,87696,87697,87700],{},[31,87698,87699],{},"Greater flexibility:"," You can tailor your integrations to meet the unique needs of each environment including client specifications.",[2357,87702,87703,87706],{},[31,87704,87705],{},"Reduced errors:"," Testing integrations in a staging environment before moving them to production helps minimize mistakes and unexpected errors.",[2357,87708,87709,87712],{},[31,87710,87711],{},"Increased productivity:"," This feature streamlines the management of your workspace, reducing time spent on setup and adjustments.",[55,87714,87716],{"id":87715},"when-to-use-multiple-environments","When to use multiple environments",[22,87718,87719],{},"Set multiple environments regardless of what plan you're on for different scenarios:",[22,87721,87722],{},[31,87723,87724],{},"1. Localhost",[22,87726,87727],{},[25,87728,87729],{},[31,87730,87731],{},"Create a sandbox environment without disrupting your team's workflow or end-user experience",[22,87733,87734],{},"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.",[22,87736,87737],{},[31,87738,87739],{},"2. Testing or QA",[22,87741,87742],{},[25,87743,87744],{},[31,87745,87746],{},"Try out new integrations and run tests before releasing them to production",[22,87748,87749],{},"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.",[22,87751,87752],{},[31,87753,87754],{},"3. Staging",[22,87756,87757],{},[25,87758,87759],{},[31,87760,87761],{},"Mirror your production environment to finely-tune performance and perform final tests",[22,87763,87764],{},"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.",[22,87766,87767],{},[31,87768,87769],{},"4. Production",[22,87771,87772],{},[25,87773,87774],{},[31,87775,87776],{},"Your live environment where your integrations run and are available to end-users",[22,87778,87779],{},"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.",[55,87781,87783],{"id":87782},"how-to-set-new-environments","How to set new environments",[22,87785,87786],{},"Implement this new feature in seconds. Follow these steps:",[22,87788,87789],{},[31,87790,87791],{},"Setting up Environments",[2510,87793,87794,87800,87805],{},[2357,87795,87796,87797],{},"Log in to or create a ",[41,87798,68584],{"href":87638,"rel":87799},[45],[2357,87801,21005,87802,87804],{},[31,87803,22149],{}," and insert the name of your new environment, (e.g., 'Staging') and press enter",[2357,87806,87807],{},"Once entered, your environment can be used for configuring individual integrations and generating an Embedded Directory",[22,87809,87810],{},[31,87811,87812],{},"Configuring Integrations",[2510,87814,87815,87826,87835,87844],{},[2357,87816,16270,87817,87819,87820,87822],{},[31,87818,4433],{}," and click ACTIVATE on any integration, for example, Workday",[5888,87821],{},[4201,87823],{"alt":87824,"src":87825},"CleanShot_2023-06-08_at_09.12.242x.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fset_environments_for_your_unified_workspace-1.png",[2357,87827,87828,87829,87831],{},"From the dropdown menu, select the environment where you to want to add credentials, such OAuth Client ID and Secret",[5888,87830],{},[4201,87832],{"alt":87833,"src":87834},"Workday_Environment_Selection.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fset_environments_for_your_unified_workspace-2.png",[2357,87836,87837,87838,87840],{},"Input your credentials for Workday for the selected environment and click ACTIVATE",[5888,87839],{},[4201,87841],{"alt":87842,"src":87843},"Note: If you are activating an integration that supports API key and doesn't require OAuth credentials, then you can just click ACTIVATE.","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fset_environments_for_your_unified_workspace-3.png",[2357,87845,87846],{},"Repeat for any integration and environment",[55,87848,87850],{"id":87849},"embed-directory","Embed Directory",[22,87852,87853],{},"After enabling integrations for a specific environment, you can generate an Embedded Directory for that environment.",[2510,87855,87856,87865],{},[2357,87857,87858,87859,87861],{},"Select the desired authentication environment from the dropdown menu.",[5888,87860],{},[4201,87862],{"alt":87863,"src":87864},"Embedded_Directory_Environment.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fset_environments_for_your_unified_workspace-4.png",[2357,87866,87867,87868,87870],{},"This will generate a script with a new environment parameter for you.",[5888,87869],{},[4201,87871],{"alt":87872,"src":87873},"Directory_Script.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fset_environments_for_your_unified_workspace-5.png",[22,87875,87876],{},"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.",[55,87878,87880],{"id":87879},"building-the-ultimate-unified-api-solution-for-integrations","Building the ultimate Unified API solution for integrations",[22,87882,87883],{},"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.",[22,87885,87886],{},"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.",[22,87888,87889,87890,97],{},"You can try setting Unified.to's Authentication Environments at ",[41,87891,87893],{"href":87638,"rel":87892},[45],"unified.to\u002Fget-started",{"title":2433,"searchDepth":2434,"depth":2434,"links":87895},[87896,87897,87898,87899,87900,87901,87902],{"id":87645,"depth":2434,"text":87646},{"id":87661,"depth":2434,"text":87662},{"id":87691,"depth":2434,"text":87692},{"id":87715,"depth":2434,"text":87716},{"id":87782,"depth":2434,"text":87783},{"id":87849,"depth":2434,"text":87850},{"id":87879,"depth":2434,"text":87880},"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...",{"img":87905,"date":87906,"updated":87907,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fset_environments_for_your_unified_workspace-icon.png","2023-06-07T00:00:00.000Z","2026-05-28T13:35:31.912Z","\u002Fguides\u002Fset_environments_for_your_unified_workspace",{"title":87618,"description":87903},"guides\u002Fset_environments_for_your_unified_workspace","sVn-1M2W3zlBsC3WKwUaJ0ydpgRXPpTXlxc2v6m-_4A",{"id":87913,"title":87914,"body":87915,"description":88322,"extension":2452,"meta":88323,"navigation":2459,"path":88327,"seo":88328,"stem":88329,"__hash__":88330},"guides\u002Fguides\u002Fsetting_up_a_slack_bot_connection_with_unified.md","Setting up a Slack Bot Connection with Unified.to",{"type":12,"value":87916,"toc":88310},[87917,87920,87922,87927,87932,87934,87936,87939,87996,87998,88002,88005,88052,88059,88062,88064,88068,88082,88084,88088,88091,88094,88155,88160,88162,88166,88181,88183,88187,88200,88203,88205,88209,88212,88228,88230,88234,88237,88248,88251,88253,88256,88259,88262,88264,88266],[15,87918,87914],{"id":87919},"setting-up-a-slack-bot-connection-with-unifiedto",[19,87921],{},[22,87923,87924],{},[25,87925,87926],{},"June 16, 2026",[4937,87928,87929],{},[22,87930,87931],{},"This guide walks you through connecting Slack Bot (slackbot) to Unified.to — including the Slack app settings you need for sending messages, interactive buttons, and receiving button-click events as Unified MessagingEvent webhooks.",[19,87933],{},[55,87935,4426],{"id":4425},[22,87937,87938],{},"A Slack Bot integration has three parts:",[155,87940,87941,87953],{},[158,87942,87943],{},[161,87944,87945,87948,87951],{},[164,87946,87947],{},"Part",[164,87949,87950],{},"Where",[164,87952,8629],{},[174,87954,87955,87966,87976,87987],{},[161,87956,87957,87960,87963],{},[179,87958,87959],{},"Slack app",[179,87961,87962],{},"api.slack.com",[179,87964,87965],{},"OAuth credentials, bot scopes, and request URLs Slack calls when events occur",[161,87967,87968,87971,87973],{},[179,87969,87970],{},"Connection",[179,87972,65505],{},[179,87974,87975],{},"Authorizes your Slack workspace and stores the bot token",[161,87977,87978,87981,87984],{},[179,87979,87980],{},"Webhook subscription",[179,87982,87983],{},"Unified dashboard or API",[179,87985,87986],{},"Tells Unified where to deliver normalized MessagingEvent payloads",[161,87988,87989,87992,87994],{},[179,87990,87991],{},"You can use Unified's shared Slack OAuth app (fastest) or register your own Slack app if you need full control over the app configuration.",[179,87993],{},[179,87995],{},[19,87997],{},[55,87999,88001],{"id":88000},"important-two-different-urls","Important: two different URLs",[22,88003,88004],{},"Slack and your application use different webhook URLs. Do not point Slack at the same URL you use as your Unified hook_url.",[155,88006,88007,88019],{},[158,88008,88009],{},[161,88010,88011,88013,88016],{},[164,88012,50132],{},[164,88014,88015],{},"Configured in",[164,88017,88018],{},"Receives",[174,88020,88021,88032,88043],{},[161,88022,88023,88026,88029],{},[179,88024,88025],{},"Unified workspace webhook",[179,88027,88028],{},"Slack → Event Subscriptions & Interactivity → Request URL",[179,88030,88031],{},"Raw Slack Events API and interactive payloads from Slack",[161,88033,88034,88037,88040],{},[179,88035,88036],{},"Your hook_url",[179,88038,88039],{},"Unified → Webhooks → Create Webhook",[179,88041,88042],{},"Normalized Unified MessagingEvent objects",[161,88044,88045,88048,88050],{},[179,88046,88047],{},"Flow: Slack → Unified workspace webhook → Unified converts the event → POST to your hook_url.",[179,88049],{},[179,88051],{},[22,88053,88054,88055],{},"Use your regional Unified API host and include your workspace ID, for example: ",[41,88056,88057],{"href":88057,"rel":88058},"https:\u002F\u002Fapi.unified.to\u002Fwebhook\u002Fworkspace\u002Fslackbot?workspace_id=YOUR_WORKSPACE_ID",[45],[22,88060,88061],{},"EU and AU workspaces should use the corresponding regional API host (for example api-eu.unified.to or api-au.unified.to).",[19,88063],{},[55,88065,88067],{"id":88066},"step-1-create-a-slack-app","Step 1 — Create a Slack app",[2510,88069,88070,88076,88079],{},[2357,88071,21005,88072,88075],{},[41,88073,57565],{"href":57565,"rel":88074},[45]," → Create New App → From scratch.",[2357,88077,88078],{},"Name the app and select the Slack workspace you want to connect.",[2357,88080,88081],{},"Click Create App.",[19,88083],{},[55,88085,88087],{"id":88086},"step-2-add-oauth-scopes","Step 2 — Add OAuth scopes",[22,88089,88090],{},"Open OAuth & Permissions → Scopes → Bot Token Scopes and add the scopes for the objects you plan to use.",[22,88092,88093],{},"Minimum for sending messages, reading history, and receiving button clicks:",[155,88095,88096,88105],{},[158,88097,88098],{},[161,88099,88100,88103],{},[164,88101,88102],{},"Scope",[164,88104,8629],{},[174,88106,88107,88115,88123,88131,88139,88147],{},[161,88108,88109,88112],{},[179,88110,88111],{},"chat:write",[179,88113,88114],{},"Send messages and messages with buttons",[161,88116,88117,88120],{},[179,88118,88119],{},"channels:read \u002F groups:read \u002F im:read \u002F mpim:read",[179,88121,88122],{},"List channels and DMs",[161,88124,88125,88128],{},[179,88126,88127],{},"channels:history \u002F groups:history \u002F im:history \u002F mpim:history",[179,88129,88130],{},"Read message history",[161,88132,88133,88136],{},[179,88134,88135],{},"users:read \u002F users:read.email \u002F users.profile:read",[179,88137,88138],{},"Resolve message authors and button clickers",[161,88140,88141,88144],{},[179,88142,88143],{},"reactions:read",[179,88145,88146],{},"Reaction events (optional)",[161,88148,88149,88152],{},[179,88150,88151],{},"files:read \u002F files:write",[179,88153,88154],{},"Attachments (optional)",[4937,88156,88157],{},[22,88158,88159],{},"These mirror the messaging_message_write and messaging_event_read scope sets for the slackbot integration. Add additional scopes only if you use those objects.",[19,88161],{},[55,88163,88165],{"id":88164},"step-3-set-the-oauth-redirect-url","Step 3 — Set the OAuth redirect URL",[2510,88167,88168,88171,88178],{},[2357,88169,88170],{},"Under OAuth & Permissions → Redirect URLs, click Add New Redirect URL.",[2357,88172,88173,88174,88177],{},"Paste the Unified OAuth callback URL shown in the dashboard when you connect Slack (bot). It looks like ",[41,88175,21741],{"href":21741,"rel":88176},[45]," (use your region's host if applicable).",[2357,88179,88180],{},"Save URLs.",[19,88182],{},[55,88184,88186],{"id":88185},"step-4-enable-interactivity","Step 4 — Enable Interactivity",[2510,88188,88189,88192,88198],{},[2357,88190,88191],{},"Go to Interactivity & Shortcuts and turn Interactivity ON.",[2357,88193,88194,88195],{},"Set Request URL to your Unified workspace webhook (not your hook_url): ",[41,88196,88057],{"href":88057,"rel":88197},[45],[2357,88199,53211],{},[22,88201,88202],{},"Unified receives Slack block_actions payloads here, converts button clicks into MessagingEvent objects with type BUTTON_CLICK, and forwards them to your hook_url.",[19,88204],{},[55,88206,88208],{"id":88207},"step-5-optional-enable-event-subscriptions","Step 5 — (Optional) Enable Event Subscriptions",[22,88210,88211],{},"Enable this if you also want message, reaction, or channel membership events (not just button clicks).",[2510,88213,88214,88217,88223,88226],{},[2357,88215,88216],{},"Go to Event Subscriptions and turn it ON.",[2357,88218,88219,88220],{},"Set Request URL to the same Unified workspace webhook URL as Step 4: ",[41,88221,88057],{"href":88057,"rel":88222},[45],[2357,88224,88225],{},"Under Subscribe to bot events, add the events you need, for example message.channels, app_mention, reaction_added, member_joined_channel.",[2357,88227,53211],{},[19,88229],{},[55,88231,88233],{"id":88232},"step-6-activate-the-integration-create-a-connection-and-add-a-webhook","Step 6 — Activate the integration, create a connection, and add a webhook",[22,88235,88236],{},"In the Unified dashboard (or via API), complete all three steps below.",[2510,88238,88239,88242,88245],{},[2357,88240,88241],{},"Go to Integrations and activate Slack (bot) for your environment. If you use your own Slack app, enter your Client ID and Client Secret.",[2357,88243,88244],{},"Create a connection for the Slack (bot) integration and complete the OAuth flow to install the app into your Slack workspace.",[2357,88246,88247],{},"Create a webhook on that connection with object type messaging_event and event created. Set hook_url to your application endpoint (the URL where you want to receive Unified payloads).",[22,88249,88250],{},"Your hook_url is only configured on the Unified webhook subscription. Slack should always send events to the Unified workspace webhook from Steps 4–5.",[19,88252],{},[55,88254,88255],{"id":62599},"Receiving events",[22,88257,88258],{},"When a user clicks a button or triggers a subscribed Slack event, Unified POSTs a normalized payload to your hook_url. Button clicks arrive as MessagingEvent objects with type BUTTON_CLICK — not as raw Slack block_actions JSON.",[22,88260,88261],{},"See the Unified webhook documentation for payload structure, signatures, and verification.",[19,88263],{},[55,88265,5622],{"id":5621},[155,88267,88268,88276],{},[158,88269,88270],{},[161,88271,88272,88274],{},[164,88273,37665],{},[164,88275,7838],{},[174,88277,88278,88286,88294,88302],{},[161,88279,88280,88283],{},[179,88281,88282],{},"Slack URL verification fails",[179,88284,88285],{},"Request URL is missing workspace_id, uses the wrong regional host, or Unified cannot be reached from Slack",[161,88287,88288,88291],{},[179,88289,88290],{},"Button clicks never reach my application",[179,88292,88293],{},"Interactivity Request URL is not set to the Unified workspace webhook, or no Unified webhook with hook_url was created",[161,88295,88296,88299],{},[179,88297,88298],{},"My endpoint receives raw Slack JSON",[179,88300,88301],{},"Slack Request URL was set to your hook_url instead of the Unified workspace webhook",[161,88303,88304,88307],{},[179,88305,88306],{},"invalid_auth or missing scopes",[179,88308,88309],{},"Re-install the Slack app after adding scopes (Slack requires re-consent)",{"title":2433,"searchDepth":2434,"depth":2434,"links":88311},[88312,88313,88314,88315,88316,88317,88318,88319,88320,88321],{"id":4425,"depth":2434,"text":4426},{"id":88000,"depth":2434,"text":88001},{"id":88066,"depth":2434,"text":88067},{"id":88086,"depth":2434,"text":88087},{"id":88164,"depth":2434,"text":88165},{"id":88185,"depth":2434,"text":88186},{"id":88207,"depth":2434,"text":88208},{"id":88232,"depth":2434,"text":88233},{"id":62599,"depth":2434,"text":88255},{"id":5621,"depth":2434,"text":5622},"> This guide walks you through connecting Slack Bot (slackbot) to Unified.to — including the Slack app settings you need for sending messages, interactive...",{"img":88324,"date":88325,"updated":88326,"tag":2457,"integrations":57801},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fsetting_up_a_slack_bot_connection_with_unified-icon.png","2026-06-16T14:29:00.000Z","2026-08-23T14:54:21.285Z","\u002Fguides\u002Fsetting_up_a_slack_bot_connection_with_unified",{"title":87914,"description":88322},"guides\u002Fsetting_up_a_slack_bot_connection_with_unified","f8WIRuxoNHK15JIT6U1tiHDswgYNZeZg72-_oqfM0tw",{"id":88332,"title":88333,"body":88334,"description":88571,"extension":2452,"meta":88572,"navigation":2459,"path":88576,"seo":88577,"stem":88578,"__hash__":88579},"guides\u002Fguides\u002Fsetting_up_oauth_2_credentials_for_greenhouse_apis.md","Setting up OAuth 2 Credentials for Greenhouse's APIs",{"type":12,"value":88335,"toc":88565},[88336,88339,88341,88346,88350,88356,88388,88392,88450,88454,88458,88461,88487,88491,88494,88508,88511,88515,88518,88530,88535,88538,88560],[15,88337,88333],{"id":88338},"setting-up-oauth-2-credentials-for-greenhouses-apis",[19,88340],{},[22,88342,88343],{},[25,88344,88345],{},"May 27, 2024",[55,88347,88349],{"id":88348},"important-read-this-first","Important — Read this first!",[22,88351,88352,88353,88355],{},"Unified.to has ",[25,88354,75938],{}," integrations name with the name 'Greenhouse':",[2510,88357,88358,88375],{},[2357,88359,88360,88361,88363,88364,34,88371,88374],{},"The first one that appears in the ",[31,88362,4433],{}," page is for Greenhouse's ",[41,88365,88368],{"href":88366,"rel":88367},"https:\u002F\u002Fsupport.greenhouse.io\u002Fhc\u002Fen-us\u002Farticles\u002F360029266032-Harvest-API-overview",[45],[31,88369,88370],{},"Harvest API",[31,88372,88373],{},"(v3)",", which  uses OAuth2 code-flow to authorize your application.  For most of the use-cases, you should use this integration.",[2357,88376,88377,88378,88363,88380,88387],{},"The second one that appears in the  ",[31,88379,4433],{},[41,88381,88384],{"href":88382,"rel":88383},"https:\u002F\u002Fdevelopers.greenhouse.io\u002Fcandidate-ingestion.html",[45],[31,88385,88386],{},"Candidate Ingestion API",", which uses OAuth 2 client-credentials-flow to authorize your application.",[15,88389,88391],{"id":88390},"greenhouse-harvest-api-v3","Greenhouse Harvest API (v3)",[2510,88393,88394,88408,88411,88423,88447],{},[2357,88395,88396,88401,88402,34,88405],{},[41,88397,88400],{"href":88398,"rel":88399},"https:\u002F\u002Fwww.greenhouse.com\u002Fintegration-partner#apply-now",[45],"Integration request form"," should be submitted by every new company. ",[25,88403,88404],{},"Applications are reviewed by Greenhouse on the first Monday of every month.",[31,88406,88407],{},"If a company is already an official Greenhouse partner with a signed agreement, they may proceed directly to step 3.",[2357,88409,88410],{},"After completing a review, Greenhouse will share API agreement with company",[2357,88412,88413,88414,88418,88419,88422],{},"Once the agreement is signed, the company should follow the steps ",[41,88415,28103],{"href":88416,"rel":88417},"https:\u002F\u002Fharvestdocs.greenhouse.io\u002Fdocs\u002Fharvest-partner-oauth",[45]," to have a client application created for their integration. They will provide Greenhouse with a redirect_uri (",[41,88420,21741],{"href":21741,"rel":88421},[45],") that will be attached to their specific integration's client application. Greenhouse will provide the client credentials (client_id and client_secret)",[2357,88424,88425,88426,88431,88432],{},"The company will input their (2) credentials in ",[41,88427,88430],{"href":88428,"rel":88429},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fgreenhousehttps:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fgreenhouse",[45],"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Fgreenhouse",". Unified will handle all authorization:\n",[2510,88433,88434,88441,88444],{},[2357,88435,88436,88437,2980],{},"Access authorization, token management, refreshes and storage (",[41,88438,88440],{"href":88416,"rel":88439},[45],"instructions found here",[2357,88442,88443],{},"Proxy requests on behalf of the originating partner to harvest v3 APIs",[2357,88445,88446],{},"Secure access schemes to proxy APIs from originating partner to UAPI provider that ensure no cross contamination",[2357,88448,88449],{},"The company will complete the remaining onboarding steps with Greenhouse.",[15,88451,88453],{"id":88452},"greenhouse-ingestion-api","Greenhouse Ingestion API",[55,88455,88457],{"id":88456},"submit-information-about-your-application-to-greenhouse","Submit information about your application to Greenhouse",[22,88459,88460],{},"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:",[2510,88462,88463,88468,88474,88481],{},[2357,88464,88465,88467],{},[31,88466,6194],{},": The name of your application as it would appear in Greenhouse.",[2357,88469,88470,88473],{},[31,88471,88472],{},"Application URL",": The URL of your application.",[2357,88475,88476,88478,88479],{},[31,88477,20719],{},": After the end user authorizes your application to access their account, Greenhouse will redirect them to this URL. Provide this one:\n",[36,88480,21741],{},[2357,88482,88483,88486],{},[31,88484,88485],{},"Logo Image",": A 128 by 128 pixel image that Greenhouse will include in their permissions modal.",[55,88488,88490],{"id":88489},"receive-the-consumer-key-and-consumer-secret-provided-by-greenhouse","Receive the Consumer Key and Consumer Secret provided by Greenhouse",[22,88492,88493],{},"When Greenhouse receives the information listed above, they will provide a set of values including these two:",[2354,88495,88496,88502],{},[2357,88497,2553,88498,88501],{},[31,88499,88500],{},"consumer key",", which uniquely identifies your application",[2357,88503,2553,88504,88507],{},[31,88505,88506],{},"consumer secret",", which acts as proof of your application's identity",[22,88509,88510],{},"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).",[55,88512,88514],{"id":88513},"activate-greenhouse-in-unifiedto","Activate Greenhouse in Unified.to",[22,88516,88517],{},"With your application registered with Greenhouse and the OAuth 2 credentials in hand, you can now activate the Greenhouse integration in Unified.to.",[22,88519,88520,88521,88526,88527,88529],{},"In Unified.to, go to the ",[41,88522,88524],{"href":16276,"rel":88523},[45],[31,88525,57457],{}," page, find the Greenhouse Ingestion API item (and ",[25,88528,8239],{}," the Greenhouse Harvest API one) and click on it:",[22,88531,88532],{},[4201,88533],{"alt":20627,"src":88534},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fsetting_up_oauth_2_credentials_for_greenhouse_apis-0.png",[22,88536,88537],{},"On the page that appears, do the following:",[2510,88539,88540,88544,88550,88555],{},[2357,88541,21834,88542,97],{},[31,88543,49717],{},[2357,88545,88546,88547,88549],{},"Enter the consumer key value into the ",[31,88548,6820],{}," text field.",[2357,88551,88552,88553,88549],{},"Enter the consumer secret value into the ",[31,88554,6826],{},[2357,88556,46260,88557,88559],{},[31,88558,16295],{}," button to save the changes and activate the Greenhouse integration.",[22,88561,88562],{},[4201,88563],{"alt":20627,"src":88564},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fsetting_up_oauth_2_credentials_for_greenhouse_apis-1.png",{"title":2433,"searchDepth":2434,"depth":2434,"links":88566},[88567,88568,88569,88570],{"id":88348,"depth":2434,"text":88349},{"id":88456,"depth":2434,"text":88457},{"id":88489,"depth":2434,"text":88490},{"id":88513,"depth":2434,"text":88514},"Unified.to has two integrations name with the name 'Greenhouse',",{"img":88573,"date":88574,"updated":88575,"tag":2457,"integrations":5768},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fsetting_up_oauth_2_credentials_for_greenhouse_apis-icon.png","2024-05-27T00:00:00.000Z","2026-08-23T14:54:02.300Z","\u002Fguides\u002Fsetting_up_oauth_2_credentials_for_greenhouse_apis",{"title":88333,"description":88571},"guides\u002Fsetting_up_oauth_2_credentials_for_greenhouse_apis","lrqx7LNvp1uFyafxiYl2bNbnjmHMt7Bq_7yt_VwTyRk",{"id":88581,"title":88582,"body":88583,"description":88778,"extension":2452,"meta":88779,"navigation":2459,"path":88784,"seo":88785,"stem":88786,"__hash__":88787},"guides\u002Fguides\u002Ftrello_connection_guide_in_unified.md","Trello Connection Guide in Unified",{"type":12,"value":88584,"toc":88772},[88585,88588,88590,88595,88597,88600,88614,88616,88619,88624,88637,88642,88651,88656,88667,88672,88677,88680,88713,88718,88729,88731,88733,88745,88747,88749,88752],[15,88586,88582],{"id":88587},"trello-connection-guide-in-unified",[19,88589],{},[22,88591,88592],{},[25,88593,88594],{},"April 17, 2026",[3629,88596,4426],{"id":4425},[22,88598,88599],{},"To create a Trello connection in Unified, you need to:",[2354,88601,88602,88605,88608],{},[2357,88603,88604],{},"Create a Trello app",[2357,88606,88607],{},"Copy its API key",[2357,88609,88610,88611],{},"Allow Unified domains as ",[31,88612,88613],{},"Allowed Origins",[19,88615],{},[3629,88617,88618],{"id":8319},"Steps",[22,88620,88621],{},[31,88622,88623],{},"1. Create a Trello App",[2354,88625,88626,88631,88634],{},[2357,88627,7257,88628],{},[31,88629,88630],{},"Trello Power-Ups Admin",[2357,88632,88633],{},"Create a new app",[2357,88635,88636],{},"Open the app details page",[22,88638,88639],{},[31,88640,88641],{},"2. Get API Key",[2354,88643,88644,88648],{},[2357,88645,62424,88646,51990],{},[31,88647,21013],{},[2357,88649,88650],{},"Copy your Trello API key",[22,88652,88653],{},[31,88654,88655],{},"3. Configure in Unified",[2354,88657,88658,88664],{},[2357,88659,6161,88660],{},[41,88661,88662],{"href":88662,"rel":88663},"https:\u002F\u002Fapp.unified.to\u002Fintegrations\u002Ftrello",[45],[2357,88665,88666],{},"Paste the API key into the required field",[22,88668,88669],{},[31,88670,88671],{},"4. Add Allowed Origins in Trello",[22,88673,88674],{},[4201,88675],{"alt":5892,"src":88676},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Ftrello_connection_guide_in_unified-0.png",[22,88678,88679],{},"Add the following URLs in your Trello app settings:",[2354,88681,88682,88688,88695],{},[2357,88683,88684],{},[41,88685,88687],{"href":4146,"rel":88686},[45],"https:\u002F\u002Fapp.unified.to",[2357,88689,88690],{},[41,88691,88694],{"href":88692,"rel":88693},"https:\u002F\u002Fauth.unified.to\u002F",[45],"https:\u002F\u002Fauth.unified.to",[2357,88696,88697,88698],{},"The Unified API domain shown during setup, for example:\n",[2354,88699,88700,88705,88710],{},[2357,88701,88702],{},[41,88703,18395],{"href":58926,"rel":88704},[45],[2357,88706,88707],{},[41,88708,60600],{"href":58937,"rel":88709},[45],[2357,88711,88712],{},"(or your region-specific API domain)",[22,88714,88715],{},[31,88716,88717],{},"5. Save & Complete Setup",[2354,88719,88720,88723,88726],{},[2357,88721,88722],{},"Save the Trello app settings",[2357,88724,88725],{},"Return to Unified",[2357,88727,88728],{},"Complete the connection flow",[19,88730],{},[3629,88732,8570],{"id":45442},[2354,88734,88735,88742],{},[2357,88736,88737,88738,88741],{},"Make sure the ",[31,88739,88740],{},"regional API domain"," matches what is shown in the Unified app during setup",[2357,88743,88744],{},"This can vary depending on your environment or region",[19,88746],{},[3629,88748,5622],{"id":5621},[22,88750,88751],{},"If the connection does not work:",[2354,88753,88754,88757,88763,88769],{},[2357,88755,88756],{},"Confirm the API key is from the correct Trello app",[2357,88758,88759,88760,88762],{},"Ensure all ",[31,88761,88613],{}," are added exactly (no typos or missing domains)",[2357,88764,88765,88766,88768],{},"Verify the correct ",[31,88767,88740],{}," is included",[2357,88770,88771],{},"Retry the connection after saving changes",{"title":2433,"searchDepth":2434,"depth":2434,"links":88773},[88774,88775,88776,88777],{"id":4425,"depth":2613,"text":4426},{"id":8319,"depth":2613,"text":88618},{"id":45442,"depth":2613,"text":8570},{"id":5621,"depth":2613,"text":5622},"To create a Trello connection in Unified, you need to,",{"img":88780,"date":88781,"updated":88782,"tag":2457,"integrations":88783},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Ftrello_connection_guide_in_unified-icon.png","2026-04-17T19:26:00.000Z","2026-08-23T14:53:18.817Z","trello","\u002Fguides\u002Ftrello_connection_guide_in_unified",{"title":88582,"description":88778},"guides\u002Ftrello_connection_guide_in_unified","jPsiudIjc8m9x8p36ukXhwUY1MbUouroDR8sBCJBsT4",{"id":88789,"title":88790,"body":88791,"description":89079,"extension":2452,"meta":89080,"navigation":2459,"path":89084,"seo":89085,"stem":89086,"__hash__":89087},"guides\u002Fguides\u002Funderstanding_oauth2_authorization_flows.md","Understanding OAuth2 Authorization flows",{"type":12,"value":88792,"toc":89073},[88793,88796,88798,88803,88807,88814,88827,88835,88837,88841,88847,88852,88889,88897,88914,88917,88920,88925,88931,88935,88943,88957,88960,88973,88977,88983,88987,89001,89004,89009,89014,89018,89038,89044,89050,89053,89060,89065],[15,88794,88790],{"id":88795},"understanding-oauth2-authorization-flows",[19,88797],{},[22,88799,88800],{},[25,88801,88802],{},"October 17, 2025",[22,88804,88805],{},[25,88806,49449],{},[22,88808,88809,88813],{},[41,88810,60733],{"href":88811,"rel":88812},"https:\u002F\u002Foauth.net\u002F2\u002F",[45]," is an industry-standard protocol for authorization that lets applications request limited access to a user's data on an API service without sharing passwords. This overview highlights the core flows that Unified supports. OAuth itself has two major versions (1.0 and 2.0), and OAuth 2.0 defines several flows. Overall, Unified supports 70+ OAuth 2.0 variations across integrations, spanning integration-specific scope models, token formats, and authorization requirements.",[22,88815,88816,88817,88822],{},"We won't cover OAuth v1, which is no longer widely used and has largely been superseded by OAuth 2.0, published as RFC 6749 in October 2012. RFC 6749 states it \"replaces\" OAuth 1.0, though OAuth 1.0 (RFC 5849) remains published and is not formally deprecated.",[41,88818,88821],{"href":88819,"rel":88820},"https:\u002F\u002Frfc-editor.org\u002Finfo\u002Frfc6749",[45],"[1]",[41,88823,88826],{"href":88824,"rel":88825},"https:\u002F\u002Frfc-editor.org\u002Finfo\u002Frfc5849",[45],"[2]",[22,88828,88829,88834],{},[41,88830,88833],{"href":88831,"rel":88832},"https:\u002F\u002Foauth.net\u002F2.1\u002F",[45],"OAuth 2.1"," is still in progress (as of Oct 2025). It consolidates best practices from OAuth 2.0—removing deprecated flows like implicit and password, and enforcing stronger security defaults such as PKCE—so it is not fully backwards-compatible with every 2.0 flow.",[19,88836],{},[55,88838,88840],{"id":88839},"oauth-20-authorization-code-flow","OAuth 2.0 Authorization Code Flow",[22,88842,88843,88844,88846],{},"The OAuth 2.0 Authorization Code flow (",[36,88845,36],{}," 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 behind options you see all over the internet like \"Sign in with Google.\" This flow is used for delegated authorization—API access on behalf of a user—and can also support authentication when combined with OpenID Connect.",[22,88848,88849],{},[31,88850,88851],{},"How it works:",[2354,88853,88854,88874,88877,88880,88883],{},[2357,88855,88856,88857,88860,88861,88863,88864,88867,88868,319,88870,88873],{},"Your app redirects the user to the integration's authorization page. This URL contains your app's ",[36,88858,88859],{},"client ID"," from that integration, plus integration-specific permission ",[36,88862,16739],{}," and a ",[36,88865,88866],{},"redirect URL",". It can also contain additional information such as ",[36,88869,22210],{},[36,88871,88872],{},"PKCE challenge",", and many more integration-specific parameters.",[2357,88875,88876],{},"The end-user logs in to that integration (if not already logged in) and is shown what permissions your app is requesting. They can then approve or reject that access request.",[2357,88878,88879],{},"If approved, the integration redirects back to your app with a temporary code.",[2357,88881,88882],{},"Your backend exchanges the code for an access token (and optionally a refresh token). This step uses both the client ID and client secret, securing the transaction. The access token will have an expiry, which requires the use of the refresh token to obtain new access tokens.",[2357,88884,88885,88886,88888],{},"Your app uses the access token in the ",[36,88887,22285],{}," header to call that integration's API on behalf of the user.",[22,88890,88891,34,88893,2646],{},[31,88892,123],{},[41,88894,88896],{"href":55318,"rel":88895},[45],"handles all aspects of this OAuth2 flow",[2354,88898,88899,88902,88905,88908,88911],{},[2357,88900,88901],{},"creating the authorizing URL correctly",[2357,88903,88904],{},"unifying permission scopes (e.g. crm_contact_read, accounting_invoice_write, …)",[2357,88906,88907],{},"exchanging codes for access tokens",[2357,88909,88910],{},"automatically refreshing access tokens (and optionally refresh tokens)",[2357,88912,88913],{},"calling the end API with the access token in the correct header and format",[22,88915,88916],{},"This happens with our pre-built components, or directly through our Authorization API.",[22,88918,88919],{},"Our customers just input their application's OAuth2 client ID and client secret, obtained once from the integration. Unified also provides instructions on how to obtain those OAuth credentials.",[22,88921,88922],{},[4201,88923],{"alt":5892,"src":88924},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Funderstanding_oauth2_authorization_flows-0.png",[22,88926,88927,88928,88930],{},"Currently, Unified.to supports 176 integrations that use OAuth2 ",[36,88929,36],{}," flow.",[55,88932,88934],{"id":88933},"oauth-20-openid-connect-oidc-flow","OAuth 2.0 OpenID Connect (OIDC) Flow",[22,88936,8879,88937,88942],{},[41,88938,88941],{"href":88939,"rel":88940},"https:\u002F\u002Fopenid.net\u002Fdevelopers\u002Fhow-connect-works\u002F",[45],"OpenID Connect"," flow is built on top of OAuth 2.0 and is used primarily for user authentication (identity), often alongside OAuth 2.0 authorization for API access.",[22,88944,88945,88946,88949,88950,88953,88954,88956],{},"It returns an ",[36,88947,88948],{},"id_token","—a JWT (JSON Web Token) containing verified user identity claims, such as a name and email—and can also provide a ",[36,88951,88952],{},"\u002Fuserinfo"," API endpoint to obtain the verified identity. Depending on the integration and the scopes requested (for example, ",[36,88955,52958],{},"), it can also issue access and refresh tokens.",[22,88958,88959],{},"When you see a \"Sign in with Google\" button, that is usually an OpenID Connect flow.",[22,88961,88962,34,88964,88969,88970,23286],{},[31,88963,123],{},[41,88965,88968],{"href":88966,"rel":88967},"https:\u002F\u002Fdocs.unified.to\u002Fauth\u002Flogin\u002FSign_in_a_user",[45],"hides this complexity in our Unified Authentication API",", supporting OIDC along with integrations that only support OAuth2 code flow with non-standard ",[36,88971,88972],{},"User Info",[55,88974,88976],{"id":88975},"oauth-20-client-credentials-flow","OAuth 2.0 Client Credentials Flow",[22,88978,88979,88980,88982],{},"OAuth 2.0 ",[36,88981,22524],{}," flow is for server-to-server (machine-to-machine) authentication. No user is involved; your backend service authenticates as itself to access application-level or tenant-level data—not an individual user's data. The customer (or a tenant admin) obtains a client ID and client secret from their integration and provides it to your application.",[22,88984,88985],{},[31,88986,88851],{},[2354,88988,88989,88992,88995,88998],{},[2357,88990,88991],{},"The customer or tenant admin generates an OAuth2 client ID and client secret in their integration and gives it to your application. They usually set what permissions they're willing to grant to those credentials.",[2357,88993,88994],{},"Your backend sends the client ID and secret to the integration's token endpoint.",[2357,88996,88997],{},"The integration returns an access token.",[2357,88999,89000],{},"Your backend uses the token to call APIs.",[22,89002,89003],{},"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.",[22,89005,89006],{},[4201,89007],{"alt":5892,"src":89008},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Funderstanding_oauth2_authorization_flows-1.png",[22,89010,89011,89012,88930],{},"Currently, Unified.to supports 29 integrations that use OAuth2 ",[36,89013,22471],{},[55,89015,89017],{"id":89016},"api-token-key-username-password-authentication","API Token \u002F Key \u002F Username & Password Authentication",[22,89019,89020,89021,319,89024,89027,89028,89031,89032,89037],{},"APIs can also be authenticated with an ",[36,89022,89023],{},"API key",[36,89025,89026],{},"API token",", or even a ",[36,89029,89030],{},"username and password",". The keys and tokens consist of either random characters or an encoded ",[41,89033,89036],{"href":89034,"rel":89035},"https:\u002F\u002Fwww.jwt.io\u002F",[45],"JWT"," (JSON Web Token).",[22,89039,89040,89041,89043],{},"They can be sent in the ",[36,89042,22285],{}," header, in a custom header, or in the URL query as a parameter.",[22,89045,89046,89047,89049],{},"If an API uses username and password for authentication instead of an API key, that combination is sent in the ",[36,89048,22285],{}," header, base64-encoded as \"username:password\".",[22,89051,89052],{},"Because these credentials must be kept secret, they should only be used in backend environments. Using them in client-side code (e.g., a browser) would risk leaking them to the end-user.",[22,89054,89055,89056,97],{},"Unified.to can ask the end-user for any number of API keys\u002Ftokens and additional required API credentials. Optionally, our customers can request this information from their end-users and ",[41,89057,89059],{"href":56474,"rel":89058},[45],"create a connection manually",[22,89061,89062],{},[4201,89063],{"alt":5892,"src":89064},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Funderstanding_oauth2_authorization_flows-2.png",[22,89066,89067,89068,50050],{},"If you're interested in reading about more complexities with OAuth2, read our blog post: \"",[41,89069,89072],{"href":89070,"rel":89071},"https:\u002F\u002Funified.to\u002Fblog\u002Fhow_we_normalize_oauth_across_apis_at_unified",[45],"How We Normalize OAuth Across 460+ APIs at Unified.to",{"title":2433,"searchDepth":2434,"depth":2434,"links":89074},[89075,89076,89077,89078],{"id":88839,"depth":2434,"text":88840},{"id":88933,"depth":2434,"text":88934},{"id":88975,"depth":2434,"text":88976},{"id":89016,"depth":2434,"text":89017},"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 sharing...",{"img":89081,"date":89082,"updated":89083,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Funderstanding_oauth2_authorization_flows-icon.png","2025-10-17T00:00:00.000Z","2026-05-28T13:28:28.551Z","\u002Fguides\u002Funderstanding_oauth2_authorization_flows",{"title":88790,"description":89079},"guides\u002Funderstanding_oauth2_authorization_flows","JNJorQ1aoojrqL_tZDcloJL8wBah1zjbkyKpaQN7sEQ",{"id":89089,"title":89090,"body":89091,"description":89215,"extension":2452,"meta":89216,"navigation":2459,"path":89219,"seo":89220,"stem":89221,"__hash__":89222},"guides\u002Fguides\u002Funderstanding_response_time_headers_in_the_unified_api.md","Understanding Response Time Headers in the Unified API",{"type":12,"value":89092,"toc":89209},[89093,89096,89098,89103,89106,89110,89118,89126,89134,89138,89150,89152,89177,89180,89184,89207],[15,89094,89090],{"id":89095},"understanding-response-time-headers-in-the-unified-api",[19,89097],{},[22,89099,89100],{},[25,89101,89102],{},"July 13, 2026",[22,89104,89105],{},"Every response from the Unified API includes custom HTTP headers that break down exactly where time was spent during your request. This gives you visibility into whether latency is coming from the third-party integration or from Unified's processing layer.",[3629,89107,89109],{"id":89108},"the-headers","The Headers",[22,89111,89112,89117],{},[31,89113,89114],{},[36,89115,89116],{},"X-Response-Time"," — The total end-to-end time for your request, measured from when the Unified API received it to when the response was sent back.",[22,89119,89120,89125],{},[31,89121,89122],{},[36,89123,89124],{},"X-EndApi-Response-Time"," — The time spent waiting on the third-party API (e.g., Salesforce, Slack, HubSpot). This is the network round-trip to the downstream service plus its processing time.",[22,89127,89128,89133],{},[31,89129,89130],{},[36,89131,89132],{},"X-Unified-Response-Time"," — The time spent inside Unified's own code — authentication, data mapping, validation, and response formatting. Calculated as the total time minus the end API time.",[3629,89135,89137],{"id":89136},"when-they-appear","When They Appear",[22,89139,89140,89142,89143,741,89145,89147,89148,97],{},[36,89141,89116],{}," is included on every response. The two breakdown headers (",[36,89144,89132],{},[36,89146,89124],{},") only appear when your request involved a call to a third-party API. Requests that are handled entirely by Unified (such as validation errors or metadata lookups) will only include ",[36,89149,89116],{},[3629,89151,17799],{"id":60425},[2584,89153,89155],{"className":2649,"code":89154,"language":2651,"meta":2652,"style":2433},"HTTP\u002F1.1 200 OK\nX-Response-Time: 340ms\nX-Unified-Response-Time: 12ms\nX-EndApi-Response-Time: 328ms\n",[36,89156,89157,89162,89167,89172],{"__ignoreMap":2433},[414,89158,89159],{"class":2593,"line":2594},[414,89160,89161],{},"HTTP\u002F1.1 200 OK\n",[414,89163,89164],{"class":2593,"line":2434},[414,89165,89166],{},"X-Response-Time: 340ms\n",[414,89168,89169],{"class":2593,"line":2613},[414,89170,89171],{},"X-Unified-Response-Time: 12ms\n",[414,89173,89174],{"class":2593,"line":2625},[414,89175,89176],{},"X-EndApi-Response-Time: 328ms\n",[22,89178,89179],{},"In this example, the third-party API took 328ms to respond, while Unified added just 12ms of overhead for auth, field mapping, and validation.",[3629,89181,89183],{"id":89182},"how-to-use-this","How to Use This",[2354,89185,89186,89195,89201],{},[2357,89187,89188,89191,89192,89194],{},[31,89189,89190],{},"Debugging slow requests"," — If ",[36,89193,89124],{}," is high, the bottleneck is the third-party provider, not Unified. You may want to check the provider's status page or consider caching on your end.",[2357,89196,89197,89200],{},[31,89198,89199],{},"Monitoring"," — Log these headers alongside your own application metrics to build a complete picture of your API call latency.",[2357,89202,89203,89206],{},[31,89204,89205],{},"Support"," — When reaching out about performance concerns, include these header values to help pinpoint the issue faster.",[4156,89208,5736],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":89210},[89211,89212,89213,89214],{"id":89108,"depth":2613,"text":89109},{"id":89136,"depth":2613,"text":89137},{"id":60425,"depth":2613,"text":17799},{"id":89182,"depth":2613,"text":89183},"Every response from the Unified API includes custom HTTP headers that break down exactly where time was spent during your request. This gives you visibility...",{"img":7949,"date":89217,"updated":89218,"tag":2457,"integrations":3},"2026-07-13T00:00:00.000Z","2026-07-14T00:47:11.015Z","\u002Fguides\u002Funderstanding_response_time_headers_in_the_unified_api",{"title":89090,"description":89215},"guides\u002Funderstanding_response_time_headers_in_the_unified_api","GnJgrAX7lekv31LGV3KAAhPDT4aPKjYN8L-BVJWjU84",{"id":89224,"title":89225,"body":89226,"description":90257,"extension":2452,"meta":90258,"navigation":2459,"path":90262,"seo":90263,"stem":90264,"__hash__":90265},"guides\u002Fguides\u002Funified_assessment_api_embed_assessments_inside_ats_platforms.md","Unified Assessment API: Embed Assessments Inside ATS Platforms",{"type":12,"value":89227,"toc":90223},[89228,89231,89233,89238,89241,89244,89248,89251,89254,89258,89261,89265,89270,89278,89283,89291,89296,89304,89308,89311,89314,89317,89320,89324,89354,89357,89362,89366,89369,89380,89383,89389,89392,89403,89407,89421,89425,89428,89431,89445,89451,89457,89460,89471,89474,89477,89480,89484,89489,89492,89495,89498,89521,89524,89527,89530,89534,89537,89550,89553,89561,89564,89568,89582,89586,89594,89597,89600,89604,89608,89611,89622,89631,89636,89679,89683,89686,89690,89693,89708,89711,89715,89718,89732,89735,89739,89742,89766,89769,89775,89778,89829,89833,89837,89840,89872,89876,89879,89887,89891,89898,90014,90018,90021,90033,90038,90160,90169,90172,90176,90208,90211,90214,90217,90220],[15,89229,89225],{"id":89230},"unified-assessment-api-embed-assessments-inside-ats-platforms",[19,89232],{},[22,89234,89235],{},[25,89236,89237],{},"February 9, 2026",[22,89239,89240],{},"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.",[22,89242,89243],{},"With the Assessment API, the recruiter orders your assessment inside the ATS and the order reaches you by webhook; you don't poll or watch status changes.",[55,89245,89247],{"id":89246},"what-is-an-assessment-api","What is an Assessment API?",[22,89249,89250],{},"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 order is routed to the provider by webhook.",[22,89252,89253],{},"The Assessment API covers package management, order delivery and result submission for ATSes with an embedded assessment module.",[55,89255,89257],{"id":89256},"why-ats-native-assessment-integrations-matter","Why ATS-native assessment integrations matter",[22,89259,89260],{},"Recruiters order the assessment at the point of decision, without switching tools, and the result is written back to the system where the hiring decision is made.",[55,89262,89264],{"id":89263},"three-ways-to-integrate-assessments-with-unified","Three ways to integrate assessments with Unified",[22,89266,89267],{},[31,89268,89269],{},"1. Embedded (Assessment API)",[2354,89271,89272,89275],{},[2357,89273,89274],{},"Recruiter selects assessment inside ATS",[2357,89276,89277],{},"Best UX, requires ATS support",[22,89279,89280],{},[31,89281,89282],{},"2. Triggered (ATS API)",[2354,89284,89285,89288],{},[2357,89286,89287],{},"Trigger on status change",[2357,89289,89290],{},"Works on any ATS integration that returns applications",[22,89292,89293],{},[31,89294,89295],{},"3. Verification-style (Verification API)",[2354,89297,89298,89301],{},[2357,89299,89300],{},"ATS\u002FHRIS calls provider directly",[2357,89302,89303],{},"No marketplace required",[55,89305,89307],{"id":89306},"unified-assessment-api","Unified Assessment API",[22,89309,89310],{},"The Unified Assessment API allows assessment and background check providers to integrate directly with Applicant Tracking Systems (ATS) platforms that support embedded assessment listings.",[22,89312,89313],{},"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.",[22,89315,89316],{},"Instead, the assessment package is selected inside the ATS, and the request is routed to your platform through Unified.",[22,89318,89319],{},"This is different from triggering assessments based on status changes. It is a recruiter-initiated flow inside the ATS itself.",[3629,89321,89323],{"id":89322},"core-objects-in-the-assessment-api","Core objects in the Assessment API",[2354,89325,89326,89332,89338],{},[2357,89327,89328,89331],{},[31,89329,89330],{},"Packages",": define assessment offerings, metadata, scoring, and configuration",[2357,89333,89334,89337],{},[31,89335,89336],{},"Orders",": represent assessment requests, candidate context, and lifecycle state",[2357,89339,89340,89343,89344,319,89347,319,89350,89353],{},[31,89341,89342],{},"Results",": fields on the order (",[36,89345,89346],{},"response_score",[36,89348,89349],{},"response_url",[36,89351,89352],{},"response_attributes"," and others) that you update when the assessment is done",[22,89355,89356],{},"Orders include rich candidate, job, and application context, allowing providers to tailor assessments and return structured results directly into the ATS.",[22,89358,89359],{},[4201,89360],{"alt":5892,"src":89361},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Funified_assessment_api_embed_assessments_inside_ats_platforms-0.png",[3629,89363,89365],{"id":89364},"what-can-you-read-and-write","What can you read and write?",[22,89367,89368],{},"The Assessment API supports both:",[2354,89370,89371,89374,89377],{},[2357,89372,89373],{},"Creating and managing assessment packages",[2357,89375,89376],{},"Receiving assessment orders by webhook",[2357,89378,89379],{},"Updating orders with structured results and scores",[22,89381,89382],{},"Calls go to the source ATS at request time, with no customer records at rest; connection credentials and operational metadata are encrypted at rest.",[3629,89384,89386],{"id":89385},"using-assessment-data-in-ai-systems",[31,89387,89388],{},"Using assessment data in AI systems",[22,89390,89391],{},"Because your product holds the structured results it writes back, you can also use them to:",[2354,89393,89394,89397,89400],{},[2357,89395,89396],{},"Generate candidate summaries and scoring insights",[2357,89398,89399],{},"Feed structured evaluation data into copilots or hiring assistants",[2357,89401,89402],{},"Trigger automated follow-ups or recommendations",[55,89404,89406],{"id":89405},"what-you-can-build-with-the-assessment-api","What you can build with the Assessment API",[2354,89408,89409,89412,89415,89418],{},[2357,89410,89411],{},"Embedded assessment marketplaces inside ATS platforms",[2357,89413,89414],{},"Partner integrations with ATS vendors (such as Greenhouse, Ashby, Workable)",[2357,89416,89417],{},"Candidate evaluation started by the recruiter inside the ATS",[2357,89419,89420],{},"AI scoring and feedback returned to the ATS",[3629,89422,89424],{"id":89423},"embedded-assessment-marketplaces-inside-ats","Embedded assessment marketplaces inside ATS",[22,89426,89427],{},"Some ATS platforms support native assessment marketplaces, where providers can list assessment packages directly inside the product.",[22,89429,89430],{},"The Assessment API enables this model by:",[2354,89432,89433,89436,89439,89442],{},[2357,89434,89435],{},"Listing your packages inside the ATS",[2357,89437,89438],{},"Allowing recruiters to select assessments directly",[2357,89440,89441],{},"Sending you each order by webhook",[2357,89443,89444],{},"Returning results back into the same flow",[55,89446,89448],{"id":89447},"how-the-assessment-api-differs-from-other-unified-apis",[31,89449,89450],{},"How the Assessment API differs from other Unified APIs",[22,89452,8879,89453,89456],{},[31,89454,89455],{},"Unified Verification API"," is used by ATS or HRIS platforms to call verification or assessment providers in a unified way.",[22,89458,89459],{},"In that flow:",[2354,89461,89462,89465,89468],{},[2357,89463,89464],{},"The ATS or HRIS platform initiates the request.",[2357,89466,89467],{},"They do not need a direct partnership with the assessment provider.",[2357,89469,89470],{},"The call is routed through Unified using the unified verification data models.",[22,89472,89473],{},"The Assessment API is different.",[22,89475,89476],{},"It is designed for assessment providers who want their assessment packages listed directly inside an ATS that supports embedded assessment integrations.",[22,89478,89479],{},"The integration is initiated by the recruiter inside the ATS, not by the assessment provider or backend workflow.",[3629,89481,89483],{"id":89482},"how-this-differs-from-the-unified-ats-api","How This Differs from the Unified ATS API",[22,89485,8879,89486,89488],{},[31,89487,27792],{}," allows assessment providers to listen for job application changes and trigger an assessment when an application reaches a specific status.",[22,89490,89491],{},"That flow works across most ATS platforms supported by Unified and does not require a special assessment marketplace integration.",[22,89493,89494],{},"It is best suited for ATS platforms that do not support embedded assessment listings.",[22,89496,89497],{},"The new Unified Assessment API works in a different way:",[2354,89499,89500,89503,89506,89509,89512,89515,89518],{},[2357,89501,89502],{},"It connects directly to ATS platforms that have a dedicated 'assessment API.'",[2357,89504,89505],{},"Your assessment packages are listed inside the ATS.",[2357,89507,89508],{},"A recruiter manually selects a package for a candidate.",[2357,89510,89511],{},"The ATS sends an assessment order through Unified.",[2357,89513,89514],{},"You process the assessment.",[2357,89516,89517],{},"You update the order.",[2357,89519,89520],{},"The results are written back into the ATS.",[22,89522,89523],{},"The key difference:",[22,89525,89526],{},"The recruiter stays inside the ATS the entire time.",[22,89528,89529],{},"There is no external trigger based on status change. The recruiter explicitly orders the assessment.",[3629,89531,89533],{"id":89532},"when-should-you-use-each","When Should You Use Each?",[22,89535,89536],{},"For assessment providers:",[2354,89538,89539,89545],{},[2357,89540,9188,89541,89544],{},[31,89542,89543],{},"Assessment API"," when the ATS supports embedded assessment listings and you have a partnership with that ATS.",[2357,89546,9188,89547,89549],{},[31,89548,27779],{}," for all other ATS platforms.",[22,89551,89552],{},"Most providers will use both:",[2354,89554,89555,89558],{},[2357,89556,89557],{},"Assessment API for supported ATS platforms.",[2357,89559,89560],{},"ATS API as the broad coverage fallback.",[22,89562,89563],{},"The Assessment API reduces recruiter friction but is limited to ATS platforms that expose this functionality.",[3629,89565,89567],{"id":89566},"who-this-is-for","Who this is for",[2354,89569,89570,89573,89576,89579],{},[2357,89571,89572],{},"Assessment providers (coding tests, behavioral, psychometric, etc.)",[2357,89574,89575],{},"Background check and verification providers",[2357,89577,89578],{},"AI-based candidate evaluation platforms",[2357,89580,89581],{},"Hiring infrastructure tools integrating into ATS ecosystems",[55,89583,89585],{"id":89584},"supported-ats-integrations","Supported ATS Integrations",[22,89587,89588,89589,97],{},"As of 19 October 2026, the Assessment API connects to the assessment modules of Ashby, ATS Anywhere, Cornerstone, Greenhouse, JobAdder, PageUp, Paylocity, Recruitee, SmartRecruiters, TalentLyft, Teamtailor and Workable. Workable Assessment is generally available; the others are in beta. It also orders assessments from assessment companies such as Berke, The Predictive Index and Wonderlic (beta). See the ",[41,89590,89593],{"href":89591,"rel":89592},"https:\u002F\u002Fdocs.unified.to\u002Fassessment\u002Fintegrations",[45],"Assessments integration list",[22,89595,89596],{},"Each of these has a dedicated assessment integration that is separate from the standard ATS integration.",[22,89598,89599],{},"Only ATS platforms that support embedded assessment listings can be supported through this API.",[55,89601,89603],{"id":89602},"how-do-you-set-up-the-assessment-api","How do you set up the Assessment API?",[3629,89605,89607],{"id":89606},"step-1-create-a-connection","Step 1: Create a Connection",[22,89609,89610],{},"First, you need to manually create a connection for your assessment integration. This connection will be used to authenticate requests from the ATS.",[22,89612,89613,89614,89617,89618,89621],{},"When creating the connection, you must supply a ",[31,89615,89616],{},"Partner API Key"," in the ",[36,89619,89620],{},"connection.auth.token"," field that you generate yourself. You will then share this API key with your end-customer to configure the integration in their ATS.",[22,89623,89624,89625,88863,89628,97],{},"Always check the authentication requirements for each assessment integration as some will require additional authentication information.  For example, Ashby also requires a ",[36,89626,89627],{},"Customer API Key",[36,89629,89630],{},"Partner ID",[22,89632,89633],{},[31,89634,89635],{},"Example Connection Creation:",[2584,89637,89639],{"className":7323,"code":89638,"language":7325,"meta":2433,"style":2433},"{\n  \"integration_type\": \"greenhouseassessment\",\n  \"auth\": {\n    \"token\": \"YOUR_PARTNER_API_KEY\"\n  },\n}\n",[36,89640,89641,89645,89656,89662,89671,89675],{"__ignoreMap":2433},[414,89642,89643],{"class":2593,"line":2594},[414,89644,8916],{"class":2705},[414,89646,89647,89649,89651,89654],{"class":2593,"line":2434},[414,89648,53394],{"class":2607},[414,89650,7340],{"class":2705},[414,89652,89653],{"class":2601},"\"greenhouseassessment\"",[414,89655,2757],{"class":2705},[414,89657,89658,89660],{"class":2593,"line":2613},[414,89659,53479],{"class":2607},[414,89661,10477],{"class":2705},[414,89663,89664,89666,89668],{"class":2593,"line":2625},[414,89665,56003],{"class":2607},[414,89667,7340],{"class":2705},[414,89669,89670],{"class":2601},"\"YOUR_PARTNER_API_KEY\"\n",[414,89672,89673],{"class":2593,"line":2677},[414,89674,16052],{"class":2705},[414,89676,89677],{"class":2593,"line":2751},[414,89678,3035],{"class":2705},[3629,89680,89682],{"id":89681},"step-2-configure-webhooks","Step 2: Configure Webhooks",[22,89684,89685],{},"You also need to set up webhooks to receive assessment orders from the ATS systems.",[3629,89687,89689],{"id":89688},"required-webhook","Required Webhook",[22,89691,89692],{},"Create a webhook with the following configuration:",[2354,89694,89695,89702],{},[2357,89696,89697,7340,89699],{},[31,89698,17057],{},[36,89700,89701],{},"assessment_order",[2357,89703,89704,7340,89706],{},[31,89705,5060],{},[36,89707,4949],{},[22,89709,89710],{},"This webhook will be triggered whenever a recruiter requests an assessment for a candidate in the ATS.",[3629,89712,89714],{"id":89713},"optional-webhook","Optional Webhook",[22,89716,89717],{},"Some ATS vendors (like Ashby) also send order cancellation events. You can optionally create an additional webhook:",[2354,89719,89720,89726],{},[2357,89721,89722,7340,89724],{},[31,89723,17057],{},[36,89725,89701],{},[2357,89727,89728,7340,89730],{},[31,89729,5060],{},[36,89731,4959],{},[22,89733,89734],{},"This webhook will notify you when an assessment order is cancelled.",[3629,89736,89738],{"id":89737},"step-3-provide-configuration-to-your-end-customer","Step 3: Provide Configuration to Your End-Customer",[22,89740,89741],{},"Once you've created the connection and webhook, provide the following information to your end-customer:",[2510,89743,89744,89759],{},[2357,89745,89746,7340,89749,89752],{},[31,89747,89748],{},"Base URL",[36,89750,89751],{},"https:\u002F\u002Fapi.unified.to\u002Fassessments\u002F{connection_id}",[2354,89753,89754],{},[2357,89755,65282,89756,89758],{},[36,89757,23306],{}," with the actual connection ID from Step 1",[2357,89760,89761,89763,89764],{},[31,89762,89616],{},": The token value you set in ",[36,89765,89620],{},[22,89767,89768],{},"Your end-customer will then input these credentials into their ATS software to enable the integration.",[55,89770,89772],{"id":89771},"how-the-assessment-flow-works",[31,89773,89774],{},"How the assessment flow works",[22,89776,89777],{},"Here's how the assessment flow works:",[2510,89779,89780,89786,89792,89798,89807,89813,89823],{},[2357,89781,89782,89785],{},[31,89783,89784],{},"Package Configuration",": You create assessment packages via the Unified API (w\u002F assessment packages API endpoints)",[2357,89787,89788,89791],{},[31,89789,89790],{},"ATS Lists Packages",": The ATS queries your available packages",[2357,89793,89794,89797],{},[31,89795,89796],{},"Recruiter Orders Assessment",": A recruiter selects a package and orders an assessment for a candidate",[2357,89799,89800,7340,89803,89806],{},[31,89801,89802],{},"Webhook Notification",[41,89804,123],{"href":121,"rel":89805},[45]," sends you a webhook with the order details",[2357,89808,89809,89812],{},[31,89810,89811],{},"Process Assessment",": You send the assessment to the candidate and process their response",[2357,89814,89815,89818,89819,89822],{},[31,89816,89817],{},"Submit Results",": You submit the assessment results back to ",[41,89820,123],{"href":121,"rel":89821},[45]," (w\u002F assessment order update API endpoint)",[2357,89824,89825,89828],{},[31,89826,89827],{},"Results in ATS",": The results appear in the ATS for the recruiter to review",[55,89830,89832],{"id":89831},"api-endpoints","API Endpoints",[3629,89834,89836],{"id":89835},"assessment-packages","Assessment Packages",[22,89838,89839],{},"Manage your available assessment packages:",[2354,89841,89842,89848,89854,89860,89866],{},[2357,89843,89844,89847],{},[36,89845,89846],{},"POST \u002Fassessment\u002F{connection_id}\u002Fpackage"," - Create a new package",[2357,89849,89850,89853],{},[36,89851,89852],{},"GET \u002Fassessment\u002F{connection_id}\u002Fpackage"," - List all packages",[2357,89855,89856,89859],{},[36,89857,89858],{},"GET \u002Fassessment\u002F{connection_id}\u002Fpackage\u002F{id}"," - Get a specific package",[2357,89861,89862,89865],{},[36,89863,89864],{},"PUT \u002Fassessment\u002F{connection_id}\u002Fpackage\u002F{id}"," - Update a package",[2357,89867,89868,89871],{},[36,89869,89870],{},"DELETE \u002Fassessment\u002F{connection_id}\u002Fpackage\u002F{id}"," - Delete a package",[3629,89873,89875],{"id":89874},"assessment-orders","Assessment Orders",[22,89877,89878],{},"Update assessment order results:",[2354,89880,89881],{},[2357,89882,89883,89886],{},[36,89884,89885],{},"PUT \u002Fassessment\u002F{connection_id}\u002Forder\u002F{id}"," - Update an order with results",[55,89888,89890],{"id":89889},"webhook-payload","Webhook Payload",[22,89892,89893,89894,89897],{},"When an assessment order is created, you'll receive a webhook with an ",[36,89895,89896],{},"AssessmentOrder"," payload:",[2584,89899,89901],{"className":7323,"code":89900,"language":7325,"meta":2433,"style":2433},"{\n  \"id\": \"123\",\n  \"package_id\": \"your_package_id\",\n  \"candidate_id\": \"candidate_456\",\n  \"application_id\": \"application_789\",\n  \"job_id\": \"job_012\",\n  \"profile_first_name\": \"John\",\n  \"profile_last_name\": \"Doe\",\n  \"profile_emails\": [\"candidate@example.com\"],\n  \"status\": \"OPEN\"\n}\n",[36,89902,89903,89907,89917,89929,89941,89953,89965,89977,89988,90000,90010],{"__ignoreMap":2433},[414,89904,89905],{"class":2593,"line":2594},[414,89906,8916],{"class":2705},[414,89908,89909,89911,89913,89915],{"class":2593,"line":2434},[414,89910,17505],{"class":2607},[414,89912,7340],{"class":2705},[414,89914,9736],{"class":2601},[414,89916,2757],{"class":2705},[414,89918,89919,89922,89924,89927],{"class":2593,"line":2613},[414,89920,89921],{"class":2607},"  \"package_id\"",[414,89923,7340],{"class":2705},[414,89925,89926],{"class":2601},"\"your_package_id\"",[414,89928,2757],{"class":2705},[414,89930,89931,89934,89936,89939],{"class":2593,"line":2625},[414,89932,89933],{"class":2607},"  \"candidate_id\"",[414,89935,7340],{"class":2705},[414,89937,89938],{"class":2601},"\"candidate_456\"",[414,89940,2757],{"class":2705},[414,89942,89943,89946,89948,89951],{"class":2593,"line":2677},[414,89944,89945],{"class":2607},"  \"application_id\"",[414,89947,7340],{"class":2705},[414,89949,89950],{"class":2601},"\"application_789\"",[414,89952,2757],{"class":2705},[414,89954,89955,89958,89960,89963],{"class":2593,"line":2751},[414,89956,89957],{"class":2607},"  \"job_id\"",[414,89959,7340],{"class":2705},[414,89961,89962],{"class":2601},"\"job_012\"",[414,89964,2757],{"class":2705},[414,89966,89967,89970,89972,89975],{"class":2593,"line":2760},[414,89968,89969],{"class":2607},"  \"profile_first_name\"",[414,89971,7340],{"class":2705},[414,89973,89974],{"class":2601},"\"John\"",[414,89976,2757],{"class":2705},[414,89978,89979,89982,89984,89986],{"class":2593,"line":2768},[414,89980,89981],{"class":2607},"  \"profile_last_name\"",[414,89983,7340],{"class":2705},[414,89985,74080],{"class":2601},[414,89987,2757],{"class":2705},[414,89989,89990,89993,89995,89998],{"class":2593,"line":2776},[414,89991,89992],{"class":2607},"  \"profile_emails\"",[414,89994,10492],{"class":2705},[414,89996,89997],{"class":2601},"\"candidate@example.com\"",[414,89999,10497],{"class":2705},[414,90001,90002,90005,90007],{"class":2593,"line":2784},[414,90003,90004],{"class":2607},"  \"status\"",[414,90006,7340],{"class":2705},[414,90008,90009],{"class":2601},"\"OPEN\"\n",[414,90011,90012],{"class":2593,"line":2792},[414,90013,3035],{"class":2705},[55,90015,90017],{"id":90016},"submitting-results","Submitting Results",[22,90019,90020],{},"Once a candidate completes an assessment, submit the results using the update order endpoint:",[2584,90022,90024],{"className":2586,"code":90023,"language":2588,"meta":2433,"style":2433},"PUT \u002Fassessment\u002F{connection_id}\u002Forder\u002F{order_id}\n",[36,90025,90026],{"__ignoreMap":2433},[414,90027,90028,90030],{"class":2593,"line":2594},[414,90029,69082],{"class":2597},[414,90031,90032],{"class":2601}," \u002Fassessment\u002F{connection_id}\u002Forder\u002F{order_id}\n",[22,90034,90035],{},[31,90036,90037],{},"Example Request:",[2584,90039,90041],{"className":7323,"code":90040,"language":7325,"meta":2433,"style":2433},"{\n  \"status\": \"COMPLETED\",\n  \"response_score\": 85,\n  \"response_max_score\": 100,\n  \"response_url\": \"\u003Chttps:\u002F\u002Fyour-platform.com\u002Fresults\u002Forder_123>\",\n  \"response_completed_at\": \"2024-01-15T10:30:00Z\",\n  \"response_attributes\": [\n    {\n      \"type\": \"TEXT\",\n      \"label\": \"Overall Assessment\",\n      \"value\": \"Strong candidate\"\n    }\n  ]\n}\n",[36,90042,90043,90047,90058,90070,90082,90094,90106,90113,90117,90127,90139,90148,90152,90156],{"__ignoreMap":2433},[414,90044,90045],{"class":2593,"line":2594},[414,90046,8916],{"class":2705},[414,90048,90049,90051,90053,90056],{"class":2593,"line":2434},[414,90050,90004],{"class":2607},[414,90052,7340],{"class":2705},[414,90054,90055],{"class":2601},"\"COMPLETED\"",[414,90057,2757],{"class":2705},[414,90059,90060,90063,90065,90068],{"class":2593,"line":2613},[414,90061,90062],{"class":2607},"  \"response_score\"",[414,90064,7340],{"class":2705},[414,90066,90067],{"class":2607},"85",[414,90069,2757],{"class":2705},[414,90071,90072,90075,90077,90080],{"class":2593,"line":2625},[414,90073,90074],{"class":2607},"  \"response_max_score\"",[414,90076,7340],{"class":2705},[414,90078,90079],{"class":2607},"100",[414,90081,2757],{"class":2705},[414,90083,90084,90087,90089,90092],{"class":2593,"line":2677},[414,90085,90086],{"class":2607},"  \"response_url\"",[414,90088,7340],{"class":2705},[414,90090,90091],{"class":2601},"\"\u003Chttps:\u002F\u002Fyour-platform.com\u002Fresults\u002Forder_123>\"",[414,90093,2757],{"class":2705},[414,90095,90096,90099,90101,90104],{"class":2593,"line":2751},[414,90097,90098],{"class":2607},"  \"response_completed_at\"",[414,90100,7340],{"class":2705},[414,90102,90103],{"class":2601},"\"2024-01-15T10:30:00Z\"",[414,90105,2757],{"class":2705},[414,90107,90108,90111],{"class":2593,"line":2760},[414,90109,90110],{"class":2607},"  \"response_attributes\"",[414,90112,8960],{"class":2705},[414,90114,90115],{"class":2593,"line":2768},[414,90116,15559],{"class":2705},[414,90118,90119,90121,90123,90125],{"class":2593,"line":2776},[414,90120,46830],{"class":2607},[414,90122,7340],{"class":2705},[414,90124,11362],{"class":2601},[414,90126,2757],{"class":2705},[414,90128,90129,90132,90134,90137],{"class":2593,"line":2784},[414,90130,90131],{"class":2607},"      \"label\"",[414,90133,7340],{"class":2705},[414,90135,90136],{"class":2601},"\"Overall Assessment\"",[414,90138,2757],{"class":2705},[414,90140,90141,90143,90145],{"class":2593,"line":2792},[414,90142,17616],{"class":2607},[414,90144,7340],{"class":2705},[414,90146,90147],{"class":2601},"\"Strong candidate\"\n",[414,90149,90150],{"class":2593,"line":2804},[414,90151,10535],{"class":2705},[414,90153,90154],{"class":2593,"line":2809},[414,90155,8991],{"class":2705},[414,90157,90158],{"class":2593,"line":2829},[414,90159,3035],{"class":2705},[22,90161,90162,319,90164,741,90166,90168],{},[36,90163,20261],{},[36,90165,89346],{},[36,90167,89349],{}," are writable on every ATS assessment module; other fields vary, so check the integration page.",[22,90170,90171],{},"The results will then be written back to the ATS system, where recruiters can view them directly.",[55,90173,90175],{"id":90174},"what-should-your-webhook-handler-do","What should your webhook handler do?",[2510,90177,90178,90184,90190,90199],{},[2357,90179,90180,90183],{},[31,90181,90182],{},"Secure Your API Key",": Treat your Partner API Key as sensitive information. Only share it with trusted end-customers.",[2357,90185,90186,90189],{},[31,90187,90188],{},"Handle Webhooks Reliably",": Implement retry logic and idempotency checks in your webhook handler to ensure you don't miss or duplicate orders.",[2357,90191,90192,90195,90196,90198],{},[31,90193,90194],{},"Validate Webhook Data",": Check the ",[36,90197,45956],{}," signature (HMAC-SHA256) and validate the webhook payload to ensure it contains the expected candidate and job information before processing.",[2357,90200,90201,90204,90205,90207],{},[31,90202,90203],{},"Monitor Order Status",": Track the status of assessment orders and handle cancellations appropriately when the ",[36,90206,4959],{}," event webhook is received.",[22,90209,90210],{},"What is an assessment API for recruiting platforms?",[22,90212,90213],{},"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 delivers orders by webhook and writes structured results back to the same system.",[22,90215,90216],{},"How do assessment providers integrate with ATS platforms?",[22,90218,90219],{},"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.",[4156,90221,90222],{},"html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}",{"title":2433,"searchDepth":2434,"depth":2434,"links":90224},[90225,90226,90227,90228,90233,90236,90241,90242,90249,90250,90254,90255,90256],{"id":89246,"depth":2434,"text":89247},{"id":89256,"depth":2434,"text":89257},{"id":89263,"depth":2434,"text":89264},{"id":89306,"depth":2434,"text":89307,"children":90229},[90230,90231,90232],{"id":89322,"depth":2613,"text":89323},{"id":89364,"depth":2613,"text":89365},{"id":89385,"depth":2613,"text":89388},{"id":89405,"depth":2434,"text":89406,"children":90234},[90235],{"id":89423,"depth":2613,"text":89424},{"id":89447,"depth":2434,"text":89450,"children":90237},[90238,90239,90240],{"id":89482,"depth":2613,"text":89483},{"id":89532,"depth":2613,"text":89533},{"id":89566,"depth":2613,"text":89567},{"id":89584,"depth":2434,"text":89585},{"id":89602,"depth":2434,"text":89603,"children":90243},[90244,90245,90246,90247,90248],{"id":89606,"depth":2613,"text":89607},{"id":89681,"depth":2613,"text":89682},{"id":89688,"depth":2613,"text":89689},{"id":89713,"depth":2613,"text":89714},{"id":89737,"depth":2613,"text":89738},{"id":89771,"depth":2434,"text":89774},{"id":89831,"depth":2434,"text":89832,"children":90251},[90252,90253],{"id":89835,"depth":2613,"text":89836},{"id":89874,"depth":2613,"text":89875},{"id":89889,"depth":2434,"text":89890},{"id":90016,"depth":2434,"text":90017},{"id":90174,"depth":2434,"text":90175},"Most assessment integrations rely on application status changes or external tools. Recruiters switch systems, and providers handle fragmented integration...",{"img":90259,"date":90260,"updated":90261,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Funified_assessment_api_embed_assessments_inside_ats_platforms-icon.png","2026-02-09T21:10:00.000Z","2026-10-21T11:26:12.875Z","\u002Fguides\u002Funified_assessment_api_embed_assessments_inside_ats_platforms",{"title":89225,"description":90257},"guides\u002Funified_assessment_api_embed_assessments_inside_ats_platforms","0hRFQuwm-w2qq1qKMkQ49DqhqgZ3Q43dT7P2XWeZqSQ",{"id":90267,"title":90268,"body":90269,"description":90354,"extension":2452,"meta":90355,"navigation":2459,"path":90359,"seo":90360,"stem":90361,"__hash__":90362},"guides\u002Fguides\u002Funified_mcp_server.md","Unified's MCP Server",{"type":12,"value":90270,"toc":90350},[90271,90274,90276,90281,90287,90290,90293,90307,90310,90314,90344],[15,90272,90268],{"id":90273},"unifieds-mcp-server",[19,90275],{},[22,90277,90278],{},[25,90279,90280],{},"May 24, 2025",[22,90282,90283,90284,90286],{},"Unified has launched an MCP server that connects any Unified connection to LLM (Large Language Model) providers supporting the newest MCP protocols. The available MCP ",[36,90285,38594],{}," will be determined by the integration's feature support and the connection's requested permissions.",[22,90288,90289],{},"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.",[55,90291,90292],{"id":17786},"Use-cases:",[2354,90294,90295,90301],{},[2357,90296,90297,90300],{},[31,90298,90299],{},"End-Customer Conversation with LLMs",": Allows end-customers to interact with an LLM using permissioned tools backed by the data they've explicitly authorized through a Unified connection.",[2357,90302,90303,90306],{},[31,90304,90305],{},"Debugging End-Customers' Connections",": 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.",[22,90308,90309],{},"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.",[55,90311,90313],{"id":90312},"sample-queries","Sample queries:",[2354,90315,90316,90319,90326,90329,90332,90335,90338,90341],{},[2357,90317,90318],{},"List candidates for job X",[2357,90320,90321,90322],{},"List deals for contact with email address ",[41,90323,90325],{"href":90324},"mailto:joe@foo.com","joe@foo.com",[2357,90327,90328],{},"update application 12345 with a status of HIRED",[2357,90330,90331],{},"summarize the accounting balance sheet report",[2357,90333,90334],{},"find the vacation policy by listing the pages in Notion",[2357,90336,90337],{},"post a message in Slack summarizing this deal",[2357,90339,90340],{},"create an invoice for customer X",[2357,90342,90343],{},"schedule an interview and notify the candidate",[22,90345,90346,90347],{},"More information can be found at ",[41,90348,41463],{"href":41463,"rel":90349},[45],{"title":2433,"searchDepth":2434,"depth":2434,"links":90351},[90352,90353],{"id":17786,"depth":2434,"text":90292},{"id":90312,"depth":2434,"text":90313},"Unified has launched an MCP server that connects any Unified connection to LLM (Large Language Model) providers supporting the newest MCP protocols. The...",{"img":90356,"date":90357,"updated":90358,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Funified_mcp_server-icon.png","2025-05-24T00:00:00.000Z","2026-05-28T13:30:43.806Z","\u002Fguides\u002Funified_mcp_server",{"title":90268,"description":90354},"guides\u002Funified_mcp_server","pm4lFxzPviHiboPq9FLxsrD2NRWHf38jJGXIAIYKPC8",{"id":90364,"title":90365,"body":90366,"description":91976,"extension":2452,"meta":91977,"navigation":2459,"path":91981,"seo":91982,"stem":91983,"__hash__":91984},"guides\u002Fguides\u002Funified_mcp_server_with_langchain_and_langgraph.md","Unified MCP Server with LangChain and LangGraph",{"type":12,"value":90367,"toc":91961},[90368,90371,90373,90378,90382,90385,90399,90401,90419,90422,90427,90447,90452,90471,90474,90478,90481,90799,90802,90806,91056,91058,91073,91144,91148,91156,91198,91242,91246,91251,91586,91590,91593,91766,91769,91773,91776,91829,91836,91839,91887,91889,91928,91932,91958],[15,90369,90365],{"id":90370},"unified-mcp-server-with-langchain-and-langgraph",[19,90372],{},[22,90374,90375],{},[25,90376,90377],{},"September 25, 2026",[55,90379,90381],{"id":90380},"use-the-unified-mcp-servers-22566-tools-as-langchain-tools-in-langchain-and-langgraph-agents","Use the Unified MCP server's 22,566 tools as LangChain tools in LangChain and LangGraph agents",[22,90383,90384],{},"LangChain and LangGraph give you a framework for building AI agents with tools, memory and multi-step workflows. With the official LangChain MCP adapter, every tool exposed by the Unified MCP server becomes a native LangChain tool. Your agents get real-time read and write access to your customers' CRM, ATS, HRIS, accounting, ticketing, file storage, messaging and commerce data, across all of Unified.to's integrations. You don't need custom integration code.",[22,90386,90387,90388,90391,90392,90395,90396,97],{},"The adapter converts each Unified MCP tool into a LangChain ",[36,90389,90390],{},"BaseTool",". You can pass the tools to ",[36,90393,90394],{},"create_agent",", bind them to any chat model, or run them in a LangGraph ",[36,90397,90398],{},"ToolNode",[55,90400,2542],{"id":2541},[2354,90402,90403,90410,90416],{},[2357,90404,90405,90406],{},"A Unified.to workspace and your ",[41,90407,90409],{"href":61768,"rel":90408},[45],"workspace API key",[2357,90411,90412,90413],{},"At least one end-customer connection (for example, a HubSpot or Greenhouse connection), and its connection ID from ",[41,90414,16241],{"href":28005,"rel":90415},[45],[2357,90417,90418],{},"Python 3.10+ or Node.js 18+",[55,90420,54368],{"id":90421},"install",[22,90423,90424],{},[31,90425,90426],{},"Python",[2584,90428,90430],{"className":2586,"code":90429,"language":2588,"meta":2433,"style":2433},"pip install langchain langchain-mcp-adapters langchain-anthropic\n",[36,90431,90432],{"__ignoreMap":2433},[414,90433,90434,90436,90438,90441,90444],{"class":2593,"line":2594},[414,90435,70597],{"class":2597},[414,90437,2630],{"class":2601},[414,90439,90440],{"class":2601}," langchain",[414,90442,90443],{"class":2601}," langchain-mcp-adapters",[414,90445,90446],{"class":2601}," langchain-anthropic\n",[22,90448,90449],{},[31,90450,90451],{},"TypeScript",[2584,90453,90455],{"className":2586,"code":90454,"language":2588,"meta":2433,"style":2433},"npm install langchain @langchain\u002Fmcp-adapters @langchain\u002Fanthropic\n",[36,90456,90457],{"__ignoreMap":2433},[414,90458,90459,90461,90463,90465,90468],{"class":2593,"line":2594},[414,90460,2616],{"class":2597},[414,90462,2630],{"class":2601},[414,90464,90440],{"class":2601},[414,90466,90467],{"class":2601}," @langchain\u002Fmcp-adapters",[414,90469,90470],{"class":2601}," @langchain\u002Fanthropic\n",[22,90472,90473],{},"You can use any LangChain-supported model provider. The examples below use Anthropic, but OpenAI, Google, Mistral and others work the same way.",[55,90475,90477],{"id":90476},"quickstart-python","Quickstart (Python)",[22,90479,90480],{},"Connect LangChain to the Unified MCP server with a few lines of code:",[2584,90482,90484],{"className":37862,"code":90483,"language":37864,"meta":2433,"style":2433},"import asyncio\nimport os\n\nfrom langchain.agents import create_agent\nfrom langchain_mcp_adapters.client import MultiServerMCPClient\n\nUNIFIED_API_KEY = os.environ[\"UNIFIED_API_KEY\"]\nCONNECTION_ID = os.environ[\"UNIFIED_CONNECTION_ID\"]  # end-customer connection\n\n\nasync def main():\n    client = MultiServerMCPClient(\n        {\n            \"unified\": {\n                \"transport\": \"streamable_http\",\n                \"url\": f\"https:\u002F\u002Fmcp-api.unified.to\u002Fmcp?connection={CONNECTION_ID}\",\n                \"headers\": {\"Authorization\": f\"bearer {UNIFIED_API_KEY}\"},\n            }\n        }\n    )\n\n    tools = await client.get_tools()\n    print(f\"Loaded {len(tools)} Unified tools\")\n\n    agent = create_agent(\"anthropic:claude-sonnet-4-5\", tools)\n\n    result = await agent.ainvoke(\n        {\"messages\": [{\"role\": \"user\", \"content\": \"List the 10 most recently updated deals and summarize their stages.\"}]}\n    )\n    print(result[\"messages\"][-1].content)\n\n\nasyncio.run(main())\n",[36,90485,90486,90492,90498,90502,90514,90526,90530,90542,90559,90563,90567,90577,90587,90591,90598,90610,90627,90649,90653,90657,90661,90665,90676,90700,90704,90720,90724,90736,90764,90768,90787,90791,90795],{"__ignoreMap":2433},[414,90487,90488,90490],{"class":2593,"line":2594},[414,90489,2699],{"class":2698},[414,90491,41774],{"class":2705},[414,90493,90494,90496],{"class":2593,"line":2434},[414,90495,2699],{"class":2698},[414,90497,37873],{"class":2705},[414,90499,90500],{"class":2593,"line":2613},[414,90501,2740],{"emptyLinePlaceholder":2459},[414,90503,90504,90506,90509,90511],{"class":2593,"line":2625},[414,90505,2716],{"class":2698},[414,90507,90508],{"class":2705}," langchain.agents ",[414,90510,2699],{"class":2698},[414,90512,90513],{"class":2705}," create_agent\n",[414,90515,90516,90518,90521,90523],{"class":2593,"line":2677},[414,90517,2716],{"class":2698},[414,90519,90520],{"class":2705}," langchain_mcp_adapters.client ",[414,90522,2699],{"class":2698},[414,90524,90525],{"class":2705}," MultiServerMCPClient\n",[414,90527,90528],{"class":2593,"line":2751},[414,90529,2740],{"emptyLinePlaceholder":2459},[414,90531,90532,90534,90536,90538,90540],{"class":2593,"line":2760},[414,90533,2560],{"class":2607},[414,90535,2817],{"class":2698},[414,90537,37904],{"class":2705},[414,90539,37907],{"class":2601},[414,90541,9376],{"class":2705},[414,90543,90544,90546,90548,90550,90553,90556],{"class":2593,"line":2768},[414,90545,28751],{"class":2607},[414,90547,2817],{"class":2698},[414,90549,37904],{"class":2705},[414,90551,90552],{"class":2601},"\"UNIFIED_CONNECTION_ID\"",[414,90554,90555],{"class":2705},"]  ",[414,90557,90558],{"class":3527},"# end-customer connection\n",[414,90560,90561],{"class":2593,"line":2776},[414,90562,2740],{"emptyLinePlaceholder":2459},[414,90564,90565],{"class":2593,"line":2784},[414,90566,2740],{"emptyLinePlaceholder":2459},[414,90568,90569,90571,90573,90575],{"class":2593,"line":2792},[414,90570,3928],{"class":2698},[414,90572,41950],{"class":2698},[414,90574,3933],{"class":2597},[414,90576,41955],{"class":2705},[414,90578,90579,90582,90584],{"class":2593,"line":2804},[414,90580,90581],{"class":2705},"    client ",[414,90583,2798],{"class":2698},[414,90585,90586],{"class":2705}," MultiServerMCPClient(\n",[414,90588,90589],{"class":2593,"line":2809},[414,90590,10590],{"class":2705},[414,90592,90593,90596],{"class":2593,"line":2829},[414,90594,90595],{"class":2601},"            \"unified\"",[414,90597,10477],{"class":2705},[414,90599,90600,90603,90605,90608],{"class":2593,"line":2843},[414,90601,90602],{"class":2601},"                \"transport\"",[414,90604,7340],{"class":2705},[414,90606,90607],{"class":2601},"\"streamable_http\"",[414,90609,2757],{"class":2705},[414,90611,90612,90615,90617,90619,90621,90623,90625],{"class":2593,"line":2849},[414,90613,90614],{"class":2601},"                \"url\"",[414,90616,7340],{"class":2705},[414,90618,37993],{"class":2698},[414,90620,41862],{"class":2601},[414,90622,41865],{"class":2607},[414,90624,7395],{"class":2601},[414,90626,2757],{"class":2705},[414,90628,90629,90632,90634,90636,90638,90640,90643,90645,90647],{"class":2593,"line":2854},[414,90630,90631],{"class":2601},"                \"headers\"",[414,90633,39739],{"class":2705},[414,90635,37988],{"class":2601},[414,90637,7340],{"class":2705},[414,90639,37993],{"class":2698},[414,90641,90642],{"class":2601},"\"bearer ",[414,90644,37999],{"class":2607},[414,90646,7395],{"class":2601},[414,90648,38004],{"class":2705},[414,90650,90651],{"class":2593,"line":2880},[414,90652,65438],{"class":2705},[414,90654,90655],{"class":2593,"line":3253},[414,90656,10641],{"class":2705},[414,90658,90659],{"class":2593,"line":3261},[414,90660,38158],{"class":2705},[414,90662,90663],{"class":2593,"line":3279},[414,90664,2740],{"emptyLinePlaceholder":2459},[414,90666,90667,90669,90671,90673],{"class":2593,"line":3313},[414,90668,41987],{"class":2705},[414,90670,2798],{"class":2698},[414,90672,3002],{"class":2698},[414,90674,90675],{"class":2705}," client.get_tools()\n",[414,90677,90678,90680,90682,90684,90687,90690,90693,90695,90698],{"class":2593,"line":3326},[414,90679,41999],{"class":2607},[414,90681,2968],{"class":2705},[414,90683,37993],{"class":2698},[414,90685,90686],{"class":2601},"\"Loaded ",[414,90688,90689],{"class":2607},"{len",[414,90691,90692],{"class":2705},"(tools)",[414,90694,38264],{"class":2607},[414,90696,90697],{"class":2601}," Unified tools\"",[414,90699,3141],{"class":2705},[414,90701,90702],{"class":2593,"line":3339},[414,90703,2740],{"emptyLinePlaceholder":2459},[414,90705,90706,90709,90711,90714,90717],{"class":2593,"line":3359},[414,90707,90708],{"class":2705},"    agent ",[414,90710,2798],{"class":2698},[414,90712,90713],{"class":2705}," create_agent(",[414,90715,90716],{"class":2601},"\"anthropic:claude-sonnet-4-5\"",[414,90718,90719],{"class":2705},", tools)\n",[414,90721,90722],{"class":2593,"line":6453},[414,90723,2740],{"emptyLinePlaceholder":2459},[414,90725,90726,90729,90731,90733],{"class":2593,"line":6459},[414,90727,90728],{"class":2705},"    result ",[414,90730,2798],{"class":2698},[414,90732,3002],{"class":2698},[414,90734,90735],{"class":2705}," agent.ainvoke(\n",[414,90737,90738,90741,90744,90746,90748,90750,90752,90754,90756,90758,90761],{"class":2593,"line":6465},[414,90739,90740],{"class":2705},"        {",[414,90742,90743],{"class":2601},"\"messages\"",[414,90745,39725],{"class":2705},[414,90747,38066],{"class":2601},[414,90749,7340],{"class":2705},[414,90751,38071],{"class":2601},[414,90753,319],{"class":2705},[414,90755,38076],{"class":2601},[414,90757,7340],{"class":2705},[414,90759,90760],{"class":2601},"\"List the 10 most recently updated deals and summarize their stages.\"",[414,90762,90763],{"class":2705},"}]}\n",[414,90765,90766],{"class":2593,"line":6471},[414,90767,38158],{"class":2705},[414,90769,90770,90772,90775,90777,90780,90782,90784],{"class":2593,"line":6477},[414,90771,41999],{"class":2607},[414,90773,90774],{"class":2705},"(result[",[414,90776,90743],{"class":2601},[414,90778,90779],{"class":2705},"][",[414,90781,34146],{"class":2698},[414,90783,15737],{"class":2607},[414,90785,90786],{"class":2705},"].content)\n",[414,90788,90789],{"class":2593,"line":6483},[414,90790,2740],{"emptyLinePlaceholder":2459},[414,90792,90793],{"class":2593,"line":6489},[414,90794,2740],{"emptyLinePlaceholder":2459},[414,90796,90797],{"class":2593,"line":6495},[414,90798,42026],{"class":2705},[22,90800,90801],{},"The tools available depend on the connection's integration and the permissions granted. A CRM connection exposes tools for contacts, companies, deals, and so on. An ATS connection exposes tools for candidates, applications, jobs, and so on.",[55,90803,90805],{"id":90804},"quickstart-typescript","Quickstart (TypeScript)",[2584,90807,90809],{"className":2689,"code":90808,"language":2691,"meta":2433,"style":2433},"import { MultiServerMCPClient } from \"@langchain\u002Fmcp-adapters\";\nimport { createAgent } from \"langchain\";\n\nconst client = new MultiServerMCPClient({\n  mcpServers: {\n    unified: {\n      transport: \"http\",\n      url: `https:\u002F\u002Fmcp-api.unified.to\u002Fmcp?connection=${process.env.UNIFIED_CONNECTION_ID}`,\n      headers: { Authorization: `bearer ${process.env.UNIFIED_API_KEY}` },\n    },\n  },\n});\n\nconst tools = await client.getTools();\n\nconst agent = createAgent({ model: \"anthropic:claude-sonnet-4-5\", tools });\n\nconst result = await agent.invoke({\n  messages: [{ role: \"user\", content: \"Find open jobs and count applications per job.\" }],\n});\nconsole.log(result.messages.at(-1)?.content);\n\nawait client.close();\n",[36,90810,90811,90825,90839,90843,90858,90863,90868,90878,90901,90923,90927,90931,90935,90939,90956,90960,90980,90984,91002,91017,91021,91042,91046],{"__ignoreMap":2433},[414,90812,90813,90815,90818,90820,90823],{"class":2593,"line":2594},[414,90814,2699],{"class":2698},[414,90816,90817],{"class":2705}," { MultiServerMCPClient } ",[414,90819,2716],{"class":2698},[414,90821,90822],{"class":2601}," \"@langchain\u002Fmcp-adapters\"",[414,90824,2706],{"class":2705},[414,90826,90827,90829,90832,90834,90837],{"class":2593,"line":2434},[414,90828,2699],{"class":2698},[414,90830,90831],{"class":2705}," { createAgent } ",[414,90833,2716],{"class":2698},[414,90835,90836],{"class":2601}," \"langchain\"",[414,90838,2706],{"class":2705},[414,90840,90841],{"class":2593,"line":2613},[414,90842,2740],{"emptyLinePlaceholder":2459},[414,90844,90845,90847,90849,90851,90853,90856],{"class":2593,"line":2625},[414,90846,2745],{"class":2698},[414,90848,41241],{"class":2607},[414,90850,2817],{"class":2698},[414,90852,2820],{"class":2698},[414,90854,90855],{"class":2597}," MultiServerMCPClient",[414,90857,2826],{"class":2705},[414,90859,90860],{"class":2593,"line":2677},[414,90861,90862],{"class":2705},"  mcpServers: {\n",[414,90864,90865],{"class":2593,"line":2751},[414,90866,90867],{"class":2705},"    unified: {\n",[414,90869,90870,90873,90876],{"class":2593,"line":2760},[414,90871,90872],{"class":2705},"      transport: ",[414,90874,90875],{"class":2601},"\"http\"",[414,90877,2757],{"class":2705},[414,90879,90880,90883,90886,90888,90890,90892,90894,90897,90899],{"class":2593,"line":2768},[414,90881,90882],{"class":2705},"      url: ",[414,90884,90885],{"class":2601},"`https:\u002F\u002Fmcp-api.unified.to\u002Fmcp?connection=${",[414,90887,40229],{"class":2705},[414,90889,97],{"class":2601},[414,90891,40234],{"class":2705},[414,90893,97],{"class":2601},[414,90895,90896],{"class":2607},"UNIFIED_CONNECTION_ID",[414,90898,3308],{"class":2601},[414,90900,2757],{"class":2705},[414,90902,90903,90906,90909,90911,90913,90915,90917,90919,90921],{"class":2593,"line":2776},[414,90904,90905],{"class":2705},"      headers: { Authorization: ",[414,90907,90908],{"class":2601},"`bearer ${",[414,90910,40229],{"class":2705},[414,90912,97],{"class":2601},[414,90914,40234],{"class":2705},[414,90916,97],{"class":2601},[414,90918,2560],{"class":2607},[414,90920,3308],{"class":2601},[414,90922,2840],{"class":2705},[414,90924,90925],{"class":2593,"line":2784},[414,90926,3548],{"class":2705},[414,90928,90929],{"class":2593,"line":2792},[414,90930,16052],{"class":2705},[414,90932,90933],{"class":2593,"line":2804},[414,90934,2846],{"class":2705},[414,90936,90937],{"class":2593,"line":2809},[414,90938,2740],{"emptyLinePlaceholder":2459},[414,90940,90941,90943,90945,90947,90949,90951,90954],{"class":2593,"line":2829},[414,90942,2745],{"class":2698},[414,90944,40189],{"class":2607},[414,90946,2817],{"class":2698},[414,90948,3002],{"class":2698},[414,90950,41285],{"class":2705},[414,90952,90953],{"class":2597},"getTools",[414,90955,4088],{"class":2705},[414,90957,90958],{"class":2593,"line":2843},[414,90959,2740],{"emptyLinePlaceholder":2459},[414,90961,90962,90964,90967,90969,90972,90975,90977],{"class":2593,"line":2849},[414,90963,2745],{"class":2698},[414,90965,90966],{"class":2607}," agent",[414,90968,2817],{"class":2698},[414,90970,90971],{"class":2597}," createAgent",[414,90973,90974],{"class":2705},"({ model: ",[414,90976,90716],{"class":2601},[414,90978,90979],{"class":2705},", tools });\n",[414,90981,90982],{"class":2593,"line":2854},[414,90983,2740],{"emptyLinePlaceholder":2459},[414,90985,90986,90988,90990,90992,90994,90997,91000],{"class":2593,"line":2880},[414,90987,2745],{"class":2698},[414,90989,3470],{"class":2607},[414,90991,2817],{"class":2698},[414,90993,3002],{"class":2698},[414,90995,90996],{"class":2705}," agent.",[414,90998,90999],{"class":2597},"invoke",[414,91001,2826],{"class":2705},[414,91003,91004,91007,91009,91012,91015],{"class":2593,"line":3253},[414,91005,91006],{"class":2705},"  messages: [{ role: ",[414,91008,38071],{"class":2601},[414,91010,91011],{"class":2705},", content: ",[414,91013,91014],{"class":2601},"\"Find open jobs and count applications per job.\"",[414,91016,10469],{"class":2705},[414,91018,91019],{"class":2593,"line":3261},[414,91020,2846],{"class":2705},[414,91022,91023,91025,91027,91030,91033,91035,91037,91039],{"class":2593,"line":3279},[414,91024,39099],{"class":2705},[414,91026,4064],{"class":2597},[414,91028,91029],{"class":2705},"(result.messages.",[414,91031,91032],{"class":2597},"at",[414,91034,2968],{"class":2705},[414,91036,34146],{"class":2698},[414,91038,15737],{"class":2607},[414,91040,91041],{"class":2705},")?.content);\n",[414,91043,91044],{"class":2593,"line":3313},[414,91045,2740],{"emptyLinePlaceholder":2459},[414,91047,91048,91050,91052,91054],{"class":2593,"line":3326},[414,91049,41282],{"class":2698},[414,91051,41285],{"class":2705},[414,91053,41372],{"class":2597},[414,91055,4088],{"class":2705},[55,91057,37791],{"id":37790},[22,91059,91060,91061,91063,91064,91067,91068,91072],{},"Send the token in the ",[36,91062,37801],{}," header; the ",[36,91065,91066],{},"token"," URL parameter is deprecated. All other options must be sent as URL parameters. See ",[41,91069,37791],{"href":91070,"rel":91071},"https:\u002F\u002Fdocs.unified.to\u002Fmcp\u002Fauthentication",[45]," for full details.",[155,91074,91075,91087],{},[158,91076,91077],{},[161,91078,91079,91082,91084],{},[164,91080,91081],{},"Use case",[164,91083,22773],{},[164,91085,91086],{},"Other URL parameters",[174,91088,91089,91105,91122],{},[161,91090,91091,91094,91100],{},[179,91092,91093],{},"Your backend runs the agent (recommended)",[179,91095,91096,91097,91099],{},"Workspace API key, in the ",[36,91098,22285],{}," header",[179,91101,91102],{},[36,91103,91104],{},"connection={connectionId}",[161,91106,91107,91110,91119],{},[179,91108,91109],{},"Token is handed to a less-trusted runtime or end user",[179,91111,91112,91113,91115,91116,91118],{},"Connection-scoped signed token from ",[36,91114,37830],{}," (mode=user), in the ",[36,91117,22285],{}," header; works for one connection only",[179,91120,91121],{},"none",[161,91123,91124,91140,91142],{},[179,91125,91126,34,91129,34,91134,91136,91137,91139],{},[31,91127,91128],{},"A workspace API key grants access to all of your connections and your",[41,91130,91132],{"href":121,"rel":91131},[45],[31,91133,123],{},[31,91135,70269],{}," Keep it server-side, send it only in the ",[36,91138,22285],{}," header, and never put it in an MCP URL or a client config.",[179,91141],{},[179,91143],{},[55,91145,91147],{"id":91146},"controlling-which-tools-the-agent-sees","Controlling which tools the agent sees",[22,91149,91150,91151,91155],{},"Agents choose tools more reliably when they see a smaller, focused list, and a shorter list also saves context. Use these ",[41,91152,91154],{"href":87518,"rel":91153},[45],"server options"," as URL parameters to shape the tools LangChain loads:",[155,91157,91158,91168],{},[158,91159,91160],{},[161,91161,91162,91165],{},[164,91163,91164],{},"Option",[164,91166,91167],{},"What it does",[174,91169,91170,91179,91188],{},[161,91171,91172,91176],{},[179,91173,91174],{},[36,91175,38594],{},[179,91177,91178],{},"Comma-delimited list of tool IDs. Only these tools are exposed.",[161,91180,91181,91185],{},[179,91182,91183],{},[36,91184,38588],{},[179,91186,91187],{},"Comma-delimited list of Unified.to permissions. Only tools allowed by these permissions are exposed. For example, pass read-only permissions for an agent that should never write.",[161,91189,91190,91195],{},[179,91191,91192],{},[36,91193,91194],{},"hide_sensitive",[179,91196,91197],{},"Hides PII fields (names, emails, telephones, and so on) from results.",[2584,91199,91201],{"className":37862,"code":91200,"language":37864,"meta":2433,"style":2433},"url = (\n    \"https:\u002F\u002Fmcp-api.unified.to\u002Fmcp\"\n    f\"?connection={CONNECTION_ID}\"\n    \"&permissions=crm_contact_read,crm_deal_read\"\n    \"&hide_sensitive=true\"\n)\n",[36,91202,91203,91212,91217,91228,91233,91238],{"__ignoreMap":2433},[414,91204,91205,91208,91210],{"class":2593,"line":2594},[414,91206,91207],{"class":2705},"url ",[414,91209,2798],{"class":2698},[414,91211,16524],{"class":2705},[414,91213,91214],{"class":2593,"line":2434},[414,91215,91216],{"class":2601},"    \"https:\u002F\u002Fmcp-api.unified.to\u002Fmcp\"\n",[414,91218,91219,91221,91224,91226],{"class":2593,"line":2613},[414,91220,37966],{"class":2698},[414,91222,91223],{"class":2601},"\"?connection=",[414,91225,41865],{"class":2607},[414,91227,18471],{"class":2601},[414,91229,91230],{"class":2593,"line":2625},[414,91231,91232],{"class":2601},"    \"&permissions=crm_contact_read,crm_deal_read\"\n",[414,91234,91235],{"class":2593,"line":2677},[414,91236,91237],{"class":2601},"    \"&hide_sensitive=true\"\n",[414,91239,91240],{"class":2593,"line":2751},[414,91241,3141],{"class":2705},[55,91243,91245],{"id":91244},"using-unified-tools-in-a-langgraph-workflow","Using Unified tools in a LangGraph workflow",[22,91247,91248,91249,2646],{},"For more control over agent flow, bind the Unified tools to a model and route tool calls through a LangGraph ",[36,91250,90398],{},[2584,91252,91254],{"className":37862,"code":91253,"language":37864,"meta":2433,"style":2433},"from langchain.chat_models import init_chat_model\nfrom langchain_mcp_adapters.client import MultiServerMCPClient\nfrom langgraph.graph import StateGraph, MessagesState, START\nfrom langgraph.prebuilt import ToolNode, tools_condition\n\nclient = MultiServerMCPClient(\n    {\n        \"unified\": {\n            \"transport\": \"streamable_http\",\n            \"url\": f\"https:\u002F\u002Fmcp-api.unified.to\u002Fmcp?connection={CONNECTION_ID}\",\n            \"headers\": {\"Authorization\": f\"bearer {UNIFIED_API_KEY}\"},\n        }\n    }\n)\ntools = await client.get_tools()\n\nmodel = init_chat_model(\"anthropic:claude-sonnet-4-5\").bind_tools(tools)\n\n\nasync def call_model(state: MessagesState):\n    return {\"messages\": [await model.ainvoke(state[\"messages\"])]}\n\n\nbuilder = StateGraph(MessagesState)\nbuilder.add_node(\"call_model\", call_model)\nbuilder.add_node(\"tools\", ToolNode(tools))\nbuilder.add_edge(START, \"call_model\")\nbuilder.add_conditional_edges(\"call_model\", tools_condition)\nbuilder.add_edge(\"tools\", \"call_model\")\ngraph = builder.compile()\n\nresult = await graph.ainvoke(\n    {\"messages\": [{\"role\": \"user\", \"content\": \"Which candidates applied this week, and for which roles?\"}]}\n)\n",[36,91255,91256,91268,91278,91293,91305,91309,91317,91321,91327,91338,91354,91374,91378,91382,91386,91396,91400,91415,91419,91423,91435,91456,91460,91464,91474,91485,91494,91508,91518,91530,91540,91544,91556,91582],{"__ignoreMap":2433},[414,91257,91258,91260,91263,91265],{"class":2593,"line":2594},[414,91259,2716],{"class":2698},[414,91261,91262],{"class":2705}," langchain.chat_models ",[414,91264,2699],{"class":2698},[414,91266,91267],{"class":2705}," init_chat_model\n",[414,91269,91270,91272,91274,91276],{"class":2593,"line":2434},[414,91271,2716],{"class":2698},[414,91273,90520],{"class":2705},[414,91275,2699],{"class":2698},[414,91277,90525],{"class":2705},[414,91279,91280,91282,91285,91287,91290],{"class":2593,"line":2613},[414,91281,2716],{"class":2698},[414,91283,91284],{"class":2705}," langgraph.graph ",[414,91286,2699],{"class":2698},[414,91288,91289],{"class":2705}," StateGraph, MessagesState, ",[414,91291,91292],{"class":2607},"START\n",[414,91294,91295,91297,91300,91302],{"class":2593,"line":2625},[414,91296,2716],{"class":2698},[414,91298,91299],{"class":2705}," langgraph.prebuilt ",[414,91301,2699],{"class":2698},[414,91303,91304],{"class":2705}," ToolNode, tools_condition\n",[414,91306,91307],{"class":2593,"line":2677},[414,91308,2740],{"emptyLinePlaceholder":2459},[414,91310,91311,91313,91315],{"class":2593,"line":2751},[414,91312,38045],{"class":2705},[414,91314,2798],{"class":2698},[414,91316,90586],{"class":2705},[414,91318,91319],{"class":2593,"line":2760},[414,91320,15559],{"class":2705},[414,91322,91323,91325],{"class":2593,"line":2768},[414,91324,41892],{"class":2601},[414,91326,10477],{"class":2705},[414,91328,91329,91332,91334,91336],{"class":2593,"line":2776},[414,91330,91331],{"class":2601},"            \"transport\"",[414,91333,7340],{"class":2705},[414,91335,90607],{"class":2601},[414,91337,2757],{"class":2705},[414,91339,91340,91342,91344,91346,91348,91350,91352],{"class":2593,"line":2784},[414,91341,41899],{"class":2601},[414,91343,7340],{"class":2705},[414,91345,37993],{"class":2698},[414,91347,41862],{"class":2601},[414,91349,41865],{"class":2607},[414,91351,7395],{"class":2601},[414,91353,2757],{"class":2705},[414,91355,91356,91358,91360,91362,91364,91366,91368,91370,91372],{"class":2593,"line":2792},[414,91357,41910],{"class":2601},[414,91359,39739],{"class":2705},[414,91361,37988],{"class":2601},[414,91363,7340],{"class":2705},[414,91365,37993],{"class":2698},[414,91367,90642],{"class":2601},[414,91369,37999],{"class":2607},[414,91371,7395],{"class":2601},[414,91373,38004],{"class":2705},[414,91375,91376],{"class":2593,"line":2804},[414,91377,10641],{"class":2705},[414,91379,91380],{"class":2593,"line":2809},[414,91381,10535],{"class":2705},[414,91383,91384],{"class":2593,"line":2829},[414,91385,3141],{"class":2705},[414,91387,91388,91390,91392,91394],{"class":2593,"line":2843},[414,91389,37956],{"class":2705},[414,91391,2798],{"class":2698},[414,91393,3002],{"class":2698},[414,91395,90675],{"class":2705},[414,91397,91398],{"class":2593,"line":2849},[414,91399,2740],{"emptyLinePlaceholder":2459},[414,91401,91402,91405,91407,91410,91412],{"class":2593,"line":2854},[414,91403,91404],{"class":2705},"model ",[414,91406,2798],{"class":2698},[414,91408,91409],{"class":2705}," init_chat_model(",[414,91411,90716],{"class":2601},[414,91413,91414],{"class":2705},").bind_tools(tools)\n",[414,91416,91417],{"class":2593,"line":2880},[414,91418,2740],{"emptyLinePlaceholder":2459},[414,91420,91421],{"class":2593,"line":3253},[414,91422,2740],{"emptyLinePlaceholder":2459},[414,91424,91425,91427,91429,91432],{"class":2593,"line":3261},[414,91426,3928],{"class":2698},[414,91428,41950],{"class":2698},[414,91430,91431],{"class":2597}," call_model",[414,91433,91434],{"class":2705},"(state: MessagesState):\n",[414,91436,91437,91439,91442,91444,91446,91448,91451,91453],{"class":2593,"line":3279},[414,91438,25149],{"class":2698},[414,91440,91441],{"class":2705}," {",[414,91443,90743],{"class":2601},[414,91445,10492],{"class":2705},[414,91447,41282],{"class":2698},[414,91449,91450],{"class":2705}," model.ainvoke(state[",[414,91452,90743],{"class":2601},[414,91454,91455],{"class":2705},"])]}\n",[414,91457,91458],{"class":2593,"line":3313},[414,91459,2740],{"emptyLinePlaceholder":2459},[414,91461,91462],{"class":2593,"line":3326},[414,91463,2740],{"emptyLinePlaceholder":2459},[414,91465,91466,91469,91471],{"class":2593,"line":3339},[414,91467,91468],{"class":2705},"builder ",[414,91470,2798],{"class":2698},[414,91472,91473],{"class":2705}," StateGraph(MessagesState)\n",[414,91475,91476,91479,91482],{"class":2593,"line":3359},[414,91477,91478],{"class":2705},"builder.add_node(",[414,91480,91481],{"class":2601},"\"call_model\"",[414,91483,91484],{"class":2705},", call_model)\n",[414,91486,91487,91489,91491],{"class":2593,"line":6453},[414,91488,91478],{"class":2705},[414,91490,86790],{"class":2601},[414,91492,91493],{"class":2705},", ToolNode(tools))\n",[414,91495,91496,91499,91502,91504,91506],{"class":2593,"line":6459},[414,91497,91498],{"class":2705},"builder.add_edge(",[414,91500,91501],{"class":2607},"START",[414,91503,319],{"class":2705},[414,91505,91481],{"class":2601},[414,91507,3141],{"class":2705},[414,91509,91510,91513,91515],{"class":2593,"line":6465},[414,91511,91512],{"class":2705},"builder.add_conditional_edges(",[414,91514,91481],{"class":2601},[414,91516,91517],{"class":2705},", tools_condition)\n",[414,91519,91520,91522,91524,91526,91528],{"class":2593,"line":6471},[414,91521,91498],{"class":2705},[414,91523,86790],{"class":2601},[414,91525,319],{"class":2705},[414,91527,91481],{"class":2601},[414,91529,3141],{"class":2705},[414,91531,91532,91535,91537],{"class":2593,"line":6477},[414,91533,91534],{"class":2705},"graph ",[414,91536,2798],{"class":2698},[414,91538,91539],{"class":2705}," builder.compile()\n",[414,91541,91542],{"class":2593,"line":6483},[414,91543,2740],{"emptyLinePlaceholder":2459},[414,91545,91546,91549,91551,91553],{"class":2593,"line":6489},[414,91547,91548],{"class":2705},"result ",[414,91550,2798],{"class":2698},[414,91552,3002],{"class":2698},[414,91554,91555],{"class":2705}," graph.ainvoke(\n",[414,91557,91558,91561,91563,91565,91567,91569,91571,91573,91575,91577,91580],{"class":2593,"line":6495},[414,91559,91560],{"class":2705},"    {",[414,91562,90743],{"class":2601},[414,91564,39725],{"class":2705},[414,91566,38066],{"class":2601},[414,91568,7340],{"class":2705},[414,91570,38071],{"class":2601},[414,91572,319],{"class":2705},[414,91574,38076],{"class":2601},[414,91576,7340],{"class":2705},[414,91578,91579],{"class":2601},"\"Which candidates applied this week, and for which roles?\"",[414,91581,90763],{"class":2705},[414,91583,91584],{"class":2593,"line":6501},[414,91585,3141],{"class":2705},[55,91587,91589],{"id":91588},"multi-tenant-agents","Multi-tenant agents",[22,91591,91592],{},"If your product serves many end customers, each customer has their own Unified connection. Create the MCP client per request or session, scoped to the current customer's connection, so an agent can only reach that customer's data:",[2584,91594,91596],{"className":37862,"code":91595,"language":37864,"meta":2433,"style":2433},"def unified_client_for(connection_id: str) -> MultiServerMCPClient:\n    return MultiServerMCPClient(\n        {\n            \"unified\": {\n                \"transport\": \"streamable_http\",\n                \"url\": f\"https:\u002F\u002Fmcp-api.unified.to\u002Fmcp?connection={connection_id}\",\n                \"headers\": {\"Authorization\": f\"bearer {UNIFIED_API_KEY}\"},\n            }\n        }\n    )\n\n\nasync def handle_request(customer, prompt: str):\n    tools = await unified_client_for(customer.unified_connection_id).get_tools()\n    agent = create_agent(\"anthropic:claude-sonnet-4-5\", tools)\n    return await agent.ainvoke({\"messages\": [{\"role\": \"user\", \"content\": prompt}]})\n",[36,91597,91598,91614,91620,91624,91630,91640,91660,91680,91684,91688,91692,91696,91700,91717,91728,91740],{"__ignoreMap":2433},[414,91599,91600,91602,91605,91608,91611],{"class":2593,"line":2594},[414,91601,72796],{"class":2698},[414,91603,91604],{"class":2597}," unified_client_for",[414,91606,91607],{"class":2705},"(connection_id: ",[414,91609,91610],{"class":2607},"str",[414,91612,91613],{"class":2705},") -> MultiServerMCPClient:\n",[414,91615,91616,91618],{"class":2593,"line":2434},[414,91617,25149],{"class":2698},[414,91619,90586],{"class":2705},[414,91621,91622],{"class":2593,"line":2613},[414,91623,10590],{"class":2705},[414,91625,91626,91628],{"class":2593,"line":2625},[414,91627,90595],{"class":2601},[414,91629,10477],{"class":2705},[414,91631,91632,91634,91636,91638],{"class":2593,"line":2677},[414,91633,90602],{"class":2601},[414,91635,7340],{"class":2705},[414,91637,90607],{"class":2601},[414,91639,2757],{"class":2705},[414,91641,91642,91644,91646,91648,91650,91652,91654,91656,91658],{"class":2593,"line":2751},[414,91643,90614],{"class":2601},[414,91645,7340],{"class":2705},[414,91647,37993],{"class":2698},[414,91649,41862],{"class":2601},[414,91651,28091],{"class":2607},[414,91653,85],{"class":2705},[414,91655,38264],{"class":2607},[414,91657,7395],{"class":2601},[414,91659,2757],{"class":2705},[414,91661,91662,91664,91666,91668,91670,91672,91674,91676,91678],{"class":2593,"line":2760},[414,91663,90631],{"class":2601},[414,91665,39739],{"class":2705},[414,91667,37988],{"class":2601},[414,91669,7340],{"class":2705},[414,91671,37993],{"class":2698},[414,91673,90642],{"class":2601},[414,91675,37999],{"class":2607},[414,91677,7395],{"class":2601},[414,91679,38004],{"class":2705},[414,91681,91682],{"class":2593,"line":2768},[414,91683,65438],{"class":2705},[414,91685,91686],{"class":2593,"line":2776},[414,91687,10641],{"class":2705},[414,91689,91690],{"class":2593,"line":2784},[414,91691,38158],{"class":2705},[414,91693,91694],{"class":2593,"line":2792},[414,91695,2740],{"emptyLinePlaceholder":2459},[414,91697,91698],{"class":2593,"line":2804},[414,91699,2740],{"emptyLinePlaceholder":2459},[414,91701,91702,91704,91706,91709,91712,91714],{"class":2593,"line":2809},[414,91703,3928],{"class":2698},[414,91705,41950],{"class":2698},[414,91707,91708],{"class":2597}," handle_request",[414,91710,91711],{"class":2705},"(customer, prompt: ",[414,91713,91610],{"class":2607},[414,91715,91716],{"class":2705},"):\n",[414,91718,91719,91721,91723,91725],{"class":2593,"line":2829},[414,91720,41987],{"class":2705},[414,91722,2798],{"class":2698},[414,91724,3002],{"class":2698},[414,91726,91727],{"class":2705}," unified_client_for(customer.unified_connection_id).get_tools()\n",[414,91729,91730,91732,91734,91736,91738],{"class":2593,"line":2843},[414,91731,90708],{"class":2705},[414,91733,2798],{"class":2698},[414,91735,90713],{"class":2705},[414,91737,90716],{"class":2601},[414,91739,90719],{"class":2705},[414,91741,91742,91744,91746,91749,91751,91753,91755,91757,91759,91761,91763],{"class":2593,"line":2849},[414,91743,25149],{"class":2698},[414,91745,3002],{"class":2698},[414,91747,91748],{"class":2705}," agent.ainvoke({",[414,91750,90743],{"class":2601},[414,91752,39725],{"class":2705},[414,91754,38066],{"class":2601},[414,91756,7340],{"class":2705},[414,91758,38071],{"class":2601},[414,91760,319],{"class":2705},[414,91762,38076],{"class":2601},[414,91764,91765],{"class":2705},": prompt}]})\n",[22,91767,91768],{},"Because Unified normalizes data across integrations, the same agent code works whether one customer uses Salesforce and another uses HubSpot.",[55,91770,91772],{"id":91771},"calling-tools-directly","Calling tools directly",[22,91774,91775],{},"Unified tools are standard LangChain tools, so deterministic workflows can call them without an agent:",[2584,91777,91779],{"className":37862,"code":91778,"language":37864,"meta":2433,"style":2433},"tools_by_name = {t.name: t for t in await client.get_tools()}\ncontacts = await tools_by_name[\"list_crm_contacts\"].ainvoke({\"limit\": 50})\n",[36,91780,91781,91803],{"__ignoreMap":2433},[414,91782,91783,91786,91788,91791,91793,91796,91798,91800],{"class":2593,"line":2594},[414,91784,91785],{"class":2705},"tools_by_name ",[414,91787,2798],{"class":2698},[414,91789,91790],{"class":2705}," {t.name: t ",[414,91792,38406],{"class":2698},[414,91794,91795],{"class":2705}," t ",[414,91797,38217],{"class":2698},[414,91799,3002],{"class":2698},[414,91801,91802],{"class":2705}," client.get_tools()}\n",[414,91804,91805,91808,91810,91812,91815,91818,91821,91823,91825,91827],{"class":2593,"line":2434},[414,91806,91807],{"class":2705},"contacts ",[414,91809,2798],{"class":2698},[414,91811,3002],{"class":2698},[414,91813,91814],{"class":2705}," tools_by_name[",[414,91816,91817],{"class":2601},"\"list_crm_contacts\"",[414,91819,91820],{"class":2705},"].ainvoke({",[414,91822,38494],{"class":2601},[414,91824,7340],{"class":2705},[414,91826,3023],{"class":2607},[414,91828,41939],{"class":2705},[22,91830,91831,91832,91835],{},"Tool names vary by integration and category. Print ",[36,91833,91834],{},"[t.name for t in tools]"," to see what a connection exposes.",[55,91837,91838],{"id":9999},"Regions",[155,91840,91841,91850],{},[158,91842,91843],{},[161,91844,91845,91847],{},[164,91846,5987],{},[164,91848,91849],{},"Streamable HTTP endpoint",[174,91851,91852,91860,91868,91876],{},[161,91853,91854,91856],{},[179,91855,5108],{},[179,91857,91858],{},[36,91859,41510],{},[161,91861,91862,91864],{},[179,91863,5118],{},[179,91865,91866],{},[36,91867,41514],{},[161,91869,91870,91872],{},[179,91871,6897],{},[179,91873,91874],{},[36,91875,41518],{},[161,91877,91878,91885],{},[179,91879,91880,91881,91884],{},"Use the endpoint for the region where your ",[41,91882,123],{"href":121,"rel":91883},[45]," workspace is hosted. A credential works only on its own region's host.",[179,91886],{},[55,91888,5622],{"id":5621},[2354,91890,91891,91900,91911,91922],{},[2357,91892,91893,91896,91897,91899],{},[31,91894,91895],{},"401 \u002F unauthorized:"," Check that the token is a valid workspace API key or a correctly signed end-user token. When you use a workspace API key, make sure the ",[36,91898,37818],{}," parameter is also present.",[2357,91901,91902,91905,91906,4149,91908,91910],{},[31,91903,91904],{},"Fewer tools than expected:"," The tool list reflects the connection's integration, the scopes granted when the customer authorized it, and any ",[36,91907,38594],{},[36,91909,38588],{}," filters in the URL.",[2357,91912,91913,91916,91917,4149,91919,91921],{},[31,91914,91915],{},"Agent picks the wrong tool:"," Narrow the tool list with ",[36,91918,38594],{},[36,91920,38588],{},", and describe the task more specifically in your system prompt.",[2357,91923,91924,91927],{},[31,91925,91926],{},"Options not applied:"," Only the token can go in a header. Every other option must be a URL parameter.",[55,91929,91931],{"id":91930},"related","Related",[2354,91933,91934,91940,91945,91951],{},[2357,91935,91936],{},[41,91937,91939],{"href":41463,"rel":91938},[45],"Unified MCP Server overview",[2357,91941,91942],{},[41,91943,37791],{"href":91070,"rel":91944},[45],[2357,91946,91947],{},[41,91948,91950],{"href":87518,"rel":91949},[45],"Server options",[2357,91952,91953],{},[41,91954,91957],{"href":91955,"rel":91956},"https:\u002F\u002Fgithub.com\u002Flangchain-ai\u002Flangchain-mcp-adapters",[45],"LangChain MCP adapters (Python)",[4156,91959,91960],{},"html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}",{"title":2433,"searchDepth":2434,"depth":2434,"links":91962},[91963,91964,91965,91966,91967,91968,91969,91970,91971,91972,91973,91974,91975],{"id":90380,"depth":2434,"text":90381},{"id":2541,"depth":2434,"text":2542},{"id":90421,"depth":2434,"text":54368},{"id":90476,"depth":2434,"text":90477},{"id":90804,"depth":2434,"text":90805},{"id":37790,"depth":2434,"text":37791},{"id":91146,"depth":2434,"text":91147},{"id":91244,"depth":2434,"text":91245},{"id":91588,"depth":2434,"text":91589},{"id":91771,"depth":2434,"text":91772},{"id":9999,"depth":2434,"text":91838},{"id":5621,"depth":2434,"text":5622},{"id":91930,"depth":2434,"text":91931},"LangChain and LangGraph give you a framework for building AI agents with tools, memory and multi-step workflows. With the official LangChain MCP adapter, every...",{"img":91978,"date":91979,"updated":91980,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Funified_mcp_server_with_langchain_and_langgraph-icon.png","2026-09-25T00:00:00.000Z","2026-10-09T18:39:31.600Z","\u002Fguides\u002Funified_mcp_server_with_langchain_and_langgraph",{"title":90365,"description":91976},"guides\u002Funified_mcp_server_with_langchain_and_langgraph","NP8F4GE-0MXw1dl2A3-MwNXaKIG7yAwkn4RiRipITO0",{"id":91986,"title":74630,"body":91987,"description":92545,"extension":2452,"meta":92546,"navigation":2459,"path":92550,"seo":92551,"stem":92552,"__hash__":92553},"guides\u002Fguides\u002Funlock_real_time_data_with_virtual_webhooks.md",{"type":12,"value":91988,"toc":92535},[91989,91992,91994,91999,92008,92016,92019,92030,92044,92048,92054,92057,92111,92118,92121,92124,92132,92138,92149,92152,92158,92162,92165,92289,92293,92296,92301,92304,92311,92318,92323,92326,92329,92337,92342,92347,92350,92355,92362,92366,92369,92371,92386,92389,92393,92404,92411,92415,92491,92497,92501,92504],[15,91990,74630],{"id":91991},"unlock-real-time-data-with-virtual-webhooks",[19,91993],{},[22,91995,91996],{},[25,91997,91998],{},"February 13, 2025",[22,92000,92001,92002,92007],{},"Product teams building event-driven applications face a common challenge: most third-party APIs don't offer webhooks (In fact, our ",[41,92003,92006],{"href":92004,"rel":92005},"https:\u002F\u002Funified.to\u002Fblog\u002Fthe_state_of_saas_apis_2024",[45],"State of SaaS APIs report"," found only 11% of APIs have built-in support for webhooks). This leads to inefficient polling, manually handling rate limits, and writing custom logic just to avoid stale data.",[22,92009,92010,92011,97],{},"For how virtual webhooks compare with native webhooks and polling, see ",[41,92012,92015],{"href":92013,"rel":92014},"https:\u002F\u002Funified.to\u002Fblog\u002Fwhat_are_virtual_webhooks_how_they_differ_from_sync_based_webhooks",[45],"What Are Virtual Webhooks?",[22,92017,92018],{},"But what if you could control webhook updates while reducing API costs and complexity?",[22,92020,92021,92022,26856,92025,92029],{},"That's exactly what ",[41,92023,123],{"href":121,"rel":92024},[45],[41,92026,22114],{"href":92027,"rel":92028},"https:\u002F\u002Funified.to\u002Fblog\u002Freplace_polling_with_unified_webhooks_real_time_and_historical_data_in_one_flow",[45]," enable. In this article, we'll review:",[2354,92031,92032,92035,92038,92041],{},[2357,92033,92034],{},"How virtual webhooks work",[2357,92036,92037],{},"Why they help control API costs by managing request frequency",[2357,92039,92040],{},"How they reduce the custom rate-limit handling you need to write",[2357,92042,92043],{},"How virtual webhooks shorten the time to receive change events from APIs without webhooks",[55,92045,92047],{"id":92046},"why-use-virtual-webhooks","Why use virtual webhooks?",[22,92049,92050],{},[4201,92051],{"alt":92052,"src":92053},"virtual_webhooks.png","https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Funlock_real_time_data_with_virtual_webhooks-0.png",[22,92055,92056],{},"Pairing Unified.to's virtual webhooks with your product's integration strategy means:",[2354,92058,92059,92065,92071,92077,92087,92093,92099,92105],{},[2357,92060,92061,92064],{},[31,92062,92063],{},"Webhooks on supported integrations and objects:"," Receive change events from APIs that don't offer webhooks, through the same API you use for native ones.",[2357,92066,92067,92070],{},[31,92068,92069],{},"Predictable API usage:"," Virtual webhooks check on the interval you set, so you control how often the source API is called. A check that finds nothing isn't billed.",[2357,92072,92073,92076],{},[31,92074,92075],{},"One unified schema:"," Whether the source sends its own webhooks or not, data arrives in the same format. No custom polling logic needed.",[2357,92078,92079,92082,92083,92086],{},[31,92080,92081],{},"Configurable change detection:"," Set the check interval (e.g., every minute, every 30 minutes, every hour; minimum 1 minute on paid plans, 60 minutes on the trial). ",[41,92084,123],{"href":121,"rel":92085},[45]," honours each integration's retry-after hints.",[2357,92088,92089,92092],{},[31,92090,92091],{},"Faster time-to-market:"," Virtual webhooks eliminate the need to build custom data collection.",[2357,92094,92095,92098],{},[31,92096,92097],{},"Historical data access:"," Receive existing records when you create a webhook subscription, paged until the initial sync completes.",[2357,92100,92101,92104],{},[31,92102,92103],{},"Built-in observability:"," Monitor webhook activity with logs (metadata only) and health status.",[2357,92106,92107,92110],{},[31,92108,92109],{},"Event-driven AI and automation:"," Trigger AI actions and automation as change events arrive.",[22,92112,92113,92114,92117],{},"Instead of dealing with a patchwork of webhook, polling, and batch sync solutions, ",[41,92115,123],{"href":121,"rel":92116},[45],"'s virtual webhooks give you one way to receive change events across the integrations that support them.",[55,92119,92034],{"id":92120},"how-virtual-webhooks-work",[22,92122,92123],{},"Webhooks deliver data updates to you, eliminating the need for polling. But most APIs don't support them, which forces developers to either:",[2510,92125,92126,92129],{},[2357,92127,92128],{},"Poll the API (which wastes API calls and delays updates), or",[2357,92130,92131],{},"Manually mix polling and webhooks (adding complexity and inconsistencies).",[22,92133,92134,92137],{},[41,92135,123],{"href":121,"rel":92136},[45],"'s virtual webhooks detect changes and deliver events, even when the source API doesn't offer webhooks:",[2354,92139,92140,92143,92146],{},[2357,92141,92142],{},"We monitor your customers' connections on a scheduled interval that you configure (e.g., as frequently as every minute on paid plans) and detect changes automatically",[2357,92144,92145],{},"We deliver events to your webhook URL in the same format as native webhooks",[2357,92147,92148],{},"You create and manage them with the same webhook API as native webhooks",[22,92150,92151],{},"No polling logic to write. Events on your interval, as often as every minute on paid plans.",[22,92153,92154],{},[41,92155,92157],{"href":5731,"rel":92156},[45],"Explore documentation",[55,92159,92161],{"id":92160},"how-virtual-webhooks-compare-to-traditional-webhooks-and-polling","How virtual webhooks compare to traditional webhooks and polling",[22,92163,92164],{},"Most third-party APIs don't offer native webhooks, forcing teams to choose between batch syncs, polling, or manual workarounds.",[155,92166,92167,92190],{},[158,92168,92169],{},[161,92170,92171,92175,92180,92185],{},[164,92172,92173],{},[31,92174,43763],{},[164,92176,92177],{},[31,92178,92179],{},"Unified's Virtual + Native Webhooks",[164,92181,92182],{},[31,92183,92184],{},"Native Webhooks",[164,92186,92187],{},[31,92188,92189],{},"Polling",[174,92191,92192,92206,92218,92230,92242,92255,92267,92278],{},[161,92193,92194,92197,92200,92203],{},[179,92195,92196],{},"Works even if API doesn't support webhooks",[179,92198,92199],{},"✅ Yes",[179,92201,92202],{},"❌ No",[179,92204,92205],{},"✅ Yes, but inefficient",[161,92207,92208,92211,92213,92215],{},[179,92209,92210],{},"Event updates on your interval (virtual) or as sent (native)",[179,92212,92199],{},[179,92214,92199],{},[179,92216,92217],{},"❌ No, delayed",[161,92219,92220,92223,92225,92227],{},[179,92221,92222],{},"API rate limit friendly",[179,92224,92199],{},[179,92226,92199],{},[179,92228,92229],{},"❌ No, high API usage",[161,92231,92232,92235,92237,92240],{},[179,92233,92234],{},"Historical data retrieval",[179,92236,92199],{},[179,92238,92239],{},"✅ With include_all, where initial sync is supported",[179,92241,92202],{},[161,92243,92244,92247,92250,92252],{},[179,92245,92246],{},"Fine-grained sync control",[179,92248,92249],{},"✅ Yes (set the check interval)",[179,92251,92202],{},[179,92253,92254],{},"✅ Yes, but manual",[161,92256,92257,92260,92262,92265],{},[179,92258,92259],{},"Built-in error handling & retries",[179,92261,92199],{},[179,92263,92264],{},"❌ Varies by API",[179,92266,92202],{},[161,92268,92269,92272,92274,92276],{},[179,92270,92271],{},"Webhook observability (logs, health monitoring)",[179,92273,92199],{},[179,92275,92264],{},[179,92277,92202],{},[161,92279,92280,92283,92285,92287],{},[179,92281,92282],{},"Virtual webhooks use the same subscription API and payload format as native webhooks, and work where APIs don't offer webhooks.",[179,92284],{},[179,92286],{},[179,92288],{},[55,92290,92292],{"id":92291},"product-use-cases","Product use cases",[22,92294,92295],{},"Let's look at how developers and product teams can use virtual webhooks.",[22,92297,92298],{},[31,92299,92300],{},"AI-powered customer support",[22,92302,92303],{},"Virtual webhooks can update AI models within your configured interval when new support tickets are created. Instead of writing polling logic against a help desk API, an AI assistant can respond to customer inquiries or escalate issues as events arrive.",[22,92305,92306],{},[41,92307,92310],{"href":92308,"rel":92309},"https:\u002F\u002Funified.to\u002Fticketing",[45],"Unified Ticketing API",[22,92312,92313],{},[41,92314,92317],{"href":92315,"rel":92316},"https:\u002F\u002Funified.to\u002Fblog\u002Fhow_to_build_a_discord_support_bot_with_unified_and_langbase",[45],"Build an AI Support Bot",[22,92319,92320],{},[31,92321,92322],{},"Automated financial reporting",[22,92324,92325],{},"Fintech and accounting applications rely on up-to-date financial data to generate reports, sync transactions, and reconcile accounts. However, many accounting platforms don't offer webhooks, meaning transaction updates often rely on batch syncs or polling.",[22,92327,92328],{},"With Unified.to's virtual webhooks, accounting software can:",[2354,92330,92331,92334],{},[2357,92332,92333],{},"Get notified within your configured interval when new transactions, invoices, or payments are recorded",[2357,92335,92336],{},"Trigger automatic reconciliation instead of waiting for scheduled syncs",[22,92338,92339],{},[41,92340,34003],{"href":34001,"rel":92341},[45],[22,92343,92344],{},[31,92345,92346],{},"Recruitment automation",[22,92348,92349],{},"Hiring teams often integrate with multiple ATS platforms, some of which don't offer webhooks. Virtual webhooks let AI-powered candidate screening start within your configured interval of a new application arriving.",[22,92351,92352],{},[41,92353,27792],{"href":4304,"rel":92354},[45],[22,92356,92357],{},[41,92358,92361],{"href":92359,"rel":92360},"https:\u002F\u002Funified.to\u002Fblog\u002Fhow_herohunt_saved_ten_months_of_engineering_time_with_unified",[45],"How HeroHunt added 20 integrations in 1 week",[55,92363,92365],{"id":92364},"how-much-polling-actually-costs","How much polling actually costs",[22,92367,92368],{},"Polling isn't just inefficient. It's expensive.",[22,92370,17183],{},[2354,92372,92373,92376,92379],{},[2357,92374,92375],{},"Polling every 5 minutes on 1000 accounts = 288,000 API requests per day",[2357,92377,92378],{},"Polling every 1 minute on 1000 accounts = 1.4 million API requests per day",[2357,92380,92381,92382,92385],{},"With virtual webhooks, you're billed only when a check finds changes, so a low-activity account costs little even on a one-minute interval. Checks still call the integration's API, and ",[41,92383,123],{"href":121,"rel":92384},[45]," honours the integration's retry-after hints.",[22,92387,92388],{},"Instead of writing and running your own polling, you pay per page of changes delivered.",[55,92390,92392],{"id":92391},"what-happens-if-you-dont-use-virtual-webhooks","What happens if you don't use virtual webhooks?",[2354,92394,92395,92398,92401],{},[2357,92396,92397],{},"You could hit API rate limits while continuously polling for updates",[2357,92399,92400],{},"You could rely on batch syncs, leading to outdated or incomplete data",[2357,92402,92403],{},"You could spend months building and maintaining custom webhook fallbacks for every integration",[22,92405,92406,92407,92410],{},"Or you could use ",[41,92408,123],{"href":121,"rel":92409},[45],"'s virtual webhooks, which detect changes on your interval and deliver change events across the integrations that support them.",[55,92412,92414],{"id":92413},"how-do-you-set-up-a-virtual-webhook","How do you set up a virtual webhook?",[2510,92416,92417,92438,92450,92460,92480],{},[2357,92418,92419,92422,92423,45999,92425,22578,92427,92429,92430,27087,92432,319,92434,741,92436,97],{},[31,92420,92421],{},"Start from a connection and object:"," Webhooks are created from an existing connection. In the app, go to ",[31,92424,4433],{},[31,92426,46006],{},[31,92428,46011],{}," and select the connection, or send a POST request to ",[36,92431,45846],{},[36,92433,85],{},[36,92435,17057],{},[36,92437,5060],{},[2357,92439,92440,92443,92444,92446,92447,92449],{},[31,92441,92442],{},"Choose the virtual type:"," Set ",[31,92445,9015],{}," to virtual where the integration supports it. Webhook support varies by integration and object, so check the integration's ",[31,92448,21863],{}," tab first. The type can't be changed after creation; delete and recreate the webhook to switch.",[2357,92451,92452,92455,92456,92459],{},[31,92453,92454],{},"Set the interval:"," Choose how often ",[41,92457,123],{"href":121,"rel":92458},[45]," checks the integration for changes. The minimum is 1 minute on paid plans and 60 minutes on the trial. The interval doesn't affect the initial sync.",[2357,92461,92462,92465,92466,92468,92469,92471,92472,92475,92476,92479],{},[31,92463,92464],{},"Optionally backfill history:"," Add the ",[36,92467,45870],{}," query parameter (or check ",[31,92470,46143],{}," in the app). Historical records arrive in pages marked ",[36,92473,92474],{},"INITIAL-PARTIAL",", followed by a final ",[36,92477,92478],{},"INITIAL-COMPLETE"," payload.",[2357,92481,92482,92443,92485,92487,92488,92490],{},[31,92483,92484],{},"Point it at your endpoint:",[36,92486,5053],{}," to your webhook URL, and verify incoming payloads with the ",[36,92489,45956],{}," signature.",[22,92492,92493,92494,97],{},"For every configuration option, including filters and fields, see ",[41,92495,5733],{"href":5731,"rel":92496},[45],[55,92498,92500],{"id":92499},"start-using-unifiedtos-virtual-webhooks","Start using Unified.to's virtual webhooks",[22,92502,92503],{},"Ready to stop polling and start receiving change events? Here's how to get started:",[2354,92505,92506,92513,92520,92527],{},[2357,92507,92508,92512],{},[41,92509,92511],{"href":21420,"rel":92510},[45],"Start a free trial"," to access virtual webhooks",[2357,92514,92515,92519],{},[41,92516,92518],{"href":4362,"rel":92517},[45],"Join our Discord"," to connect with our team and get support",[2357,92521,92522,92526],{},[41,92523,92525],{"href":5731,"rel":92524},[45],"Review our documentation"," for step-by-step guidance on setting up webhooks",[2357,92528,92529,92534],{},[41,92530,92533],{"href":92531,"rel":92532},"https:\u002F\u002Funified.to\u002Fchangelog",[45],"See our changelog"," for virtual webhook enhancements",{"title":2433,"searchDepth":2434,"depth":2434,"links":92536},[92537,92538,92539,92540,92541,92542,92543,92544],{"id":92046,"depth":2434,"text":92047},{"id":92120,"depth":2434,"text":92034},{"id":92160,"depth":2434,"text":92161},{"id":92291,"depth":2434,"text":92292},{"id":92364,"depth":2434,"text":92365},{"id":92391,"depth":2434,"text":92392},{"id":92413,"depth":2434,"text":92414},{"id":92499,"depth":2434,"text":92500},"Product teams building event-driven applications face a common challenge, most third-party APIs don't offer webhooks (In fact, our State of SaaS APIs report...",{"img":92547,"date":92548,"updated":92549,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Funlock_real_time_data_with_virtual_webhooks-icon.png","2025-02-13T00:00:00.000Z","2026-10-13T00:20:29.740Z","\u002Fguides\u002Funlock_real_time_data_with_virtual_webhooks",{"title":74630,"description":92545},"guides\u002Funlock_real_time_data_with_virtual_webhooks","ob0VF0EnRM5XcjtFPlC3ZUUqVX-VPcNBMAhIopL0bnI",{"id":92555,"title":92556,"body":92557,"description":92571,"extension":2452,"meta":92884,"navigation":2459,"path":92888,"seo":92889,"stem":92890,"__hash__":92891},"guides\u002Fguides\u002Fuse_unified_to_sign_in_your_users_into_your_application.md","Use Unified to sign in your users into your application",{"type":12,"value":92558,"toc":92879},[92559,92562,92564,92569,92572,92575,92579,92582,92587,92590,92595,92598,92606,92611,92614,92617,92621,92624,92627,92643,92698,92701,92708,92713,92718,92723,92728,92733,92736,92740,92743,92748,92751,92761,92771,92774,92828,92831,92873,92876],[15,92560,92556],{"id":92561},"use-unified-to-sign-in-your-users-into-your-application",[19,92563],{},[22,92565,92566],{},[25,92567,92568],{},"August 31, 2023",[22,92570,92571],{},"Before your users can utilize your application and any of Unified.to's integrations, they need to sign in to your application.",[22,92573,92574],{},"Luckily, we've simplified user authentication through our Unified Authentication API. Just follow these steps.",[55,92576,92578],{"id":92577},"_1-activate-authentication-integrations","1. Activate Authentication integrations",[22,92580,92581],{},"1.1 Click on the 'Integrations' menu, and then on the 'Authentication Integrations' option.",[22,92583,92584],{},[4201,92585],{"alt":20627,"src":92586},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fuse_unified_to_sign_in_your_users_into_your_application-0.png",[22,92588,92589],{},"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.",[22,92591,92592],{},[4201,92593],{"alt":20627,"src":92594},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fuse_unified_to_sign_in_your_users_into_your_application-1.png",[22,92596,92597],{},"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.",[22,92599,92600,92601,92605],{},"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 ",[41,92602,92604],{"href":27145,"rel":92603},[45],"Generating OAuth2 Credentials"," 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.",[22,92607,92608],{},[4201,92609],{"alt":20627,"src":92610},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fuse_unified_to_sign_in_your_users_into_your_application-2.png",[22,92612,92613],{},"1.5 Click on the 'Activate' button to enable this integration.",[22,92615,92616],{},"1.6 Repeat for all of the integrations that you want to use to authenticate your users.",[55,92618,92620],{"id":92619},"_2-display-sign-in-links-to-your-users","2. Display sign-in links to your users",[22,92622,92623],{},"Now that you have a list of Authentication connections, you can incorporate them into your application.",[22,92625,92626],{},"You have two options:",[2510,92628,92629,92636],{},[2357,92630,92631,92632,92635],{},"Remember the integration types (ie. google, discord, workday) and create links that point to our authentication API endpoint:\n",[36,92633,92634],{},"https\u002F\u002Fapi.unified.to\u002Funified\u002Fintegration\u002Flogin\u002F{workspace_id}\u002F{integration_type}?redirect=true",".  You can style that link however you like.",[2357,92637,92638,92639,92642],{},"Call the our API that returns a list of integrations; ",[36,92640,92641],{},"https\u002F\u002Fapi.unified.to\u002Funified\u002Fintegration\u002Fworkspace\u002F{workspace_id}?summary=true&active=true&categories=auth",". This will return all activated Authentication integrations and each will have information that you can use to style your Sign-in links;",[2584,92644,92646],{"className":7323,"code":92645,"language":7325,"meta":2433,"style":2433},"[\n    {\n        logo_url: \"https:\u002F\u002Flocalhost:8000\u002Fdocs\u002Fimages\u002Fgoogle.png\",\n        name: \"Google\",\n        type: \"google\"\n    }\n]\n",[36,92647,92648,92652,92656,92668,92680,92690,92694],{"__ignoreMap":2433},[414,92649,92650],{"class":2593,"line":2594},[414,92651,9310],{"class":2705},[414,92653,92654],{"class":2593,"line":2434},[414,92655,15559],{"class":2705},[414,92657,92658,92661,92663,92666],{"class":2593,"line":2613},[414,92659,92660],{"class":7401},"        logo_url",[414,92662,7340],{"class":2705},[414,92664,92665],{"class":2601},"\"https:\u002F\u002Flocalhost:8000\u002Fdocs\u002Fimages\u002Fgoogle.png\"",[414,92667,2757],{"class":2705},[414,92669,92670,92673,92675,92678],{"class":2593,"line":2625},[414,92671,92672],{"class":7401},"        name",[414,92674,7340],{"class":2705},[414,92676,92677],{"class":2601},"\"Google\"",[414,92679,2757],{"class":2705},[414,92681,92682,92685,92687],{"class":2593,"line":2677},[414,92683,92684],{"class":7401},"        type",[414,92686,7340],{"class":2705},[414,92688,92689],{"class":2601},"\"google\"\n",[414,92691,92692],{"class":2593,"line":2751},[414,92693,10535],{"class":2705},[414,92695,92696],{"class":2593,"line":2760},[414,92697,9376],{"class":2705},[22,92699,92700],{},"The Sign-in URL can have the following optional parameters:",[22,92702,92703,77938,92705,92707],{},[36,92704,67942],{},[36,92706,3891],{}," to redirect the user or if empty, will return the URL as string in its response",[22,92709,92710,92712],{},[36,92711,67973],{}," - the URL that the user will be redirected to once they have successfully authenticated with that integration vendor",[22,92714,92715,92717],{},[36,92716,67983],{}," - 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",[22,92719,92720,92722],{},[36,92721,22210],{}," - a string that will be sent back to the success_redirect. You can use this to remember a user ID or other identifier.",[2510,92724,92725],{},[2357,92726,92727],{},"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.",[22,92729,92730],{},[4201,92731],{"alt":20627,"src":92732},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fuse_unified_to_sign_in_your_users_into_your_application-3.png",[22,92734,92735],{},"Copy the CSS and code and insert it into your own application.",[55,92737,92739],{"id":92738},"step-3-verify-a-sign-in-attempt","Step 3: Verify a sign-in attempt",[22,92741,92742],{},"Once the user clicks on the authentication button\u002Flink, they will be redirect to the integration vendor's authentication page.",[22,92744,92745],{},[4201,92746],{"alt":20627,"src":92747},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fuse_unified_to_sign_in_your_users_into_your_application-4.png",[22,92749,92750],{},"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.",[22,92752,92753,92754,92756,92757,92760],{},"Once the user successfully signs-in, they are redirected back to your application (or to the location of the ",[36,92755,67973],{}," URL parameter from step 2). A ",[36,92758,92759],{},"jwt"," parameter will be appended to that URL.",[22,92762,8879,92763,92765,92766,92770],{},[36,92764,92759],{}," is a base64 encoded ",[41,92767,89036],{"href":92768,"rel":92769},"https:\u002F\u002Fjwt.io\u002F",[45],"  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).",[22,92772,92773],{},"Example code to verify a JWT on a NodeJS server:",[2584,92775,92777],{"className":16485,"code":92776,"language":16487,"meta":2433,"style":2433},"try {\n    let result = JWT.verify( req.payload.jwt, workspace.secret )\n} catch (err) {\n    console.error(err);\n}\n",[36,92778,92779,92786,92806,92815,92824],{"__ignoreMap":2433},[414,92780,92781,92784],{"class":2593,"line":2594},[414,92782,92783],{"class":2698},"try",[414,92785,2748],{"class":2705},[414,92787,92788,92790,92793,92795,92798,92800,92803],{"class":2593,"line":2434},[414,92789,24946],{"class":2698},[414,92791,92792],{"class":2705}," result ",[414,92794,2798],{"class":2698},[414,92796,92797],{"class":2607}," JWT",[414,92799,97],{"class":2705},[414,92801,92802],{"class":2597},"verify",[414,92804,92805],{"class":2705},"( req.payload.jwt, workspace.secret )\n",[414,92807,92808,92810,92812],{"class":2593,"line":2613},[414,92809,2795],{"class":2705},[414,92811,30955],{"class":2698},[414,92813,92814],{"class":2705}," (err) {\n",[414,92816,92817,92819,92821],{"class":2593,"line":2625},[414,92818,28184],{"class":2705},[414,92820,30966],{"class":2597},[414,92822,92823],{"class":2705},"(err);\n",[414,92825,92826],{"class":2593,"line":2677},[414,92827,3035],{"class":2705},[22,92829,92830],{},"The decoded JWT will contain a name and emails field:",[2584,92832,92834],{"className":7323,"code":92833,"language":7325,"meta":2433,"style":2433},"{\n    name: \"Jane Smith\",\n    emails: [\"jane@foo.com\", \"jsmith89@gmail.com\"]\n}\n",[36,92835,92836,92840,92852,92869],{"__ignoreMap":2433},[414,92837,92838],{"class":2593,"line":2594},[414,92839,8916],{"class":2705},[414,92841,92842,92845,92847,92850],{"class":2593,"line":2434},[414,92843,92844],{"class":7401},"    name",[414,92846,7340],{"class":2705},[414,92848,92849],{"class":2601},"\"Jane Smith\"",[414,92851,2757],{"class":2705},[414,92853,92854,92857,92859,92862,92864,92867],{"class":2593,"line":2613},[414,92855,92856],{"class":7401},"    emails",[414,92858,10492],{"class":2705},[414,92860,92861],{"class":2601},"\"jane@foo.com\"",[414,92863,319],{"class":2705},[414,92865,92866],{"class":2601},"\"jsmith89@gmail.com\"",[414,92868,9376],{"class":2705},[414,92870,92871],{"class":2593,"line":2625},[414,92872,3035],{"class":2705},[22,92874,92875],{},"Use the user's email to log them into your application as it is verified by the integration.",[4156,92877,92878],{},"html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sgQC_, html code.shiki .sgQC_{--shiki-default:#FDAEB7;--shiki-default-font-style:italic;--shiki-dark:#FDAEB7;--shiki-dark-font-style:italic;--shiki-light:#B31D28;--shiki-light-font-style:italic}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}",{"title":2433,"searchDepth":2434,"depth":2434,"links":92880},[92881,92882,92883],{"id":92577,"depth":2434,"text":92578},{"id":92619,"depth":2434,"text":92620},{"id":92738,"depth":2434,"text":92739},{"img":92885,"date":92886,"updated":92887,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fuse_unified_to_sign_in_your_users_into_your_application-icon.png","2023-08-31T00:00:00.000Z","2026-05-28T13:35:11.076Z","\u002Fguides\u002Fuse_unified_to_sign_in_your_users_into_your_application",{"title":92556,"description":92571},"guides\u002Fuse_unified_to_sign_in_your_users_into_your_application","zMegCipUALR2kOd_T7rd6RQNswFZyEp4mVz86ez60y8",{"id":92893,"title":92894,"body":92895,"description":93157,"extension":2452,"meta":93158,"navigation":2459,"path":93162,"seo":93163,"stem":93164,"__hash__":93165},"guides\u002Fguides\u002Fworkable_creating_candidates_and_attaching_them_to_jobs.md","Workable: Creating candidates and attaching them to jobs",{"type":12,"value":92896,"toc":93145},[92897,92900,92902,92907,92911,92921,92932,92936,92947,92955,92959,92972,92976,92983,92995,92998,93003,93007,93045,93049,93055,93064,93076,93080,93083,93087,93097,93101,93118,93122,93143],[15,92898,92894],{"id":92899},"workable-creating-candidates-and-attaching-them-to-jobs",[19,92901],{},[22,92903,92904],{},[25,92905,92906],{},"September 14, 2026",[55,92908,92910],{"id":92909},"how-do-candidates-and-applications-work-in-workable","How do candidates and applications work in Workable?",[22,92912,20403,92913,92916,92917,92920],{},[41,92914,123],{"href":121,"rel":92915},[45],"'s Workable integration, creating a candidate requires a job: Workable creates the candidate on that job. To add the same person to another job, create the candidate again with that job in ",[36,92918,92919],{},"job_ids",". Workable keeps a separate candidate record, with its own id, for each job.",[22,92922,92923,92924,92928,92929,97],{},"This guide explains the recommended flow and how to handle the ids you get back. To connect Workable first, see ",[41,92925,21374],{"href":92926,"rel":92927},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fgetting_started_with_workable",[45],"; for the objects and fields Workable supports, see the ",[41,92930,21873],{"href":21871,"rel":92931},[45],[55,92933,92935],{"id":92934},"create-a-candidate-on-a-job","Create a candidate on a job",[22,92937,92938,27087,92941,92943,92944,92946],{},[36,92939,92940],{},"POST \u002Fats\u002F{connection_id}\u002Fcandidate",[36,92942,92919],{}," set to the Workable job shortcode creates the candidate on that job. ",[36,92945,92919],{}," is required: a create without it returns an error and creates nothing.",[2354,92948,92949],{},[2357,92950,92951,92952,92954],{},"The response ",[36,92953,5072],{}," is that job's candidate id. Store it.",[55,92956,92958],{"id":92957},"add-the-person-to-another-job","Add the person to another job",[22,92960,92961,92963,92964,92966,92967,62107,92969,92971],{},[36,92962,92940],{}," again, with the same details and ",[36,92965,92919],{}," set to the other job's shortcode. The response ",[36,92968,5072],{},[31,92970,35115],{}," candidate id for that job. Store it alongside the first one.",[55,92973,92975],{"id":92974},"what-does-application-create-do-on-workable","What does application create do on Workable?",[22,92977,92978,92979,92982],{},"In Workable a candidate on a job is the application, so ",[36,92980,92981],{},"POST \u002Fats\u002F{connection_id}\u002Fapplication"," doesn't attach anyone to a job (as of 21 October 2026). Send:",[2354,92984,92985,92990],{},[2357,92986,92987,92989],{},[36,92988,27107],{},": a Workable candidate id",[2357,92991,92992,92994],{},[36,92993,24779],{},": the shortcode of the job that candidate is already on",[22,92996,92997],{},"It returns the application for that candidate and job, and can set its status (stage), screening answers or rejection in the same call. If the candidate isn't on that job, it returns HTTP 400 and changes nothing. It also returns HTTP 400 if the job is a draft, closed or archived.",[4937,92999,93000],{},[22,93001,93002],{},"⚠️ Application create no longer copies a candidate onto another job. To put someone on a second job, create the candidate on that job.",[55,93004,93006],{"id":93005},"example-sequence","Example sequence",[2510,93008,93009,93022,93034],{},[2357,93010,93011,93012,93015,93016,93018,93019,2980],{},"Create candidate with ",[36,93013,93014],{},"job_ids: [JOB1]"," → response id ",[36,93017,70261],{}," (on ",[36,93020,93021],{},"JOB1",[2357,93023,93024,93025,93015,93028,93018,93031,2980],{},"Create candidate with the same details and ",[36,93026,93027],{},"job_ids: [JOB2]",[36,93029,93030],{},"B",[36,93032,93033],{},"JOB2",[2357,93035,93036,93037,93039,93040,93042,93043],{},"Later get\u002Fupdate the candidate or application on ",[36,93038,93033],{}," → use ",[36,93041,93030],{},", not ",[36,93044,70261],{},[55,93046,93048],{"id":93047},"how-do-i-find-a-candidate-by-email","How do I find a candidate by email?",[22,93050,93051,93052,93054],{},"List candidates with the ",[36,93053,3819],{}," parameter set to the email address:",[2584,93056,93058],{"className":2649,"code":93057,"language":2651,"meta":2652,"style":2433},"GET \u002Fats\u002F{connection_id}\u002Fcandidate?query=person@example.com\n",[36,93059,93060],{"__ignoreMap":2433},[414,93061,93062],{"class":2593,"line":2594},[414,93063,93057],{},[22,93065,93066,93067,93069,93070,93072,93073,93075],{},"After you add a candidate to a second job, the same email may return ",[31,93068,75938],{}," candidates (",[36,93071,70261],{}," on the first job and ",[36,93074,93030],{}," on the second). They are different Workable records with different ids.",[55,93077,93079],{"id":93078},"do-updates-carry-over-between-the-two-copies","Do updates carry over between the two copies?",[22,93081,93082],{},"No. Changing profile details on the original candidate doesn't update the copy, and the reverse is also true. Treat each id as its own record.",[55,93084,93086],{"id":93085},"why-not-use-email-as-the-candidate-id","Why not use email as the candidate id?",[22,93088,93089,93090,93092,93093,93096],{},"Email identifies a person, but after you add them to a second job Workable has ",[31,93091,75938],{}," candidate records with the same email. ",[41,93094,123],{"href":121,"rel":93095},[45]," keeps Workable's native candidate ids so list, get, and application create stay unambiguous.",[55,93098,93100],{"id":93099},"which-events-tell-me-about-new-copies","Which events tell me about new copies?",[22,93102,93103,93104,93106,93107,93109,93110,93113,93114,93117],{},"On Workable, candidate created and updated events come from native or virtual webhooks, and application events from virtual webhooks (as of 20 October 2026). Workable's ",[36,93105,22088],{}," event feeds the native candidate created event, and only ",[36,93108,22096],{}," (a stage change) feeds native candidate updated. Workable has a ",[36,93111,93112],{},"candidate_deleted"," event, but ",[41,93115,123],{"href":121,"rel":93116},[45]," doesn't deliver deleted events for any Workable object (as of 21 October 2026), so a 404 on an old id is the signal to list again.",[55,93119,93121],{"id":93120},"requirements-and-tips","Requirements and tips",[2354,93123,93124,93134,93137],{},[2357,93125,93126,93127,93129,93130,93133],{},"Changing an application's stage, answers or rejection needs a Workable member id. Pass ",[36,93128,23402],{}," when you can; otherwise ",[41,93131,123],{"href":121,"rel":93132},[45]," tries to resolve an admin or a member of the job's team.",[2357,93135,93136],{},"Store each candidate id as soon as create succeeds, together with the job it belongs to.",[2357,93138,93139,93140,93142],{},"If an old candidate id returns 404, list with ",[36,93141,3819],{}," set to the email to recover the current ids on each job.",[4156,93144,5736],{},{"title":2433,"searchDepth":2434,"depth":2434,"links":93146},[93147,93148,93149,93150,93151,93152,93153,93154,93155,93156],{"id":92909,"depth":2434,"text":92910},{"id":92934,"depth":2434,"text":92935},{"id":92957,"depth":2434,"text":92958},{"id":92974,"depth":2434,"text":92975},{"id":93005,"depth":2434,"text":93006},{"id":93047,"depth":2434,"text":93048},{"id":93078,"depth":2434,"text":93079},{"id":93085,"depth":2434,"text":93086},{"id":93099,"depth":2434,"text":93100},{"id":93120,"depth":2434,"text":93121},"In Unified.to's Workable integration, creating a candidate requires a job, Workable creates the candidate on that job. To add the same person to another job,...",{"img":93159,"date":93160,"updated":93161,"tag":2457,"integrations":22365},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fworkable_creating_candidates_and_attaching_them_to_jobs-icon.png","2026-09-14T17:57:00.000Z","2026-10-21T14:17:14.572Z","\u002Fguides\u002Fworkable_creating_candidates_and_attaching_them_to_jobs",{"title":92894,"description":93157},"guides\u002Fworkable_creating_candidates_and_attaching_them_to_jobs","xlKyN72x2kQEUqb7TQeYeOsQpAu71uAydDqN8ohBwVg",{"id":93167,"title":93168,"body":93169,"description":93698,"extension":2452,"meta":93699,"navigation":2459,"path":93703,"seo":93704,"stem":93705,"__hash__":93706},"guides\u002Fguides\u002Fworkday_vs_workday_legacy_why_unified_supports_both.md","Workday vs Workday Legacy — Why Unified.to Supports Both",{"type":12,"value":93170,"toc":93693},[93171,93174,93176,93181,93187,93204,93213,93217,93220,93258,93273,93569,93573,93578,93584,93589,93595,93600,93605,93610,93625,93630,93639,93644,93649,93654,93663,93667,93675,93685,93690],[15,93172,93168],{"id":93173},"workday-vs-workday-legacy-why-unifiedto-supports-both",[19,93175],{},[22,93177,93178],{},[25,93179,93180],{},"July 22, 2025",[22,93182,93183,93184,2646],{},"Workday provides ",[31,93185,93186],{},"two main API integration formats",[2510,93188,93189,93195],{},[2357,93190,93191,93194],{},[31,93192,93193],{},"Workday REST API",": Workday's newer API, still adding endpoints.",[2357,93196,93197,93200,93201,93203],{},[31,93198,93199],{},"Workday SOAP API"," (Workday Web Services, often called ",[25,93202,20485],{},"): the older API, which still covers objects and actions REST doesn't yet.",[22,93205,93206,93209,93210,93212],{},[41,93207,123],{"href":121,"rel":93208},[45]," supports ",[31,93211,76747],{},", as two integrations, Workday and Workday (Legacy), so you can use whichever covers the objects you need.",[55,93214,93216],{"id":93215},"why-you-might-need-both","Why You Might Need Both",[22,93218,93219],{},"While Workday is steadily improving their REST API, there are still important gaps. Here's why using both makes sense today:",[2510,93221,93222,93228,93234,93240,93246,93252],{},[2357,93223,93224,93227],{},[31,93225,93226],{},"Application create \u002F list",": Workday's REST API does not support job applications. List, get, create, and update are only available through the Legacy SOAP integration.",[2357,93229,93230,93233],{},[31,93231,93232],{},"Candidate lists & updates",": REST supports get and create for candidates (prospects), but listing and updating candidates still require Legacy.",[2357,93235,93236,93239],{},[31,93237,93238],{},"Create \u002F update job",": Creating and updating jobs still relies on the Legacy integration. REST supports list and get for job postings.",[2357,93241,93242,93245],{},[31,93243,93244],{},"ATS activity & application statuses",": available on Legacy only today.",[2357,93247,93248,93251],{},[31,93249,93250],{},"Broader HRIS \u002F payroll \u002F payments coverage on Legacy",": objects like HR benefit, deduction, bank account, location, payslip, taxonomy, job (positions), and Payment are Legacy-only. REST uniquely covers LMS content, accounting purchase orders, and HR earnings (with create\u002Fupdate\u002Fremove).",[2357,93253,93254,93257],{},[31,93255,93256],{},"Coverage changes",": Workday keeps adding REST endpoints, so check each integration's Feature Support tab for current coverage.",[22,93259,93260,93261,93264,93265,93268,93269,93272],{},"The support matrix below shows ",[41,93262,123],{"href":121,"rel":93263},[45],"'s coverage for ",[31,93266,93267],{},"Workday"," (REST) and ",[31,93270,93271],{},"Workday (Legacy)"," (SOAP), from the integration pages in the docs as of 19 October 2026.",[155,93274,93275,93287],{},[158,93276,93277],{},[161,93278,93279,93281,93284],{},[164,93280],{},[164,93282,93283],{},"Workday (REST)",[164,93285,93286],{},"Workday Legacy (SOAP)",[174,93288,93289,93299,93308,93317,93327,93336,93345,93354,93363,93372,93381,93390,93399,93408,93417,93426,93435,93444,93453,93462,93471,93480,93489,93498,93507,93516,93525,93534,93543,93552,93561],{},[161,93290,93291,93294,93296],{},[179,93292,93293],{},"ATS Activity",[179,93295],{},[179,93297,93298],{},"List, Get, Create",[161,93300,93301,93304,93306],{},[179,93302,93303],{},"ATS Application",[179,93305],{},[179,93307,75308],{},[161,93309,93310,93313,93315],{},[179,93311,93312],{},"ATS Application Status",[179,93314],{},[179,93316,22007],{},[161,93318,93319,93322,93325],{},[179,93320,93321],{},"ATS Candidate",[179,93323,93324],{},"Get, Create",[179,93326,75308],{},[161,93328,93329,93332,93334],{},[179,93330,93331],{},"ATS Company",[179,93333,21919],{},[179,93335,21919],{},[161,93337,93338,93341,93343],{},[179,93339,93340],{},"ATS Document",[179,93342,93298],{},[179,93344,93298],{},[161,93346,93347,93350,93352],{},[179,93348,93349],{},"ATS Interview",[179,93351,21919],{},[179,93353,75308],{},[161,93355,93356,93359,93361],{},[179,93357,93358],{},"ATS Job",[179,93360,21919],{},[179,93362,75308],{},[161,93364,93365,93368,93370],{},[179,93366,93367],{},"ATS Scorecard",[179,93369,93298],{},[179,93371,75308],{},[161,93373,93374,93377,93379],{},[179,93375,93376],{},"HR Attendance",[179,93378,21919],{},[179,93380,21919],{},[161,93382,93383,93386,93388],{},[179,93384,93385],{},"HR Bank Account",[179,93387],{},[179,93389,22007],{},[161,93391,93392,93395,93397],{},[179,93393,93394],{},"HR Benefit",[179,93396],{},[179,93398,21919],{},[161,93400,93401,93404,93406],{},[179,93402,93403],{},"HR Company",[179,93405,21919],{},[179,93407,21919],{},[161,93409,93410,93413,93415],{},[179,93411,93412],{},"HR Deduction",[179,93414],{},[179,93416,75308],{},[161,93418,93419,93422,93424],{},[179,93420,93421],{},"HR Document",[179,93423,21919],{},[179,93425,21919],{},[161,93427,93428,93431,93433],{},[179,93429,93430],{},"HR Earning",[179,93432,75294],{},[179,93434],{},[161,93436,93437,93440,93442],{},[179,93438,93439],{},"HR Employee",[179,93441,21919],{},[179,93443,93298],{},[161,93445,93446,93449,93451],{},[179,93447,93448],{},"HR Group",[179,93450,21919],{},[179,93452,75308],{},[161,93454,93455,93458,93460],{},[179,93456,93457],{},"HR Job",[179,93459],{},[179,93461,21919],{},[161,93463,93464,93467,93469],{},[179,93465,93466],{},"HR Location",[179,93468],{},[179,93470,75308],{},[161,93472,93473,93476,93478],{},[179,93474,93475],{},"HR Payslip",[179,93477],{},[179,93479,22007],{},[161,93481,93482,93485,93487],{},[179,93483,93484],{},"HR Taxonomy",[179,93486],{},[179,93488,22007],{},[161,93490,93491,93494,93496],{},[179,93492,93493],{},"HR Timeoff",[179,93495,75294],{},[179,93497,75308],{},[161,93499,93500,93503,93505],{},[179,93501,93502],{},"HR Timeshift",[179,93504,75294],{},[179,93506,21919],{},[161,93508,93509,93512,93514],{},[179,93510,93511],{},"LMS Content",[179,93513,21919],{},[179,93515],{},[161,93517,93518,93521,93523],{},[179,93519,93520],{},"Accounting Bill",[179,93522,21919],{},[179,93524,75335],{},[161,93526,93527,93530,93532],{},[179,93528,93529],{},"Accounting Contact",[179,93531,21919],{},[179,93533,75308],{},[161,93535,93536,93539,93541],{},[179,93537,93538],{},"Accounting Invoice",[179,93540,21919],{},[179,93542,75335],{},[161,93544,93545,93548,93550],{},[179,93546,93547],{},"Accounting Payment Term",[179,93549],{},[179,93551,93298],{},[161,93553,93554,93557,93559],{},[179,93555,93556],{},"Accounting Purchase Order",[179,93558,21919],{},[179,93560],{},[161,93562,93563,93565,93567],{},[179,93564,33973],{},[179,93566],{},[179,93568,75335],{},[55,93570,93572],{"id":93571},"frequently-asked-questions-answers","Frequently Asked Questions & Answers",[22,93574,93575],{},[31,93576,93577],{},"Question: Do I have to send XML requests for Workday Legacy?",[22,93579,93580,93583],{},[31,93581,93582],{},"Answer:"," No! You always send JSON requests to Unified.to. We handle the conversion to XML behind the scenes for the SOAP API.",[22,93585,93586],{},[31,93587,93588],{},"Question: Can I use both the REST and Legacy APIs at the same time?",[22,93590,93591,93594],{},[31,93592,93593],{},"A****nswer:"," Yes. Each is its own connection, so you can, for example, read documents through Workday (REST) and create applications through Workday (Legacy), both returning the same unified models.",[22,93596,93597],{},[31,93598,93599],{},"Question: Is the Workday (Legacy) integration going to be deprecated?",[22,93601,93602,93604],{},[31,93603,93582],{}," The docs show no deprecation for Workday (Legacy) as of 19 October 2026, and it still covers objects the REST integration doesn't, such as applications, deductions and payslips.",[22,93606,93607],{},[31,93608,93609],{},"Question: Is authentication different for Legacy vs REST?",[22,93611,93612,93614,93615,93620,93621,93624],{},[31,93613,93582],{}," Yes. Workday (REST) uses OAuth 2.0 with a client ID, client secret and refresh token. Workday (Legacy) uses an Integration System User (ISU): the ",[41,93616,93619],{"href":93617,"rel":93618},"https:\u002F\u002Fdocs.unified.to\u002Fintegrations\u002Fworkday_legacy",[45],"integration page"," asks for the Workday host, tenant name, ISU username and ISU password, and the SOAP API receives them as a WS-Security UsernameToken inside the SOAP envelope rather than in an HTTP Authorization header. ",[41,93622,123],{"href":121,"rel":93623},[45]," handles both.",[22,93626,93627],{},[31,93628,93629],{},"Question: Are the data models the same between REST and Legacy?",[22,93631,93632,93634,93635,93638],{},[31,93633,93582],{}," Yes. ",[41,93636,123],{"href":121,"rel":93637},[45]," maps both onto the same unified models, so an employee or a job has the same fields whichever Workday API is behind it. Which objects and methods each integration supports differs, as the table shows.",[22,93640,93641],{},[31,93642,93643],{},"Question: Can I switch from Legacy to REST later?",[22,93645,93646,93648],{},[31,93647,93582],{}," Yes, object by object, as REST coverage grows. Because both integrations return the same unified models, your code for an object stays the same; what changes is which connection you call, and each connection needs its own authorization.",[22,93650,93651],{},[31,93652,93653],{},"Question: Will using both cost more?",[22,93655,93656,93658,93659,93662],{},[31,93657,93582],{}," No. ",[41,93660,123],{"href":121,"rel":93661},[45]," prices by API call with unlimited connections, so a second Workday connection adds no fee of its own.",[55,93664,93666],{"id":93665},"which-workday-integration-should-you-use","Which Workday integration should you use?",[22,93668,93669,93670,93209,93673,97],{},"Workday is moving more features to its REST API, but some objects and actions are still available only through the SOAP-based Legacy API, so ",[41,93671,123],{"href":121,"rel":93672},[45],[31,93674,76747],{},[22,93676,93677,93680,93681,93684],{},[31,93678,93679],{},"Our recommendation:"," Use the Workday (REST) integration wherever it covers your workflow (including time off writes, earnings, LMS, and purchase orders), and use Workday (Legacy) for gaps such as applications, candidate list\u002Fupdate, job create\u002Fupdate, broader HRIS\u002Fpayroll objects, and payments. ",[41,93682,123],{"href":121,"rel":93683},[45]," handles each API's authorization and format, including converting your JSON requests to SOAP for Legacy.",[22,93686,93687],{},[31,93688,93689],{},"Have more questions?",[22,93691,93692],{},"Reach out to our support team for help choosing between the two Workday integrations.",{"title":2433,"searchDepth":2434,"depth":2434,"links":93694},[93695,93696,93697],{"id":93215,"depth":2434,"text":93216},{"id":93571,"depth":2434,"text":93572},{"id":93665,"depth":2434,"text":93666},"Workday provides two main API integration formats,",{"img":93700,"date":93701,"updated":93702,"tag":2457,"integrations":58197},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fworkday_vs_workday_legacy_why_unified_supports_both-icon.png","2025-07-22T00:00:00.000Z","2026-10-20T00:23:21.999Z","\u002Fguides\u002Fworkday_vs_workday_legacy_why_unified_supports_both",{"title":93168,"description":93698},"guides\u002Fworkday_vs_workday_legacy_why_unified_supports_both","kMWf_iWePfc9dQVI6878qWXESjaEiVNkWXpnNRuTSsI",{"id":93708,"title":93709,"body":93710,"description":93724,"extension":2452,"meta":94552,"navigation":2459,"path":94556,"seo":94557,"stem":94558,"__hash__":94559},"guides\u002Fguides\u002Fworking_with_hierarchical_tree_data_in_storage_messaging_and_kms_apis.md","Working with hierarchical tree data in Storage, Messaging, and KMS APIs",{"type":12,"value":93711,"toc":94539},[93712,93715,93717,93722,93725,93727,93730,93756,93759,93761,93763,93773,93777,93783,93813,93817,93820,93846,94003,94010,94014,94017,94223,94237,94239,94242,94255,94450,94464,94468,94472,94475,94495,94498,94509,94514,94525,94527,94536],[15,93713,93709],{"id":93714},"working-with-hierarchical-tree-data-in-storage-messaging-and-kms-apis",[19,93716],{},[22,93718,93719],{},[25,93720,93721],{},"November 7, 2024",[22,93723,93724],{},"This guide explains how to retrieve and traverse hierarchical data structures (i.e., trees) when working with APIs that support parent-child relationships.",[55,93726,4426],{"id":4425},[22,93728,93729],{},"Many APIs organize their data in tree-like structures, where records can have parent-child relationships with each other.",[2510,93731,93732,93737,93745],{},[2357,93733,8879,93734,93736],{},[31,93735,85381],{}," 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.",[2357,93738,8879,93739,741,93741,93744],{},[31,93740,85412],{},[31,93742,93743],{},"Tasks API"," 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.",[2357,93746,8879,93747,93749,93750,93752,93753,93755],{},[31,93748,27942],{}," has spaces and pages. Pages nest under pages through ",[36,93751,54970],{}," on supported integrations (Atlassian Confluence, Notion, ClickUp, Coda, Gladly). The space model also has ",[36,93754,77916],{}," for knowledge bases that nest spaces under pages, but no integration returns it as of 19 October 2026.",[22,93757,93758],{},"This guide will show you how to efficiently traverse these hierarchical structures to retrieve all the data you need.",[55,93760,4890],{"id":4889},[22,93762,24095],{},[2354,93764,93765],{},[2357,93766,93767,93768],{},"Basic understanding of ",[41,93769,93772],{"href":93770,"rel":93771},"https:\u002F\u002Fen.wikipedia.org\u002Fwiki\u002FTree_(abstract_data_type)",[45],"tree data structures",[55,93774,93776],{"id":93775},"understanding-parent-child-relationships","Understanding parent-child relationships",[22,93778,93779,93780,93782],{},"When an API endpoint supports a ",[36,93781,54970],{}," parameter, it typically indicates that the data is organized in a hierarchical structure. To fully traverse this structure, you'll need to:",[2510,93784,93785,93788,93791,93794],{},[2357,93786,93787],{},"Get the top-level entities (parent nodes)",[2357,93789,93790],{},"For each parent, retrieve its children by passing the parent's ID",[2357,93792,93793],{},"Recursively repeat this process for any children that can also be parents",[2357,93795,93796,93797,93800,93801,93803,93804,93806,93807,93810,93811,97],{},"For KMS Page, you can use its ",[36,93798,93799],{},"has_children"," field to determine if there are children pages to query. If ",[36,93802,93799],{}," is equal ",[36,93805,10771],{}," , then no children pages exist.  Most integrations don't return it (it's on Confluence, Notion, ClickUp, Coda and Gladly as of 19 October 2026), so if the field is ",[36,93808,93809],{},"undefined"," or missing, treat it as ",[36,93812,3891],{},[3629,93814,93816],{"id":93815},"example-messaging-platforms","Example: Messaging platforms",[22,93818,93819],{},"Let's look at how this works with Discord:",[2510,93821,93822,93825,93828,93833],{},[2357,93823,93824],{},"Discord servers (also called \"guilds\") are top-level parents",[2357,93826,93827],{},"Channels exist within servers as children",[2357,93829,93830,93831],{},"Messages are also related to channels through their ",[36,93832,54970],{},[2357,93834,93835,93836],{},"To get all channels:\n",[2354,93837,93838,93841],{},[2357,93839,93840],{},"First retrieve all guilds (servers)",[2357,93842,93843,93844],{},"Then get channels for each guild by passing the guild's ID as ",[36,93845,54970],{},[2584,93847,93849],{"className":16485,"code":93848,"language":16487,"meta":2433,"style":2433},"async function getAllChannels(connectionId) {\n    \u002F\u002F Get all top-level guilds first\n    const guilds = await sdk.messaging.listMessagingChannels({\n        connectionId,\n    });\n\n    let allChannels = [];\n\n    \u002F\u002F 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",[36,93850,93851,93866,93871,93890,93894,93898,93902,93913,93917,93922,93938,93955,93959,93964,93968,93984,93988,93992,93999],{"__ignoreMap":2433},[414,93852,93853,93855,93857,93860,93862,93864],{"class":2593,"line":2594},[414,93854,3928],{"class":2698},[414,93856,2962],{"class":2698},[414,93858,93859],{"class":2597}," getAllChannels",[414,93861,2968],{"class":2705},[414,93863,2972],{"class":2971},[414,93865,3826],{"class":2705},[414,93867,93868],{"class":2593,"line":2434},[414,93869,93870],{"class":3527},"    \u002F\u002F Get all top-level guilds first\n",[414,93872,93873,93875,93878,93880,93882,93885,93888],{"class":2593,"line":2613},[414,93874,3986],{"class":2698},[414,93876,93877],{"class":2607}," guilds",[414,93879,2817],{"class":2698},[414,93881,3002],{"class":2698},[414,93883,93884],{"class":2705}," sdk.messaging.",[414,93886,93887],{"class":2597},"listMessagingChannels",[414,93889,2826],{"class":2705},[414,93891,93892],{"class":2593,"line":2625},[414,93893,26325],{"class":2705},[414,93895,93896],{"class":2593,"line":2677},[414,93897,25779],{"class":2705},[414,93899,93900],{"class":2593,"line":2751},[414,93901,2740],{"emptyLinePlaceholder":2459},[414,93903,93904,93906,93909,93911],{"class":2593,"line":2760},[414,93905,24946],{"class":2698},[414,93907,93908],{"class":2705}," allChannels ",[414,93910,2798],{"class":2698},[414,93912,24927],{"class":2705},[414,93914,93915],{"class":2593,"line":2768},[414,93916,2740],{"emptyLinePlaceholder":2459},[414,93918,93919],{"class":2593,"line":2776},[414,93920,93921],{"class":3527},"    \u002F\u002F For each guild, get its channels\n",[414,93923,93924,93926,93928,93930,93933,93935],{"class":2593,"line":2784},[414,93925,31134],{"class":2698},[414,93927,3970],{"class":2705},[414,93929,2745],{"class":2698},[414,93931,93932],{"class":2607}," guild",[414,93934,3978],{"class":2698},[414,93936,93937],{"class":2705}," guilds.data) {\n",[414,93939,93940,93942,93945,93947,93949,93951,93953],{"class":2593,"line":2792},[414,93941,24981],{"class":2698},[414,93943,93944],{"class":2607}," channels",[414,93946,2817],{"class":2698},[414,93948,3002],{"class":2698},[414,93950,93884],{"class":2705},[414,93952,93887],{"class":2597},[414,93954,2826],{"class":2705},[414,93956,93957],{"class":2593,"line":2804},[414,93958,25023],{"class":2705},[414,93960,93961],{"class":2593,"line":2809},[414,93962,93963],{"class":2705},"            parentChannelId: guild.id,\n",[414,93965,93966],{"class":2593,"line":2829},[414,93967,25028],{"class":2705},[414,93969,93970,93973,93975,93978,93981],{"class":2593,"line":2843},[414,93971,93972],{"class":2705},"        allChannels ",[414,93974,2798],{"class":2698},[414,93976,93977],{"class":2705}," allChannels.",[414,93979,93980],{"class":2597},"concat",[414,93982,93983],{"class":2705},"(channels.data);\n",[414,93985,93986],{"class":2593,"line":2849},[414,93987,10535],{"class":2705},[414,93989,93990],{"class":2593,"line":2854},[414,93991,2740],{"emptyLinePlaceholder":2459},[414,93993,93994,93996],{"class":2593,"line":2880},[414,93995,25149],{"class":2698},[414,93997,93998],{"class":2705}," allChannels;\n",[414,94000,94001],{"class":2593,"line":3253},[414,94002,3035],{"class":2705},[22,94004,94005,34,94007],{},[31,94006,28958],{},[41,94008,85412],{"href":30483,"rel":94009},[45],[3629,94011,94013],{"id":94012},"example-file-storage-systems","Example: File storage systems",[22,94015,94016],{},"File storage systems are another common example of hierarchical data. Here's how to recursively traverse a file system to get all files:",[2584,94018,94020],{"className":16485,"code":94019,"language":16487,"meta":2433,"style":2433},"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            \u002F\u002F 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",[36,94021,94022,94042,94058,94062,94067,94071,94075,94086,94092,94096,94100,94111,94115,94131,94145,94150,94167,94182,94190,94200,94204,94208,94212,94219],{"__ignoreMap":2433},[414,94023,94024,94026,94028,94031,94033,94035,94037,94040],{"class":2593,"line":2594},[414,94025,3928],{"class":2698},[414,94027,2962],{"class":2698},[414,94029,94030],{"class":2597}," getAllFiles",[414,94032,2968],{"class":2705},[414,94034,2972],{"class":2971},[414,94036,319],{"class":2705},[414,94038,94039],{"class":2971},"parentId",[414,94041,3826],{"class":2705},[414,94043,94044,94046,94048,94050,94052,94054,94056],{"class":2593,"line":2434},[414,94045,3986],{"class":2698},[414,94047,28445],{"class":2607},[414,94049,2817],{"class":2698},[414,94051,3002],{"class":2698},[414,94053,34417],{"class":2705},[414,94055,34420],{"class":2597},[414,94057,2826],{"class":2705},[414,94059,94060],{"class":2593,"line":2613},[414,94061,26325],{"class":2705},[414,94063,94064],{"class":2593,"line":2625},[414,94065,94066],{"class":2705},"        parentId,\n",[414,94068,94069],{"class":2593,"line":2677},[414,94070,25779],{"class":2705},[414,94072,94073],{"class":2593,"line":2751},[414,94074,2740],{"emptyLinePlaceholder":2459},[414,94076,94077,94079,94081,94083],{"class":2593,"line":2760},[414,94078,25828],{"class":2698},[414,94080,3970],{"class":2705},[414,94082,2837],{"class":2698},[414,94084,94085],{"class":2705},"response.data) {\n",[414,94087,94088,94090],{"class":2593,"line":2768},[414,94089,25844],{"class":2698},[414,94091,24927],{"class":2705},[414,94093,94094],{"class":2593,"line":2776},[414,94095,10535],{"class":2705},[414,94097,94098],{"class":2593,"line":2784},[414,94099,2740],{"emptyLinePlaceholder":2459},[414,94101,94102,94104,94107,94109],{"class":2593,"line":2792},[414,94103,24946],{"class":2698},[414,94105,94106],{"class":2705}," allFiles ",[414,94108,2798],{"class":2698},[414,94110,24927],{"class":2705},[414,94112,94113],{"class":2593,"line":2804},[414,94114,2740],{"emptyLinePlaceholder":2459},[414,94116,94117,94119,94121,94123,94126,94128],{"class":2593,"line":2809},[414,94118,31134],{"class":2698},[414,94120,3970],{"class":2705},[414,94122,2745],{"class":2698},[414,94124,94125],{"class":2607}," item",[414,94127,3978],{"class":2698},[414,94129,94130],{"class":2705}," response.data) {\n",[414,94132,94133,94135,94138,94140,94143],{"class":2593,"line":2829},[414,94134,25092],{"class":2698},[414,94136,94137],{"class":2705}," (item.type ",[414,94139,25066],{"class":2698},[414,94141,94142],{"class":2601}," 'FOLDER'",[414,94144,3826],{"class":2705},[414,94146,94147],{"class":2593,"line":2843},[414,94148,94149],{"class":3527},"            \u002F\u002F Recursively get files from subfolders\n",[414,94151,94152,94155,94158,94160,94162,94164],{"class":2593,"line":2849},[414,94153,94154],{"class":2698},"            const",[414,94156,94157],{"class":2607}," subfolderFiles",[414,94159,2817],{"class":2698},[414,94161,3002],{"class":2698},[414,94163,94030],{"class":2597},[414,94165,94166],{"class":2705},"(connectionId, item.id);\n",[414,94168,94169,94172,94174,94177,94179],{"class":2593,"line":2854},[414,94170,94171],{"class":2705},"            allFiles ",[414,94173,2798],{"class":2698},[414,94175,94176],{"class":2705}," allFiles.",[414,94178,93980],{"class":2597},[414,94180,94181],{"class":2705},"(subfolderFiles);\n",[414,94183,94184,94186,94188],{"class":2593,"line":2880},[414,94185,25120],{"class":2705},[414,94187,25123],{"class":2698},[414,94189,2748],{"class":2705},[414,94191,94192,94195,94197],{"class":2593,"line":3253},[414,94193,94194],{"class":2705},"            allFiles.",[414,94196,25040],{"class":2597},[414,94198,94199],{"class":2705},"(item);\n",[414,94201,94202],{"class":2593,"line":3261},[414,94203,10641],{"class":2705},[414,94205,94206],{"class":2593,"line":3279},[414,94207,10535],{"class":2705},[414,94209,94210],{"class":2593,"line":3313},[414,94211,2740],{"emptyLinePlaceholder":2459},[414,94213,94214,94216],{"class":2593,"line":3326},[414,94215,25149],{"class":2698},[414,94217,94218],{"class":2705}," allFiles;\n",[414,94220,94221],{"class":2593,"line":3339},[414,94222,3035],{"class":2705},[22,94224,94225,34,94227,94230,94233],{},[31,94226,28958],{},[41,94228,4680],{"href":85379,"rel":94229},[45],[41,94231,34],{"href":85379,"rel":94232},[45],[41,94234,94236],{"href":85379,"rel":94235},[45],"Storage API",[55,94238,16609],{"id":16608},[22,94240,94241],{},"When working with hierarchical data:",[2510,94243,94244],{},[2357,94245,94246,94249,94250,741,94252,94254],{},[31,94247,94248],{},"Implement pagination",": Some nodes might have many children. Use the ",[36,94251,9263],{},[36,94253,9275],{}," parameters to handle large datasets.",[2584,94256,94258],{"className":16485,"code":94257,"language":16487,"meta":2433,"style":2433},"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",[36,94259,94260,94284,94294,94306,94318,94322,94332,94348,94352,94357,94361,94365,94369,94373,94397,94403,94407,94411,94423,94432,94436,94440,94446],{"__ignoreMap":2433},[414,94261,94262,94264,94266,94269,94271,94273,94275,94277,94279,94282],{"class":2593,"line":2594},[414,94263,3928],{"class":2698},[414,94265,2962],{"class":2698},[414,94267,94268],{"class":2597}," getAllChannelsWithPagination",[414,94270,2968],{"class":2705},[414,94272,2972],{"class":2971},[414,94274,319],{"class":2705},[414,94276,94039],{"class":2971},[414,94278,2817],{"class":2698},[414,94280,94281],{"class":2607}," undefined",[414,94283,3826],{"class":2705},[414,94285,94286,94288,94290,94292],{"class":2593,"line":2434},[414,94287,24946],{"class":2698},[414,94289,93908],{"class":2705},[414,94291,2798],{"class":2698},[414,94293,24927],{"class":2705},[414,94295,94296,94298,94300,94302,94304],{"class":2593,"line":2613},[414,94297,24946],{"class":2698},[414,94299,24949],{"class":2705},[414,94301,2798],{"class":2698},[414,94303,24954],{"class":2607},[414,94305,2706],{"class":2705},[414,94307,94308,94310,94312,94314,94316],{"class":2593,"line":2625},[414,94309,3986],{"class":2698},[414,94311,24934],{"class":2607},[414,94313,2817],{"class":2698},[414,94315,24939],{"class":2607},[414,94317,2706],{"class":2705},[414,94319,94320],{"class":2593,"line":2677},[414,94321,2740],{"emptyLinePlaceholder":2459},[414,94323,94324,94326,94328,94330],{"class":2593,"line":2751},[414,94325,24965],{"class":2698},[414,94327,3970],{"class":2705},[414,94329,3891],{"class":2607},[414,94331,3826],{"class":2705},[414,94333,94334,94336,94338,94340,94342,94344,94346],{"class":2593,"line":2760},[414,94335,24981],{"class":2698},[414,94337,28445],{"class":2607},[414,94339,2817],{"class":2698},[414,94341,3002],{"class":2698},[414,94343,93884],{"class":2705},[414,94345,93887],{"class":2597},[414,94347,2826],{"class":2705},[414,94349,94350],{"class":2593,"line":2768},[414,94351,25023],{"class":2705},[414,94353,94354],{"class":2593,"line":2776},[414,94355,94356],{"class":2705},"            parentChannelId: parentId,\n",[414,94358,94359],{"class":2593,"line":2784},[414,94360,25018],{"class":2705},[414,94362,94363],{"class":2593,"line":2792},[414,94364,25013],{"class":2705},[414,94366,94367],{"class":2593,"line":2804},[414,94368,25028],{"class":2705},[414,94370,94371],{"class":2593,"line":2809},[414,94372,2740],{"emptyLinePlaceholder":2459},[414,94374,94375,94377,94379,94381,94384,94386,94389,94391,94393,94395],{"class":2593,"line":2829},[414,94376,25092],{"class":2698},[414,94378,3970],{"class":2705},[414,94380,2837],{"class":2698},[414,94382,94383],{"class":2705},"response.data ",[414,94385,32868],{"class":2698},[414,94387,94388],{"class":2705}," response.data.",[414,94390,25098],{"class":2607},[414,94392,25101],{"class":2698},[414,94394,24954],{"class":2607},[414,94396,3826],{"class":2705},[414,94398,94399,94401],{"class":2593,"line":2843},[414,94400,25130],{"class":2698},[414,94402,2706],{"class":2705},[414,94404,94405],{"class":2593,"line":2849},[414,94406,10641],{"class":2705},[414,94408,94409],{"class":2593,"line":2854},[414,94410,2740],{"emptyLinePlaceholder":2459},[414,94412,94413,94415,94417,94419,94421],{"class":2593,"line":2880},[414,94414,93972],{"class":2705},[414,94416,2798],{"class":2698},[414,94418,93977],{"class":2705},[414,94420,93980],{"class":2597},[414,94422,69798],{"class":2705},[414,94424,94425,94428,94430],{"class":2593,"line":3253},[414,94426,94427],{"class":2705},"        offset ",[414,94429,25112],{"class":2698},[414,94431,25115],{"class":2705},[414,94433,94434],{"class":2593,"line":3261},[414,94435,10535],{"class":2705},[414,94437,94438],{"class":2593,"line":3279},[414,94439,2740],{"emptyLinePlaceholder":2459},[414,94441,94442,94444],{"class":2593,"line":3313},[414,94443,25149],{"class":2698},[414,94445,93998],{"class":2705},[414,94447,94448],{"class":2593,"line":3326},[414,94449,3035],{"class":2705},[2510,94451,94452,94458],{},[2357,94453,94454,94457],{},[31,94455,94456],{},"Handle rate limits",": When recursively fetching data, you might hit API rate limits. Implement backoff strategies and respect the provider's limits.",[2357,94459,94460,94463],{},[31,94461,94462],{},"Cache parent IDs",": If you need to traverse the same structure multiple times, consider caching the parent-child relationships to reduce API calls.",[55,94465,94467],{"id":94466},"integration-specific-gotchas","Integration-specific gotchas",[3629,94469,94471],{"id":94470},"working-with-sharepoint","Working with SharePoint",[22,94473,94474],{},"SharePoint implements a distinct three-level hierarchy that requires special attention:",[2510,94476,94477,94483,94489],{},[2357,94478,94479,94482],{},[31,94480,94481],{},"Sites"," (top level)",[2357,94484,94485,94488],{},[31,94486,94487],{},"Drives"," (within sites)",[2357,94490,94491,94494],{},[31,94492,94493],{},"Folders\u002FFiles"," (within drives)",[22,94496,94497],{},"To work with SharePoint's file system:",[2510,94499,94500,94503,94506],{},[2357,94501,94502],{},"First retrieve the site ID (top-most parent)",[2357,94504,94505],{},"Use the site ID to list drives",[2357,94507,94508],{},"Use the drive ID to create or access folders and files",[22,94510,94511],{},[31,94512,94513],{},"Important notes:",[2354,94515,94516,94519,94522],{},[2357,94517,94518],{},"You cannot create files or folders directly at the site level - you must first select a drive",[2357,94520,94521],{},"Write operations are only supported for folders and files, not for sites or drives",[2357,94523,94524],{},"Pagination is not supported for sites and drives listings",[55,94526,37023],{"id":37022},[2354,94528,94529],{},[2357,94530,94531],{},[41,94532,94535],{"href":94533,"rel":94534},"https:\u002F\u002Fdocs.unified.to\u002Fguides\u002Fhow_to_use_the_unified_file_storage_api#how-to-use-the-unified-file-storage-api",[45],"How to use the Unified File Storage API",[4156,94537,94538],{},"html pre.shiki code .s6ubI, html code.shiki .s6ubI{--shiki-default:#F97583;--shiki-dark:#F97583;--shiki-light:#D73A49}html pre.shiki code .s5n6i, html code.shiki .s5n6i{--shiki-default:#B392F0;--shiki-dark:#B392F0;--shiki-light:#6F42C1}html pre.shiki code .sAvwS, html code.shiki .sAvwS{--shiki-default:#E1E4E8;--shiki-dark:#E1E4E8;--shiki-light:#24292E}html pre.shiki code .sAzo5, html code.shiki .sAzo5{--shiki-default:#FFAB70;--shiki-dark:#FFAB70;--shiki-light:#E36209}html pre.shiki code .sxXm1, html code.shiki .sxXm1{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-light:#6A737D}html pre.shiki code .sXWYR, html code.shiki .sXWYR{--shiki-default:#79B8FF;--shiki-dark:#79B8FF;--shiki-light:#005CC5}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html pre.shiki code .s4Y1p, html code.shiki .s4Y1p{--shiki-default:#9ECBFF;--shiki-dark:#9ECBFF;--shiki-light:#032F62}",{"title":2433,"searchDepth":2434,"depth":2434,"links":94540},[94541,94542,94543,94547,94548,94551],{"id":4425,"depth":2434,"text":4426},{"id":4889,"depth":2434,"text":4890},{"id":93775,"depth":2434,"text":93776,"children":94544},[94545,94546],{"id":93815,"depth":2613,"text":93816},{"id":94012,"depth":2613,"text":94013},{"id":16608,"depth":2434,"text":16609},{"id":94466,"depth":2434,"text":94467,"children":94549},[94550],{"id":94470,"depth":2613,"text":94471},{"id":37022,"depth":2434,"text":37023},{"img":94553,"date":94554,"updated":94555,"tag":2457,"integrations":3},"https:\u002F\u002Fs3.us-east-2.amazonaws.com\u002Funified-article-images\u002Fworking_with_hierarchical_tree_data_in_storage_messaging_and_kms_apis-icon.png","2024-11-07T00:00:00.000Z","2026-10-21T00:21:20.549Z","\u002Fguides\u002Fworking_with_hierarchical_tree_data_in_storage_messaging_and_kms_apis",{"title":93709,"description":93724},"guides\u002Fworking_with_hierarchical_tree_data_in_storage_messaging_and_kms_apis","28OC7UmoK9uZeVjnaouQUHAm7rn63rQT41UxjTVvOhk",1792745589907]