[{"data":1,"prerenderedAt":1103},["ShallowReactive",2],{"doc:\u002Fdocs\u002Fsources\u002Fgoogle-sheets":3,"docs-nav":885},{"id":4,"title":5,"body":6,"description":876,"extension":877,"meta":878,"navigation":880,"path":881,"seo":882,"stem":883,"__hash__":884},"docs\u002Fdocs\u002Fsources\u002Fgoogle-sheets.md","Google Sheets",{"type":7,"value":8,"toc":861},"minimark",[9,13,30,35,128,132,151,225,232,236,246,272,279,286,291,297,366,385,389,394,454,464,469,553,556,560,570,624,717,729,732,786,789,793,836,840],[10,11,5],"h1",{"id":12},"google-sheets",[14,15,16,17,21,22,25,26,29],"p",{},"A ",[18,19,20],"strong",{},"Google Sheets connection"," reads spreadsheets through a Google Cloud ",[18,23,24],{},"service\naccount",", with read-only access. A ",[18,27,28],{},"Google Sheets datasource"," takes one tab of a\nspreadsheet (or a range of it), turns it into a table, and keeps it as a snapshot,\nrefreshed by hand or on a schedule. It suits the sheets a team keeps up to date by hand:\ntargets, price lists, mappings, a budget kept in Google Workspace.",[31,32,34],"h2",{"id":33},"at-a-glance","At a glance",[36,37,38,49],"table",{},[39,40,41],"thead",{},[42,43,44,47],"tr",{},[45,46],"th",{},[45,48],{},[50,51,52,61,73,93,101,112,120],"tbody",{},[42,53,54,58],{},[55,56,57],"td",{},"Connection",[55,59,60],{},"A service account's JSON key",[42,62,63,66],{},[55,64,65],{},"Datasource",[55,67,68,69,72],{},"Explore, in a folder: ",[18,70,71],{},"New → Datasource from a database",", then the Google Sheets connection",[42,74,75,78],{},[55,76,77],{},"Reads",[55,79,80,81,85,86,85,89,92],{},"One tab of a Google Sheets spreadsheet, whole or a range (",[82,83,84],"code",{},"A1:F500",", ",[82,87,88],{},"B3:H",[82,90,91],{},"A:F",")",[42,94,95,98],{},[55,96,97],{},"Writes",[55,99,100],{},"Nothing: the access asked of Google is read-only, and the spreadsheet stays where it is",[42,102,103,106],{},[55,104,105],{},"Updated",[55,107,108,111],{},[18,109,110],{},"Refresh snapshot now",", a cron schedule, or a flow group step",[42,113,114,117],{},[55,115,116],{},"Permissions",[55,118,119],{},"CONNECT on the connection's folder; EDIT on the destination folder to create, RUN to refresh",[42,121,122,125],{},[55,123,124],{},"Status",[55,126,127],{},"Built and tested against the documented contract of the Google Sheets and Drive APIs, not yet against a production Google Cloud project",[31,129,131],{"id":130},"before-you-start-the-service-account","Before you start: the service account",[14,133,134,135,138,139,142,143,150],{},"Tabularia reads as a ",[18,136,137],{},"service account",", a Google Cloud identity of its own with an\nemail such as ",[82,140,141],{},"tabularia-reader@acme-data.iam.gserviceaccount.com",", not as a person. A\nservice account sees only the spreadsheets someone shares with that email: no one's\nDrive, no domain-wide access. In the ",[144,145,149],"a",{"href":146,"rel":147},"https:\u002F\u002Fconsole.cloud.google.com\u002F",[148],"nofollow","Google Cloud console",":",[152,153,154,161,180,193,207],"ol",{},[155,156,157,160],"li",{},[18,158,159],{},"Choose or create a project"," (the selector at the top). The project only holds the\naccount and the APIs; the spreadsheets can belong to anyone.",[155,162,163,166,167,171,172,175,176,179],{},[18,164,165],{},"Enable the APIs."," ",[168,169,170],"em",{},"APIs & Services → Library",": enable ",[18,173,174],{},"Google Sheets API",".\nEnable ",[18,177,178],{},"Google Drive API"," as well if you want the datasource dialog to list the\nspreadsheets shared with the account; without it, you paste each spreadsheet's link.",[155,181,182,166,185,188,189,192],{},[18,183,184],{},"Create the service account.",[168,186,187],{},"IAM & Admin → Service accounts → Create service\naccount",": a name such as ",[82,190,191],{},"tabularia-reader",". It needs no role in the project: skip\nthe optional steps.",[155,194,195,198,199,202,203,206],{},[18,196,197],{},"Create a key."," Open the account, ",[168,200,201],{},"Keys → Add key → Create new key → JSON",". The\nbrowser downloads a ",[82,204,205],{},".json"," file: this is the credential. Keep it like a password,\nand delete it from your computer once the connection is saved.",[155,208,209,212,213,216,217,220,221,224],{},[18,210,211],{},"Share the spreadsheets."," In Google Sheets, ",[18,214,215],{},"Share",", add the account's email (it\nis in the JSON as ",[82,218,219],{},"client_email",", and the connection form shows it) with the role\n",[18,222,223],{},"Viewer",". Untick «Notify people»: nobody reads that mailbox.",[14,226,227,228,231],{},"If your organisation forbids service account keys (the policy\n",[82,229,230],{},"iam.disableServiceAccountKeyCreation","), the key step fails: ask your Google Cloud\nadministrators for an exception on this project.",[31,233,235],{"id":234},"the-connection","The connection",[14,237,238,239,242,243,245],{},"From a folder in Explore: ",[18,240,241],{},"New → New connection",", type ",[18,244,5],{},".",[36,247,248,258],{},[39,249,250],{},[42,251,252,255],{},[45,253,254],{},"Field",[45,256,257],{},"Meaning",[50,259,260],{},[42,261,262,265],{},[55,263,264],{},"Service account key (JSON)",[55,266,267,268,271],{},"The whole file downloaded at step 4: paste it, or ",[18,269,270],{},"Choose the JSON file…",". When editing, empty keeps the stored key.",[14,273,274,275,278],{},"As soon as the key is in the form, the dialog shows ",[18,276,277],{},"Share the spreadsheets, as Viewer,\nwith"," and the account's email, and the Google Cloud project. Both are read from the key\nwhen it is saved, and the Connections page lists the connection under that email: a\nconnection is one account.",[14,280,281],{},[282,283],"img",{"alt":284,"src":285},"The New connection dialog with type Google Sheets: the JSON key pasted (blurred here), the account's email to share the spreadsheets with, the project, and the result of the test","\u002Fmedia\u002Fguide\u002Fconnections\u002Fgoogle-sheets-connection.png",[14,287,288],{},[168,289,290],{},"A Google Sheets connection with a made-up key: the email to share the spreadsheets with, and a working test.",[14,292,293,296],{},[18,294,295],{},"Test connection"," asks Google for a token with the key, checks that the Google Sheets\nAPI is enabled in the project, and counts the spreadsheets shared with the account\n(through Drive). What it says when something is wrong:",[36,298,299,309],{},[39,300,301],{},[42,302,303,306],{},[45,304,305],{},"Message",[45,307,308],{},"What to do",[50,310,311,319,330,342,350,358],{},[42,312,313,316],{},[55,314,315],{},"Google refused the key of … it was deleted or revoked",[55,317,318],{},"The key was deleted in the console, or belongs to another account: create a new JSON key and paste it into the connection.",[42,320,321,324],{},[55,322,323],{},"The service account … does not exist any more, or is disabled",[55,325,326,327,245],{},"The account was deleted or disabled in ",[168,328,329],{},"IAM & Admin → Service accounts",[42,331,332,335],{},[55,333,334],{},"Enable the Google Sheets API in the Google Cloud project …",[55,336,337,338,341],{},"Follow the link in the message, ",[18,339,340],{},"Enable",", wait a few minutes, test again.",[42,343,344,347],{},[55,345,346],{},"The worker's clock is wrong",[55,348,349],{},"Google refuses a token signed at the wrong time: fix the server's time (NTP).",[42,351,352,355],{},[55,353,354],{},"Connection working … no spreadsheet is shared with it yet",[55,356,357],{},"Share a spreadsheet with the email shown, as Viewer.",[42,359,360,363],{},[55,361,362],{},"Connection working … the Google Drive API is not enabled",[55,364,365],{},"The connection works; only the list of spreadsheets is missing. Enable the Drive API, or paste links.",[14,367,368,369,372,373,376,377,380,381,384],{},"The key is encrypted at rest with the same Fernet key as every other connection secret\n(",[82,370,371],{},"SECURITY__FERNET_KEY","), travels encrypted to the worker and is decrypted only to sign\nthe token request. The API never returns it, and it is never written to a log. The\nGoogle addresses are fixed in Tabularia: the ",[82,374,375],{},"token_uri"," written in the key's file is\nnot used, and whoever creates a connection cannot point it elsewhere. The token asks\nfor two read-only scopes, ",[82,378,379],{},"spreadsheets.readonly"," and ",[82,382,383],{},"drive.metadata.readonly","\n(Drive's file names and dates only, never their content).",[31,386,388],{"id":387},"the-datasource","The datasource",[14,390,391,393],{},[18,392,71],{},", choose the Google Sheets connection, then:",[36,395,396,404],{},[39,397,398],{},[42,399,400,402],{},[45,401,254],{},[45,403,257],{},[50,405,406,430,438],{},[42,407,408,411],{},[55,409,410],{},"Spreadsheet",[55,412,413,414,417,418,421,422,425,426,429],{},"One of the spreadsheets shared with the account, from a list with a search (needs the Drive API), or ",[18,415,416],{},"Paste a link instead",": the address from the browser, ",[82,419,420],{},"https:\u002F\u002Fdocs.google.com\u002Fspreadsheets\u002Fd\u002F…",", or the bare spreadsheet ID. ",[18,423,424],{},"Open"," reads its tabs. A link that ends with ",[82,427,428],{},"#gid=…"," selects that tab.",[42,431,432,435],{},[55,433,434],{},"Tab",[55,436,437],{},"The tab to read; charts on a tab of their own are not offered. The tab is remembered by its ID too: renaming it in Google Sheets does not break the datasource.",[42,439,440,443],{},[55,441,442],{},"Range",[55,444,445,446,85,448,450,451,453],{},"Optional, in A1 notation inside the tab: ",[82,447,84],{},[82,449,88],{}," (from row 3 to the last row), ",[82,452,91],{},". Empty = the whole tab.",[14,455,456,459,460,463],{},[18,457,458],{},"Preview the first rows"," reads the first rows exactly as the import will, and shows\neach column with its type: a header problem shows here, before anything is saved.\n",[18,461,462],{},"Create & import"," starts the first import.",[465,466,468],"h3",{"id":467},"how-the-cells-become-a-table","How the cells become a table",[470,471,472,478,500,506,528,537],"ul",{},[155,473,474,477],{},[18,475,476],{},"The header is the first row"," of the tab, or of the range. Every column needs a\nname, no name twice (regardless of case), no title above the table. A value to the\nright of the last named column is refused too, naming its cell: give the column a\nname, or narrow the range. Nothing is skipped or renamed silently.",[155,479,480,483,484,487,488,491,492,495,496,499],{},[18,481,482],{},"Numbers are read as numbers",", whatever the spreadsheet's locale shows: ",[82,485,486],{},"1.234,50 €","\nin an Italian sheet is ",[82,489,490],{},"1234.5",". A percentage is its fraction (",[82,493,494],{},"15%"," is ",[82,497,498],{},"0.15",").",[155,501,502,505],{},[18,503,504],{},"Dates come back as dates."," Google Sheets keeps dates as numbers of days; a column\nwhose cells are formatted as dates becomes a date column, as date-times a date-time\ncolumn (as shown in the sheet, without a time zone), as times a time column. A\nduration of 24 hours or more stays a number of days.",[155,507,508,511,512,515,516,519,520,523,524,527],{},[18,509,510],{},"The types are then guessed as for an uploaded CSV",": whole numbers become integers,\nnumbers with decimals become decimals, ",[82,513,514],{},"TRUE","\u002F",[82,517,518],{},"FALSE"," booleans, and a column mixing\nnumbers and words becomes text. One exception: a column Google Sheets holds as ",[18,521,522],{},"text\nin every cell"," stays text, so codes such as ",[82,525,526],{},"00123"," keep their leading zeros. To have\nnumbers, format the column as a number in Google Sheets.",[155,529,530,533,534,245],{},[18,531,532],{},"Empty cells are empty"," (NULL), and ",[18,535,536],{},"empty rows are dropped",[155,538,539,542,543,85,546,85,549,552],{},[18,540,541],{},"Formula errors"," (",[82,544,545],{},"#N\u002FA",[82,547,548],{},"#REF!",[82,550,551],{},"#DIV\u002F0!","…) become empty cells; the run counts\nthem.",[14,554,555],{},"Large tabs are read in pages of about 200,000 cells. The rules of every imported\ndatasource apply: snapshot swap at success, one refresh at a time, scheduled refresh,\ndata contract. Google Sheets datasources take no sort keys: rows keep the sheet's order.",[31,557,559],{"id":558},"example-the-sales-targets-kept-by-the-sales-team","Example: the sales targets kept by the sales team",[14,561,562,563,566,567,150],{},"The sales managers keep the monthly targets in a spreadsheet, ",[82,564,565],{},"Targets 2026",", on a tab\n",[82,568,569],{},"By agent",[36,571,572,591],{},[39,573,574],{},[42,575,576,579,582,585,588],{},[45,577,578],{},"agent_code",[45,580,581],{},"agent",[45,583,584],{},"month",[45,586,587],{},"target_eur",[45,589,590],{},"confirmed",[50,592,593,609],{},[42,594,595,598,601,604,607],{},[55,596,597],{},"00412",[55,599,600],{},"Marta Bianchi",[55,602,603],{},"2026-01-01",[55,605,606],{},"48000",[55,608,514],{},[42,610,611,614,617,619,622],{},[55,612,613],{},"00417",[55,615,616],{},"Luca Verdi",[55,618,603],{},[55,620,621],{},"35500",[55,623,518],{},[152,625,626,636,645,669,705],{},[155,627,628,629,632,633,635],{},"In Google Cloud, project ",[82,630,631],{},"acme-data",": enable the Google Sheets and Google Drive APIs,\ncreate the service account ",[82,634,191],{}," and a JSON key for it.",[155,637,638,639,641,642,644],{},"In Google Sheets, share ",[82,640,565],{}," with\n",[82,643,141],{}," as Viewer.",[155,646,647,648,651,652,242,654,656,657,85,660,662,663,665,666,245],{},"In Tabularia, folder ",[82,649,650],{},"Sales",": ",[18,653,241],{},[18,655,5],{},", name\n",[82,658,659],{},"Google Sheets (sales)",[18,661,270],{}," and pick the downloaded key.\n",[18,664,295],{}," says it is signed in and that one spreadsheet is shared with it.\n",[18,667,668],{},"Create",[155,670,671,672,651,675,656,677,680,681,683,684,686,687,689,690,692,693,695,696,698,699,701,702,704],{},"In the folder ",[82,673,674],{},"Sales \u002F Tables",[18,676,71],{},[82,678,679],{},"sales_targets_2026",", the connection ",[82,682,659],{},". Choose ",[82,685,565],{},"\nin the list, the tab ",[82,688,569],{},", no range. ",[18,691,458],{}," shows\n",[82,694,578],{}," as String (the codes keep their zeros), ",[82,697,584],{}," as Date, ",[82,700,587],{}," as\nInt64 and ",[82,703,590],{}," as Boolean.",[155,706,707,709,710,651,713,716],{},[18,708,462],{},", then ",[18,711,712],{},"Schedule automatic refresh (cron)",[82,714,715],{},"0 6 * * 1-5",", every\nworking day at six, before the morning reports.",[14,718,719,720,722,723,725,726,728],{},"A flow then joins ",[82,721,679],{}," with the invoiced sales on ",[82,724,578],{}," and\n",[82,727,584],{},", and computes how far each agent is from the target.",[31,730,116],{"id":731},"permissions",[36,733,734,744],{},[39,735,736],{},[42,737,738,741],{},[45,739,740],{},"To",[45,742,743],{},"You need",[50,745,746,754,762,770,778],{},[42,747,748,751],{},[55,749,750],{},"Create, test, change or delete the connection",[55,752,753],{},"CONNECT on its folder",[42,755,756,759],{},[55,757,758],{},"List the spreadsheets, open one, preview a tab",[55,760,761],{},"CONNECT on the connection's folder",[42,763,764,767],{},[55,765,766],{},"Create the datasource",[55,768,769],{},"CONNECT on the connection's folder and EDIT on the destination folder",[42,771,772,775],{},[55,773,774],{},"Refresh it, schedule it",[55,776,777],{},"RUN on its folder and CONNECT on the connection's folder",[42,779,780,783],{},[55,781,782],{},"Read it in flows, views, scripts",[55,784,785],{},"VIEW on its folder",[14,787,788],{},"What the account can read is decided in Google Sheets, by sharing; who in Tabularia can\nread through it is decided by CONNECT. Every spreadsheet shared with the account is\nreadable by whoever has CONNECT on the connection's folder: one account per team keeps\nthose two lists the same.",[31,790,792],{"id":791},"limits-and-good-to-know","Limits and good to know",[470,794,795,801,821,827,833],{},[155,796,797,800],{},[18,798,799],{},"Quota",": Google allows 60 read requests a minute for each service account. One\nrefresh makes a few (one per page of about 200,000 cells, plus two); a 429 is retried,\nwaiting what Google asks. Many large tabs refreshed at the same minute can still hit\nit: spread the schedules.",[155,802,803,806,807,810,811,815,816,820],{},[18,804,805],{},"Excel files in Drive"," are not Google Sheets spreadsheets: the API refuses them, and\nthe message says so. Open the file and choose ",[168,808,809],{},"File → Save as Google Sheets",", or use\nthe ",[144,812,814],{"href":813},"\u002Fdocs\u002Fsources\u002Fsharepoint","SharePoint"," or ",[144,817,819],{"href":818},"\u002Fdocs\u002Fsftp","SFTP"," datasources for Excel files.",[155,822,823,826],{},[18,824,825],{},"The source is fixed",": the spreadsheet, tab and range cannot be changed once the\ndatasource exists; create another one.",[155,828,829,832],{},[18,830,831],{},"Not tried on a production Google Cloud project",": the connector follows the\ndocumented Google APIs and is tested against a simulation of them. Try it on your\nproject before relying on a schedule.",[155,834,835],{},"OpenLineage reports a refresh with the spreadsheet's address and the tab as its input;\nthe dbt export turns a Google Sheets datasource into a seed.",[31,837,839],{"id":838},"related","Related",[470,841,842,849,855],{},[155,843,844,848],{},[144,845,847],{"href":846},"\u002Fdocs\u002Fsources","All sources",": snapshots, refreshes, descriptions, contracts, permissions.",[155,850,851,854],{},[144,852,853],{"href":813},"Excel on SharePoint",": the same idea for workbooks in Microsoft 365.",[155,856,857,245],{},[144,858,860],{"href":859},"\u002Fdocs\u002Fconnections","Connections",{"title":862,"searchDepth":863,"depth":864,"links":865},"",2,3,[866,867,868,869,872,873,874,875],{"id":33,"depth":863,"text":34},{"id":130,"depth":863,"text":131},{"id":234,"depth":863,"text":235},{"id":387,"depth":863,"text":388,"children":870},[871],{"id":467,"depth":864,"text":468},{"id":558,"depth":863,"text":559},{"id":731,"depth":863,"text":116},{"id":791,"depth":863,"text":792},{"id":838,"depth":863,"text":839},"A Google Sheets connection reads spreadsheets through a Google Cloud service\naccount, with read-only access. A Google Sheets datasource takes one tab of a\nspreadsheet (or a range of it), turns it into a table, and keeps it as a snapshot,\nrefreshed by hand or on a schedule. It suits the sheets a team keeps up to date by hand:\ntargets, price lists, mappings, a budget kept in Google Workspace.","md",{"source":879},"docs\u002Fsources\u002Fgoogle-sheets.md",true,"\u002Fdocs\u002Fsources\u002Fgoogle-sheets",{"title":5,"description":876},"docs\u002Fsources\u002Fgoogle-sheets","bJ6JuYmaNlQGmq0W5h0vGXK1uZfM0czc3qWjYGMoxDk",[886,905,961,986,1015,1044,1069,1095],{"title":887,"icon":888,"intro":889,"items":890},"Getting started","start","Install it on one machine, learn the few ideas everything else is built on, and run a first flow.",[891,893,896,899,902],{"path":892,"title":887},"\u002Fdocs\u002Fgetting-started",{"path":894,"title":895},"\u002Fdocs\u002Fgetting-started-docker-compose","Walkthrough with Docker Compose",{"path":897,"title":898},"\u002Fdocs\u002Fdeploy\u002Fminikube","Try it on your computer (minikube)",{"path":900,"title":901},"\u002Fdocs\u002Fconcepts","Concepts",{"path":903,"title":904},"\u002Fdocs\u002Foverview","Overview (README)",{"title":906,"icon":907,"intro":908,"items":909},"Capabilities","capabilities","What you can build: visual flows, analysis on any step, AI questions, pixel-perfect reports, dashboards, Python, R and SQL scripts, containers and the orchestration that ties them together.",[910,913,916,919,922,925,928,931,934,937,940,943,946,949,952,955,958],{"path":911,"title":912},"\u002Fdocs\u002Fcapabilities","All capabilities",{"path":914,"title":915},"\u002Fdocs\u002Fcapabilities\u002Fflows","Low-code flows",{"path":917,"title":918},"\u002Fdocs\u002Fcapabilities\u002Fpreview-and-analysis","Preview and analysis",{"path":920,"title":921},"\u002Fdocs\u002Fcapabilities\u002Fask-your-data","Ask your data with AI",{"path":923,"title":924},"\u002Fdocs\u002Fcapabilities\u002Freports","Pixel-perfect reports",{"path":926,"title":927},"\u002Fdocs\u002Fcapabilities\u002Freport-functions","Report functions",{"path":929,"title":930},"\u002Fdocs\u002Fcapabilities\u002Fdashboards","Dashboards",{"path":932,"title":933},"\u002Fdocs\u002Fscripting","Python and R",{"path":935,"title":936},"\u002Fdocs\u002Fsql-scripts","SQL scripts",{"path":938,"title":939},"\u002Fdocs\u002Fcapabilities\u002Fnotebooks","marimo notebooks as apps",{"path":941,"title":942},"\u002Fdocs\u002Fcontainer-node","Docker images in flows",{"path":944,"title":945},"\u002Fdocs\u002Fcapabilities\u002Fflow-groups","Flow groups: orchestration",{"path":947,"title":948},"\u002Fdocs\u002Fcapabilities\u002Fscheduling","Scheduling",{"path":950,"title":951},"\u002Fdocs\u002Fpushmail","Pushmail: datasources, reports and dashboards by email",{"path":953,"title":954},"\u002Fdocs\u002Fplaceholders","Dynamic dates",{"path":956,"title":957},"\u002Fdocs\u002Fcapabilities\u002Fengines","Engines",{"path":959,"title":960},"\u002Fdocs\u002Fengines\u002Fengine-differences","Engine differences",{"title":962,"icon":963,"intro":964,"items":965},"Sources","sources","Every way data comes in: files, databases, buckets, SFTP folders, HTTP APIs, SharePoint, Google Sheets, and the results of your own flows.",[966,967,970,973,976,978,981,982,983],{"path":846,"title":847},{"path":968,"title":969},"\u002Fdocs\u002Fsources\u002Ffiles","Uploaded files",{"path":971,"title":972},"\u002Fdocs\u002Fsources\u002Fdatabases","Database tables and queries",{"path":974,"title":975},"\u002Fdocs\u002Fs3-datasource","S3 buckets",{"path":818,"title":977},"SFTP folders",{"path":979,"title":980},"\u002Fdocs\u002Fapi-datasource","HTTP APIs",{"path":813,"title":853},{"path":881,"title":5},{"path":984,"title":985},"\u002Fdocs\u002Fsources\u002Fflow-outputs","Results of flows and scripts",{"title":860,"icon":987,"intro":988,"items":989},"connections","The systems Tabularia reads from and writes to, how each connection is set up, and who may use it.",[990,992,995,998,1001,1003,1004,1005,1006,1009,1012],{"path":859,"title":991},"All connections",{"path":993,"title":994},"\u002Fdocs\u002Fconnections\u002Fdatabases","Databases",{"path":996,"title":997},"\u002Fdocs\u002Fsqlserver","Microsoft SQL Server driver",{"path":999,"title":1000},"\u002Fdocs\u002Fconnections\u002Fs3","S3 and compatible storage",{"path":818,"title":1002},"SFTP servers",{"path":979,"title":980},{"path":813,"title":814},{"path":881,"title":5},{"path":1007,"title":1008},"\u002Fdocs\u002Fconnections\u002Fsmtp","SMTP email",{"path":1010,"title":1011},"\u002Fdocs\u002Fcontainer-registries","Container registries",{"path":1013,"title":1014},"\u002Fdocs\u002Fconnections\u002Fdestinations","Writing data out",{"title":1016,"icon":1017,"intro":1018,"items":1019},"Integrations","integrations","How Tabularia fits your stack: AI providers, the REST API and webhooks, dbt, OpenLineage, single sign-on, SIEM and monitoring.",[1020,1023,1026,1029,1032,1035,1038,1041],{"path":1021,"title":1022},"\u002Fdocs\u002Fintegrations","All integrations",{"path":1024,"title":1025},"\u002Fdocs\u002Fintegrations\u002Fai","AI: where it is used",{"path":1027,"title":1028},"\u002Fdocs\u002Fapi","API, tokens and webhooks",{"path":1030,"title":1031},"\u002Fdocs\u002Fdbt-export","Export to dbt",{"path":1033,"title":1034},"\u002Fdocs\u002Fopenlineage","OpenLineage",{"path":1036,"title":1037},"\u002Fdocs\u002Fsso-keycloak","Single sign-on with Keycloak",{"path":1039,"title":1040},"\u002Fdocs\u002Fsiem-splunk","Audit log to Splunk",{"path":1042,"title":1043},"\u002Fdocs\u002Fintegrations\u002Fmonitoring","Monitoring",{"title":1045,"icon":1046,"intro":1047,"items":1048},"Security & governance","governance","Who may see and do what, what is recorded, and how data quality and personal data are kept in check.",[1049,1052,1054,1057,1060,1063,1066],{"path":1050,"title":1051},"\u002Fdocs\u002Fgovernance","Overview",{"path":1053,"title":116},"\u002Fdocs\u002Fgovernance\u002Fpermissions",{"path":1055,"title":1056},"\u002Fdocs\u002Fgovernance\u002Faudit-log","Audit log",{"path":1058,"title":1059},"\u002Fdocs\u002Fgovernance\u002Fdata-contracts","Data contracts",{"path":1061,"title":1062},"\u002Fdocs\u002Fdesign\u002Fsso-group-mapping","SSO and group mapping",{"path":1064,"title":1065},"\u002Fdocs\u002Fexamples\u002Fkeycloak","Keycloak example on a laptop",{"path":1067,"title":1068},"\u002Fdocs\u002Fengines\u002Fclickhouse-ai-user","A ClickHouse user for the AI assistant",{"title":1070,"icon":1071,"intro":1072,"items":1073},"Install & operate","operate","Run it in production on Kubernetes, configure it, upgrade it and keep it healthy.",[1074,1077,1080,1083,1086,1089,1092],{"path":1075,"title":1076},"\u002Fdocs\u002Fdeploy\u002Fkubernetes","Kubernetes and Helm",{"path":1078,"title":1079},"\u002Fdocs\u002Fdeploy\u002Fkind","A company-like cluster on one computer (kind)",{"path":1081,"title":1082},"\u002Fdocs\u002Fdeploy\u002Fupgrading","Upgrading, backups and restore",{"path":1084,"title":1085},"\u002Fdocs\u002Fdeploy\u002Frelease-checklist","Install and upgrade checklist",{"path":1087,"title":1088},"\u002Fdocs\u002Fconfiguration","Configuration reference",{"path":1090,"title":1091},"\u002Fdocs\u002Fengine-settings","Settings from the panel",{"path":1093,"title":1094},"\u002Fdocs\u002Fdatabase-migrations","Database migrations",{"title":1096,"icon":1097,"intro":1098,"items":1099},"Reference","reference","Release process and the remaining reference pages.",[1100],{"path":1101,"title":1102},"\u002Fdocs\u002Frelease-process","Release process",1793656371924]