[{"data":1,"prerenderedAt":718},["ShallowReactive",2],{"doc:\u002Fdocs\u002Fintegrations":3,"docs-nav":517},{"id":4,"title":5,"body":6,"description":16,"extension":510,"meta":511,"navigation":398,"path":513,"seo":514,"stem":515,"__hash__":516},"docs\u002Fdocs\u002Fintegrations\u002FREADME.md","Integrations",{"type":7,"value":8,"toc":503},"minimark",[9,13,17,24,30,35,266,280,284,313,317,344,418,431,435,438,473,477,499],[10,11,5],"h1",{"id":12},"integrations",[14,15,16],"p",{},"Tabularia fits into the rest of a data stack in two directions: other systems drive it\nand read from it (the API, tokens and webhooks, single sign-on, metrics), and it reports\nto them (lineage events, the audit log, a dbt project, the data itself in your object\nstorage and databases). This page is the map: one line per integration, and the page\nthat explains it.",[14,18,19],{},[20,21],"img",{"alt":22,"src":23},"Administration, Service accounts: the account Airflow production with one read-and-write token, nightly runs, expiring in 90 days","\u002Fmedia\u002Fguide\u002Fapi\u002Fservice-account-tokens.png",[14,25,26],{},[27,28,29],"em",{},"A service account for an external scheduler and its token, as in the example below.",[31,32,34],"h2",{"id":33},"the-map","The map",[36,37,38,57],"table",{},[39,40,41],"thead",{},[42,43,44,48,51,54],"tr",{},[45,46,47],"th",{},"Integration",[45,49,50],{},"What it does",[45,52,53],{},"Set up in",[45,55,56],{},"Page",[58,59,60,92,116,144,166,194,213,229,248],"tbody",{},[42,61,62,66,69,85],{},[63,64,65],"td",{},"AI models",[63,67,68],{},"The chat over the catalog, the assistants of the flow and script editors, the descriptions and SQL translations of the dbt export. Anthropic, and any OpenAI-compatible endpoint.",[63,70,71,72,76,77,81,82],{},"Providers and models in ",[73,74,75],"strong",{},"Administration → AI models","; also ",[78,79,80],"code",{},"AI__BASE_URL",", ",[78,83,84],{},"AI__SECRET_KEY",[63,86,87],{},[88,89,91],"a",{"href":90},"\u002Fdocs\u002Fintegrations\u002Fai","AI",[42,93,94,97,100,111],{},[63,95,96],{},"API, tokens and webhooks",[63,98,99],{},"Run flows, refresh datasources, read runs and lineage, download data from scripts and schedulers; be called when a run ends, with an HMAC signature.",[63,101,102,81,105,81,108],{},[73,103,104],{},"Settings → API tokens",[73,106,107],{},"Administration → Service accounts",[73,109,110],{},"Administration → Webhooks",[63,112,113],{},[88,114,96],{"href":115},"\u002Fdocs\u002Fapi",[42,117,118,121,131,138],{},[63,119,120],{},"dbt",[63,122,123,124,81,127,130],{},"Export a flow as a dbt project: one model per output, ",[78,125,126],{},"sources.yml",[78,128,129],{},"schema.yml",", the data contract as tests.",[63,132,133,134,137],{},"The Flows page, ",[73,135,136],{},"«Export flow»"," (administrators)",[63,139,140],{},[88,141,143],{"href":142},"\u002Fdocs\u002Fdbt-export","Export to dbt",[42,145,146,149,152,161],{},[63,147,148],{},"OpenLineage",[63,150,151],{},"Tell an external catalog (Marquez, DataHub, OpenMetadata…) what every run read and wrote: flows, refreshes, SQL and saved scripts, flow groups and their cells, containers, notebook sessions.",[63,153,154,157,158],{},[78,155,156],{},"OPENLINEAGE__URL"," or ",[78,159,160],{},"OPENLINEAGE__FILE",[63,162,163],{},[88,164,148],{"href":165},"\u002Fdocs\u002Fopenlineage",[42,167,168,171,174,184],{},[63,169,170],{},"Single sign-on",[63,172,173],{},"Sign in through an OIDC provider (Keycloak, Microsoft Entra ID…), with its groups or roles mapped onto Tabularia's groups.",[63,175,176,179,180,183],{},[78,177,178],{},"OIDC__*"," variables, ",[78,181,182],{},"oidc.*"," in the Helm chart",[63,185,186,81,190],{},[88,187,189],{"href":188},"\u002Fdocs\u002Fsso-keycloak","Single sign-on with Keycloak",[88,191,193],{"href":192},"\u002Fdocs\u002Fdesign\u002Fsso-group-mapping","SSO and group mapping",[42,195,196,199,202,207],{},[63,197,198],{},"SIEM",[63,200,201],{},"Forward every audit log entry to Splunk through the HTTP Event Collector, within seconds.",[63,203,204],{},[73,205,206],{},"Administration → SIEM",[63,208,209],{},[88,210,212],{"href":211},"\u002Fdocs\u002Fsiem-splunk","Audit log to Splunk",[42,214,215,218,221,224],{},[63,216,217],{},"Monitoring",[63,219,220],{},"Prometheus metrics, health checks, a Grafana dashboard, the Performance, Queue and Cluster pages.",[63,222,223],{},"Included in Docker Compose; your own stack on Kubernetes",[63,225,226],{},[88,227,217],{"href":228},"\u002Fdocs\u002Fintegrations\u002Fmonitoring",[42,230,231,234,237,243],{},[63,232,233],{},"Data connections",[63,235,236],{},"Read from and write to databases, SFTP servers, S3 buckets, HTTP APIs, SharePoint and SMTP servers.",[63,238,239,242],{},[73,240,241],{},"Connections",", in a folder",[63,244,245],{},[88,246,241],{"href":247},"\u002Fdocs\u002Fconnections",[42,249,250,253,256,261],{},[63,251,252],{},"Container registries",[63,254,255],{},"Run images from Harbor, GitHub, GitLab, Docker Hub or a cloud registry as steps of a flow (Kubernetes).",[63,257,258],{},[73,259,260],{},"Administration → Container registries",[63,262,263],{},[88,264,252],{"href":265},"\u002Fdocs\u002Fcontainer-registries",[14,267,268,271,272,275,276,279],{},[73,269,270],{},"External orchestrators"," such as Airflow drive Tabularia through the API: a service\naccount token starts a flow (",[78,273,274],{},"POST \u002Fflows\u002F{id}\u002Frun-now",") and a webhook, or polling\n",[78,277,278],{},"GET \u002Fruns\u002F{id}",", tells them when it ended. There is no plugin to install.",[31,281,283],{"id":282},"how-integrations-reach-tabularia","How integrations reach Tabularia",[285,286,287,298,304],"ul",{},[288,289,290,293,294,297],"li",{},[73,291,292],{},"Inbound calls"," authenticate with an API token in the ",[78,295,296],{},"Authorization"," header.\nA personal token acts with its owner's permissions; a service account is an\nintegration rather than a person, with its own permissions on folders, and is the\nright choice for a scheduler or a CI job. Tokens are read-only or read-write, always\nexpire, and every action they take is in the audit log under the token's name.",[288,299,300,303],{},[73,301,302],{},"Outbound calls"," (webhooks, the SIEM, OpenLineage, the AI endpoint) are configured\nby an administrator or by the environment, never by a flow. Webhooks are signed, and\nretried when the receiver fails.",[288,305,306,309,310,312],{},[73,307,308],{},"What leaves the installation"," is decided per integration: OpenLineage sends only\nmetadata (names, schemas, query texts, counts and times, never rows); the SIEM sends\naudit entries; webhooks send the run's outcome. What the assistants send to the model\nis described in ",[88,311,91],{"href":90},".",[31,314,316],{"id":315},"example-an-external-scheduler-runs-a-flow","Example: an external scheduler runs a flow",[14,318,319,320,323,324,327,328,331,332,335,336,339,340,343],{},"An administrator creates a service account ",[78,321,322],{},"airflow"," in ",[73,325,326],{},"Administration → Service\naccounts",", grants it ",[73,329,330],{},"RUN"," on the folder ",[78,333,334],{},"Sample \u002F Flows"," and ",[73,337,338],{},"EDIT"," on\n",[78,341,342],{},"Sample \u002F Private tables",", where the flow publishes its datasource, and creates a\nread-write token for it. The scheduler then starts the flow «Top 20 Products by Revenue» (id 42\nhere) and waits for it:",[345,346,351],"pre",{"className":347,"code":348,"language":349,"meta":350,"style":350},"language-bash shiki shiki-themes github-dark-dimmed github-light","curl -X POST -H \"Authorization: Bearer tab_…\" \\\n  \"https:\u002F\u002Ftabularia.example.com\u002Fapi\u002Fflows\u002F42\u002Frun-now?mode=production\"\n# 202 {\"run_id\": 2212, …}\n\ncurl -H \"Authorization: Bearer tab_…\" https:\u002F\u002Ftabularia.example.com\u002Fapi\u002Fruns\u002F2212\n# {\"id\": 2212, \"status\": \"SUCCESS\", …}\n","bash","",[78,352,353,380,386,393,400,412],{"__ignoreMap":350},[354,355,358,362,366,370,373,376],"span",{"class":356,"line":357},"line",1,[354,359,361],{"class":360},"sqRhv","curl",[354,363,365],{"class":364},"swcJU"," -X",[354,367,369],{"class":368},"sXfbr"," POST",[354,371,372],{"class":364}," -H",[354,374,375],{"class":368}," \"Authorization: Bearer tab_…\"",[354,377,379],{"class":378},"sxsTv"," \\\n",[354,381,383],{"class":356,"line":382},2,[354,384,385],{"class":368},"  \"https:\u002F\u002Ftabularia.example.com\u002Fapi\u002Fflows\u002F42\u002Frun-now?mode=production\"\n",[354,387,389],{"class":356,"line":388},3,[354,390,392],{"class":391},"sgHix","# 202 {\"run_id\": 2212, …}\n",[354,394,396],{"class":356,"line":395},4,[354,397,399],{"emptyLinePlaceholder":398},true,"\n",[354,401,403,405,407,409],{"class":356,"line":402},5,[354,404,361],{"class":360},[354,406,372],{"class":364},[354,408,375],{"class":368},[354,410,411],{"class":368}," https:\u002F\u002Ftabularia.example.com\u002Fapi\u002Fruns\u002F2212\n",[354,413,415],{"class":356,"line":414},6,[354,416,417],{"class":391},"# {\"id\": 2212, \"status\": \"SUCCESS\", …}\n",[14,419,420,421,335,424,427,428,312],{},"Instead of polling, a webhook on ",[78,422,423],{},"flow.run.succeeded",[78,425,426],{},"flow.run.failed",", limited to\nthe same folder, calls the scheduler's endpoint when the run ends. The details, the\nstable endpoints and the signature check are in ",[88,429,430],{"href":115},"the API guide",[31,432,434],{"id":433},"no-lock-in","No lock-in",[14,436,437],{},"These facts keep your work yours:",[285,439,440,446,452,461,467],{},[288,441,442,445],{},[73,443,444],{},"Open source and self-hosted."," Tabularia is licensed under the AGPL-3.0 and runs on\nyour infrastructure, with Docker Compose or the Helm chart.",[288,447,448,451],{},[73,449,450],{},"Your data stays in an open format on your storage."," Every datasource and run\nresult is a parquet file in your S3-compatible bucket or Google Cloud Storage, and\nOutput nodes write to your own databases.",[288,453,454,457,458,312],{},[73,455,456],{},"Open interfaces."," Everything the interface does goes through the same REST API,\ndescribed by the OpenAPI page the gateway serves at ",[78,459,460],{},"\u002Fdocs",[288,462,463,466],{},[73,464,465],{},"Open lineage."," Runs are reported in the OpenLineage standard to the catalog you\nchoose.",[288,468,469,472],{},[73,470,471],{},"Portable flows."," A flow exports as a dbt project you can run without Tabularia.",[31,474,476],{"id":475},"related","Related",[285,478,479,486,493],{},[288,480,481,485],{},[88,482,484],{"href":483},"\u002Fdocs\u002Fconcepts","Concepts",": the objects these integrations act on",[288,487,488,492],{},[88,489,491],{"href":490},"\u002Fdocs\u002Fconfiguration","Configuration reference",": every environment variable",[288,494,495],{},[88,496,498],{"href":497},"\u002Fdocs\u002Fdeploy\u002Fkubernetes","Kubernetes and Helm",[500,501,502],"style",{},"html pre.shiki code .sqRhv, html code.shiki .sqRhv{--shiki-default:#F69D50;--shiki-light:#6F42C1}html pre.shiki code .swcJU, html code.shiki .swcJU{--shiki-default:#6CB6FF;--shiki-light:#005CC5}html pre.shiki code .sXfbr, html code.shiki .sXfbr{--shiki-default:#96D0FF;--shiki-light:#032F62}html pre.shiki code .sxsTv, html code.shiki .sxsTv{--shiki-default:#F47067;--shiki-light:#005CC5}html pre.shiki code .sgHix, html code.shiki .sgHix{--shiki-default:#768390;--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 .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":350,"searchDepth":382,"depth":388,"links":504},[505,506,507,508,509],{"id":33,"depth":382,"text":34},{"id":282,"depth":382,"text":283},{"id":315,"depth":382,"text":316},{"id":433,"depth":382,"text":434},{"id":475,"depth":382,"text":476},"md",{"source":512},"docs\u002Fintegrations\u002FREADME.md","\u002Fdocs\u002Fintegrations",{"title":5,"description":16},"docs\u002Fintegrations\u002FREADME","dNAONYfz91qSmocMIN3xssstpBrtM_oiKp4CcgzHKes",[518,535,591,623,651,664,688,710],{"title":519,"icon":520,"intro":521,"items":522},"Getting started","start","Install it on one machine, learn the few ideas everything else is built on, and run a first flow.",[523,525,528,531,532],{"path":524,"title":519},"\u002Fdocs\u002Fgetting-started",{"path":526,"title":527},"\u002Fdocs\u002Fgetting-started-docker-compose","Walkthrough with Docker Compose",{"path":529,"title":530},"\u002Fdocs\u002Fdeploy\u002Fminikube","Try it on your computer (minikube)",{"path":483,"title":484},{"path":533,"title":534},"\u002Fdocs\u002Foverview","Overview (README)",{"title":536,"icon":537,"intro":538,"items":539},"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.",[540,543,546,549,552,555,558,561,564,567,570,573,576,579,582,585,588],{"path":541,"title":542},"\u002Fdocs\u002Fcapabilities","All capabilities",{"path":544,"title":545},"\u002Fdocs\u002Fcapabilities\u002Fflows","Low-code flows",{"path":547,"title":548},"\u002Fdocs\u002Fcapabilities\u002Fpreview-and-analysis","Preview and analysis",{"path":550,"title":551},"\u002Fdocs\u002Fcapabilities\u002Fask-your-data","Ask your data with AI",{"path":553,"title":554},"\u002Fdocs\u002Fcapabilities\u002Freports","Pixel-perfect reports",{"path":556,"title":557},"\u002Fdocs\u002Fcapabilities\u002Freport-functions","Report functions",{"path":559,"title":560},"\u002Fdocs\u002Fcapabilities\u002Fdashboards","Dashboards",{"path":562,"title":563},"\u002Fdocs\u002Fscripting","Python and R",{"path":565,"title":566},"\u002Fdocs\u002Fsql-scripts","SQL scripts",{"path":568,"title":569},"\u002Fdocs\u002Fcapabilities\u002Fnotebooks","marimo notebooks as apps",{"path":571,"title":572},"\u002Fdocs\u002Fcontainer-node","Docker images in flows",{"path":574,"title":575},"\u002Fdocs\u002Fcapabilities\u002Fflow-groups","Flow groups: orchestration",{"path":577,"title":578},"\u002Fdocs\u002Fcapabilities\u002Fscheduling","Scheduling",{"path":580,"title":581},"\u002Fdocs\u002Fpushmail","Pushmail: datasources, reports and dashboards by email",{"path":583,"title":584},"\u002Fdocs\u002Fplaceholders","Dynamic dates",{"path":586,"title":587},"\u002Fdocs\u002Fcapabilities\u002Fengines","Engines",{"path":589,"title":590},"\u002Fdocs\u002Fengines\u002Fengine-differences","Engine differences",{"title":592,"icon":593,"intro":594,"items":595},"Sources","sources","Every way data comes in: files, databases, buckets, SFTP folders, HTTP APIs, SharePoint, Google Sheets, and the results of your own flows.",[596,599,602,605,608,611,614,617,620],{"path":597,"title":598},"\u002Fdocs\u002Fsources","All sources",{"path":600,"title":601},"\u002Fdocs\u002Fsources\u002Ffiles","Uploaded files",{"path":603,"title":604},"\u002Fdocs\u002Fsources\u002Fdatabases","Database tables and queries",{"path":606,"title":607},"\u002Fdocs\u002Fs3-datasource","S3 buckets",{"path":609,"title":610},"\u002Fdocs\u002Fsftp","SFTP folders",{"path":612,"title":613},"\u002Fdocs\u002Fapi-datasource","HTTP APIs",{"path":615,"title":616},"\u002Fdocs\u002Fsources\u002Fsharepoint","Excel on SharePoint",{"path":618,"title":619},"\u002Fdocs\u002Fsources\u002Fgoogle-sheets","Google Sheets",{"path":621,"title":622},"\u002Fdocs\u002Fsources\u002Fflow-outputs","Results of flows and scripts",{"title":241,"icon":624,"intro":625,"items":626},"connections","The systems Tabularia reads from and writes to, how each connection is set up, and who may use it.",[627,629,632,635,638,640,641,643,644,647,648],{"path":247,"title":628},"All connections",{"path":630,"title":631},"\u002Fdocs\u002Fconnections\u002Fdatabases","Databases",{"path":633,"title":634},"\u002Fdocs\u002Fsqlserver","Microsoft SQL Server driver",{"path":636,"title":637},"\u002Fdocs\u002Fconnections\u002Fs3","S3 and compatible storage",{"path":609,"title":639},"SFTP servers",{"path":612,"title":613},{"path":615,"title":642},"SharePoint",{"path":618,"title":619},{"path":645,"title":646},"\u002Fdocs\u002Fconnections\u002Fsmtp","SMTP email",{"path":265,"title":252},{"path":649,"title":650},"\u002Fdocs\u002Fconnections\u002Fdestinations","Writing data out",{"title":5,"icon":12,"intro":652,"items":653},"How Tabularia fits your stack: AI providers, the REST API and webhooks, dbt, OpenLineage, single sign-on, SIEM and monitoring.",[654,656,658,659,660,661,662,663],{"path":513,"title":655},"All integrations",{"path":90,"title":657},"AI: where it is used",{"path":115,"title":96},{"path":142,"title":143},{"path":165,"title":148},{"path":188,"title":189},{"path":211,"title":212},{"path":228,"title":217},{"title":665,"icon":666,"intro":667,"items":668},"Security & governance","governance","Who may see and do what, what is recorded, and how data quality and personal data are kept in check.",[669,672,675,678,681,682,685],{"path":670,"title":671},"\u002Fdocs\u002Fgovernance","Overview",{"path":673,"title":674},"\u002Fdocs\u002Fgovernance\u002Fpermissions","Permissions",{"path":676,"title":677},"\u002Fdocs\u002Fgovernance\u002Faudit-log","Audit log",{"path":679,"title":680},"\u002Fdocs\u002Fgovernance\u002Fdata-contracts","Data contracts",{"path":192,"title":193},{"path":683,"title":684},"\u002Fdocs\u002Fexamples\u002Fkeycloak","Keycloak example on a laptop",{"path":686,"title":687},"\u002Fdocs\u002Fengines\u002Fclickhouse-ai-user","A ClickHouse user for the AI assistant",{"title":689,"icon":690,"intro":691,"items":692},"Install & operate","operate","Run it in production on Kubernetes, configure it, upgrade it and keep it healthy.",[693,694,697,700,703,704,707],{"path":497,"title":498},{"path":695,"title":696},"\u002Fdocs\u002Fdeploy\u002Fkind","A company-like cluster on one computer (kind)",{"path":698,"title":699},"\u002Fdocs\u002Fdeploy\u002Fupgrading","Upgrading, backups and restore",{"path":701,"title":702},"\u002Fdocs\u002Fdeploy\u002Frelease-checklist","Install and upgrade checklist",{"path":490,"title":491},{"path":705,"title":706},"\u002Fdocs\u002Fengine-settings","Settings from the panel",{"path":708,"title":709},"\u002Fdocs\u002Fdatabase-migrations","Database migrations",{"title":711,"icon":712,"intro":713,"items":714},"Reference","reference","Release process and the remaining reference pages.",[715],{"path":716,"title":717},"\u002Fdocs\u002Frelease-process","Release process",1793656372064]