Legacy Documentation: This content is maintained for backward
compatibility and may not reflect the latest features or best practices. For
current documentation, please refer to our updated guides.
The DevXP engineering team hosts office hours every Thursday at 11 a.m.
Pacific Time where we answer your questions live and help you get up and
running with Flatfile. Join
us!
Flatfile is an event-based system. This means that an
Event is published on almost any interaction a
user has within the Flatfile platform.A Listener is a function that is triggered by an
Event. It’s a powerful building block because it can be completely customized,
enabling you to respond to events precisely the way your business and workflow
require.In this step of the tutorial, you’ll learn how to set up a Listener to receive
Events.
export default function (listener) { //note: listening to all events with a wildcard can be used while testing but is not //recommended for production, as it will capture all events and may cause performance issues listener.on("**", (event) => { console.log(`Received event: ${event.topic}`); });}
import { FlatfileEvent, FlatfileListener } from "@flatfile/listener";export default function flatfileEventListener(listener: FlatfileListener) { //note: listening to all events with a wildcard can be used while testing but is not //recommended for production, as it will capture all events and may cause performance issues listener.on("**", (event: FlatfileEvent) => { console.log(`Received event: ${event.topic}`); });}
As you can see, this function is listening on ”**”, which is a wildcard that
matches all events on all Apps. All this listener does is log an incoming
Event’s topic.
Let’s walk through setting up your first listener. To do this, you’ll be using
some of the tools Flatfile provides for developers.
Flatfile is a Typescript/Javascript platform, so you will need to install
Node.js to use all the tools Flatfile provides developers. Though not
required, switch to Node.js v18 for the best experience.
Now that you have listener code configured with credentials, you’re ready to
listen for Events.We’ll run this listener locally by using the “develop” command from the Flatfile
CLI.You may chose to run either a Typescript or a Javascript version of this
listener:
npx flatfile@latest develop typescript/index.ts
npx flatfile@latest develop javascript/index.js
Congratulations, you have created your first listener!You should see console output that looks like this:
console
> npx flatfile develop✔ 1 environment(s) found for these credentials✔ Environment "development" selectedncc: Version 0.36.1ncc: Compiling file index.js into CJS ✓ 427ms GET 200 https://platform.flatfile.com/api/v1/subscription 12345 File change detected. 🚀 ✓ Connected to event stream for scope us_env_1234
To watch your listener receive an event, you’ll need to trigger one. Let’s learn
how to leverage your listener to
Configure a Space on the fly.
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"Flatfile Developer Docs","colors":{"primary":"#4C4ED9","light":"#ACD8FC","dark":"#113264"},"logo":{"light":"https://mintcdn.com/flatfileinc/z5XZrucoygPxgKQc/static/logo/logo-black.png?fit=max\u0026auto=format\u0026n=z5XZrucoygPxgKQc\u0026q=85\u0026s=16fd3e9dd6f6d554a2dc94c69aa2a082","dark":"https://mintcdn.com/flatfileinc/z5XZrucoygPxgKQc/static/logo/logo-white.png?fit=max\u0026auto=format\u0026n=z5XZrucoygPxgKQc\u0026q=85\u0026s=713d5a31637ce27daaadb8edf049a53e"},"favicon":"/static/favicon.png","background":{"color":{"dark":"#1B1B1E"}},"navbar":{"links":[{"icon":"slack","href":"https://flatfile.com/join-slack/","label":"Community"},{"icon":"mail","href":"mailto:support@flatfile.com","label":"Contact Us"}],"primary":{"type":"button","label":"Platform","href":"https://platform.flatfile.com"}},"footer":{"socials":{"x":"https://x.com/flatfile","github":"https://github.com/FlatFilers","linkedin":"https://linkedin.com/company/flatfile"}},"fonts":{"heading":{"family":"Flatfile Diatype","source":"https://flatfile.com/fonts/FlatfileDiatypeVariable.woff2","format":"woff2"},"body":{"family":"Flatfile Diatype","source":"https://flatfile.com/fonts/FlatfileDiatypeVariable.woff2","format":"woff2"}},"icons":{"library":"lucide"},"styling":{"latex":false},"banner":{"content":"**Welcome to the new Flatfile Developer Docs!**\n\n [Learn more](https://flatfile.com/docs/welcome-to-new-docs).","dismissible":true},"errors":{"404":{"redirect":true}},"contextual":{"options":["copy","view","chatgpt","claude"],"display":"header"},"integrations":{"koala":{"publicApiKey":"pk_6bf7c03b55e41304acf993aafa7e9d40c1d9"}},"navigation":{"global":{"anchors":[{"anchor":"API Reference","icon":"book-open","href":"https://reference.flatfile.com"},{"anchor":"Changelog","icon":"scroll-text","href":"https://flatfile.com/docs/changelog"},{"anchor":"Platform","icon":"rocket","href":"https://platform.flatfile.com"}]},"pages":[]}},"deployment":{"deploymentMetadataValue":{"subdomain":"flatfileinc","hasAudioNarration":false,"actualSubdomain":"flatfileinc","customDomains":["flatfile.com"],"gitSource":{"type":"github","owner":"flatfilers","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"feedback":{"edits":true,"issues":true},"entitlements":{"AI_CHAT":{"status":"ENABLED"},"REMOVE_BRANDING":{"status":"ENABLED"},"CONTEXTUAL_FEEDBACK":{"status":"ENABLED"},"CODE_SNIPPET_FEEDBACK":{"status":"ENABLED"},"WEB_MCP":{"status":"ENABLED"},"NARRATION":{"status":"ENABLED"}},"buildId":"6ae914fde836d20f79ac6e8c:success","clientVersion":"0.0.4102","searchFilterCounts":[{"language":"default","tag":"Plugins","count":46},{"language":"default","tag":"Docs","count":45},{"language":"default","tag":"Core Concepts","count":14},{"language":"default","tag":"Advanced Guides","count":14},{"language":"default","tag":"Embedding Flatfile","count":7},{"language":"default","tag":"Data Structure","count":6},{"language":"default","tag":"Reference","count":6},{"language":"default","tag":"Coding Tutorial","count":4},{"language":"default","tag":"Automation \u0026 Processing","count":4},{"language":"default","tag":"Listeners 101: Your First Listener","count":3}]},"assistantConfig":{},"basePath":"/docs","hasChatPermissions":true,"hasWebMcpPermissions":true,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-rbac-roles","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"rbac-expansion","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"full-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-dual-write","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"approve-review-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-metadata","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"sso-setup-deadline-banner","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"turbopuffer-serve","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"live-agents","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"googleFontsInlined":false},"customCss":[{"filePath":"static/styles.css","content":"@font-face{font-family:'Flatfile Diatype Mono';src:url('https://flatfile.com/fonts/FlatfileDiatypeMono-Regular.woff2') format('woff2');font-weight:400;font-style:normal;font-display:swap}code,pre,.code{font-family:'Flatfile Diatype Mono', 'SF Mono', Monaco, Consolas, 'Courier New', monospace!important}div#banner{height:auto!important}div#banner p{margin:10 0}foreignObject{display:flex;align-items:center;justify-content:center;\u0026:has(.edgeLabel){background-color:transparent;.edgeLabel,\n .labelBkg {\n background-color: transparent !important;\n }\n\n p {\n margin-inline: auto !important;\n max-width: max-content;\n border-radius: 0.2rem;\n padding: 0.25rem 0.5rem;\n }}}.dark .tab-container{background-color:rgba(0,0,0,0.1);padding:0 1rem;border-radius:0.8rem;border:1px solid rgba(224, 224, 229, 0.1)}.light .tab-container{background-color:rgba(0,0,0,0.03);padding:0 1rem;border-radius:0.8rem;border:1px solid rgba(0, 0, 0, 0.1)}em{font-style:oblique 12deg}code[language=\"text\"]{font-family:'Flatfile Diatype Mono', 'SF Mono', Monaco, Consolas, 'Courier New', monospace!important;line-height:1rem;padding:0;margin:0;white-space:pre;display:block;font-size:1rem}"}],"page":{"pagePath":"legacy-docs/tutorials/projects/meet-the-listener","slug":"/legacy-docs/tutorials/projects/meet-the-listener","pageMetadata":{"title":"Setup a listener","description":"listen and respond to events in Flatfile","icon":"circle-1","href":"/legacy-docs/tutorials/projects/meet-the-listener","hidden":false},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"listen and respond to events in Flatfile\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,hr:`hr`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,..._provideComponents(),...props.components},{CodeBlock,CodeGroup,Heading,Info,Note,Tip}=_components;if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!CodeGroup)_missingMdxReference(`CodeGroup`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Info)_missingMdxReference(`Info`,true);if(!Note)_missingMdxReference(`Note`,true);if(!Tip)_missingMdxReference(`Tip`,true);return _jsxs(_Fragment,{children:[_jsx(Note,{children:_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Legacy Documentation`}),`: This content is maintained for backward\ncompatibility and may not reflect the latest features or best practices. For\ncurrent documentation, please refer to our updated guides.`]})}),`\n`,_jsx(Tip,{children:_jsxs(_components.p,{children:[`The DevXP engineering team hosts office hours every Thursday at 11 a.m.\nPacific Time where we answer your questions live and help you get up and\nrunning with Flatfile. `,_jsx(_components.a,{href:`https://flatfile.com/webinar/developer-office-hours/`,children:`Join\nus!`})]})}),`\n`,_jsxs(_components.p,{children:[`Flatfile is an event-based system. This means that an\n`,_jsx(_components.a,{href:`/reference/events`,children:`Event`}),` is published on almost any interaction a\nuser has within the Flatfile platform.`]}),`\n`,_jsxs(_components.p,{children:[`A `,_jsx(_components.a,{href:`/core-concepts/listeners`,children:`Listener`}),` is a function that is triggered by an\nEvent. It’s a powerful building block because it can be completely customized,\nenabling you to respond to events precisely the way your business and workflow\nrequire.`]}),`\n`,_jsx(_components.p,{children:`In this step of the tutorial, you’ll learn how to set up a Listener to receive\nEvents.`}),`\n`,_jsx(Heading,{level:`2`,id:`about-listeners`,children:`About listeners`}),`\n`,_jsx(_components.p,{children:`Let’s take a look at a basic listener.`}),`\n`,_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`javascript`,numberOfLines:`7`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`7`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`export`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` default`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:` (`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`listener`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` //note: listening to all events with a wildcard can be used while testing but is not `})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` //recommended for production, as it will capture all events and may cause performance issues`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` listener`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`on`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"**\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, (`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`event`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`=>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` console`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`log`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`Received event: \"}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:\"${\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`event`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`topic`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` });`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})}),_jsx(CodeBlock,{filename:`typescript`,numberOfLines:`9`,language:`javascript`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`javascript`,children:_jsxs(_components.code,{language:`javascript`,numberOfLines:`9`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` { `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`FlatfileEvent`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`FlatfileListener`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` } `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"@flatfile/listener\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`;`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`export`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` default`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` function`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` flatfileEventListener`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`listener`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` FlatfileListener`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` //note: listening to all events with a wildcard can be used while testing but is not `})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` //recommended for production, as it will capture all events and may cause performance issues`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` listener`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`on`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"**\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, (`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`event`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`:`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` FlatfileEvent`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`=>`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` console`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:`log`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`Received event: \"}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:\"${\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`event`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#D4D4D4`},children:`.`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`topic`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#569CD6`},children:`}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:\"`\"}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`);`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` });`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`}`})}),`\n`]})})})]}),`\n`,_jsx(_components.p,{children:`As you can see, this function is listening on ”**”, which is a wildcard that\nmatches all events on all Apps. All this listener does is log an incoming\nEvent’s topic.`}),`\n`,_jsx(Heading,{level:`2`,id:`setup-your-first-listener`,children:`Setup your first listener`}),`\n`,_jsx(_components.p,{children:`Let’s walk through setting up your first listener. To do this, you’ll be using\nsome of the tools Flatfile provides for developers.`}),`\n`,_jsx(Info,{children:_jsx(_components.p,{children:`Flatfile is a Typescript/Javascript platform, so you will need to install\nNode.js to use all the tools Flatfile provides developers. Though not\nrequired, switch to Node.js v18 for the best experience.`})}),`\n`,_jsxs(_components.p,{children:[`First, clone our\n`,_jsx(_components.a,{href:`https://github.com/FlatFilers/getting-started`,children:`Getting Started`}),` repository.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`git clone https://github.com/FlatFilers/getting-started.git`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.p,{children:`Then, install dependencies.`}),`\n`,_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`npm`,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`npm install`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsx(CodeBlock,{filename:`yarn`,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`yarn install`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})})]}),`\n`,_jsxs(_components.p,{children:[`Next, add your credentials. To do this, create an `,_jsx(_components.code,{children:`.env`}),` file at the root of your cloned repository.`]}),`\n`,_jsx(CodeBlock,{filename:``,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`cp .env.example .env`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsxs(_components.p,{children:[`Now, update the `,_jsx(_components.code,{children:`FLATFILE_API_KEY`}),` value, setting it to your Secret Key.`]}),`\n`,_jsx(Heading,{level:`2`,id:`run-your-first-listener`,children:`Run your first listener`}),`\n`,_jsx(_components.p,{children:`Now that you have listener code configured with credentials, you’re ready to\nlisten for Events.`}),`\n`,_jsx(_components.p,{children:`We’ll run this listener locally by using the “develop” command from the Flatfile\nCLI.`}),`\n`,_jsx(_components.p,{children:`You may chose to run either a Typescript or a Javascript version of this\nlistener:`}),`\n`,_jsxs(CodeGroup,{children:[_jsx(CodeBlock,{filename:`ts listener`,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`npx flatfile@latest develop typescript/index.ts`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),_jsx(CodeBlock,{filename:`js listener`,numberOfLines:`2`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`2`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`npx flatfile@latest develop javascript/index.js`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})})]}),`\n`,_jsx(_components.p,{children:`Congratulations, you have created your first listener!`}),`\n`,_jsx(_components.p,{children:`You should see console output that looks like this:`}),`\n`,_jsx(CodeBlock,{filename:`console`,numberOfLines:`10`,language:`text`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`text`,children:_jsxs(_components.code,{language:`text`,numberOfLines:`10`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`> npx flatfile develop`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`✔ 1 environment(s) found for these credentials`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`✔ Environment \"development\" selected`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`ncc: Version 0.36.1`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:`ncc: Compiling file index.js into CJS`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ✓ 427ms GET 200 https://platform.flatfile.com/api/v1/subscription 12345`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` File change detected. 🚀`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{children:` ✓ Connected to event stream for scope us_env_1234`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{})})]})})}),`\n`,_jsx(_components.hr,{}),`\n`,_jsx(Heading,{level:`2`,id:`next-steps`,children:`Next steps`}),`\n`,_jsxs(_components.p,{children:[`To watch your listener receive an event, you’ll need to trigger one. Let’s learn\nhow to leverage your listener to\n`,_jsx(_components.a,{href:`/legacy-docs/tutorials/projects/meet-the-workbook`,children:`Configure a Space`}),` on the fly.`]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"Setup a listener","description":"listen and respond to events in Flatfile","icon":"circle-1","href":"/legacy-docs/tutorials/projects/meet-the-listener","hidden":false}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"About listeners","slug":"about-listeners","depth":2,"children":[]},{"title":"Setup your first listener","slug":"setup-your-first-listener","depth":2,"children":[]},{"title":"Run your first listener","slug":"run-your-first-listener","depth":2,"children":[]},{"title":"Next steps","slug":"next-steps","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":["/docs/_mintlify/custom/flatfileinc/0885ab0a767493f4/tools/search-docs/src/advanced-search.js","/docs/_mintlify/custom/flatfileinc/3d93aadd993301a4/tools/search-docs/src/flatfile-docs-search.js","/docs/_mintlify/custom/flatfileinc/f0e30c5d5a2f7f3f/tools/search-docs/src/populate-search-results.js","/docs/_mintlify/custom/flatfileinc/88d0b42aecb7c482/tools/search-docs/tests/test-populate.js","/docs/_mintlify/custom/flatfileinc/76a5acafda6b2f4a/tools/search-docs/tests/test-search.js"],"subdomain":"flatfileinc","siteName":"Flatfile Developer Docs","title":"Setup a listener - Flatfile Developer Docs","navMaps":{"firstHrefInVersion":{},"firstHrefInLanguage":{}},"lastModified":"2026-01-06T22:49:56.460Z","originalFileLocation":"legacy-docs/tutorials/projects/meet-the-listener.mdx"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"listen and respond to events in Flatfile\">\u003cmeta data-mint-head name=\"application-name\" content=\"Flatfile Developer Docs\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/flatfileinc/eJAdNPO4HNQs9zZh/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/docs/mintlify-assets/_mintlify/favicons/flatfileinc/eJAdNPO4HNQs9zZh/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/flatfileinc/eJAdNPO4HNQs9zZh/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/flatfileinc/eJAdNPO4HNQs9zZh/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/flatfileinc/eJAdNPO4HNQs9zZh/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/docs/mintlify-assets/_mintlify/favicons/flatfileinc/eJAdNPO4HNQs9zZh/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/docs/mintlify-assets/_mintlify/favicons/flatfileinc/eJAdNPO4HNQs9zZh/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/docs/mintlify-assets/_mintlify/favicons/flatfileinc/eJAdNPO4HNQs9zZh/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/docs/mintlify-assets/_mintlify/favicons/flatfileinc/eJAdNPO4HNQs9zZh/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"Setup a listener - Flatfile Developer Docs\">\u003cmeta data-mint-head property=\"og:description\" content=\"listen and respond to events in Flatfile\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"Flatfile Developer Docs\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://flatfile.com/docs/legacy-docs/tutorials/projects/meet-the-listener\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://flatfileinc.mintlify.site/docs/_mintlify/api/og/v2?division=Documentation\u0026amp;title=Setup+a+listener\u0026amp;description=listen+and+respond+to+events+in+Flatfile\u0026amp;theme=1a8226b3069ecd536f43ada5\u0026amp;signature=27e9f49f5c9d0f1843369158c389696d192bd28ea480472b53a25ce58b6e8d96\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"Setup a listener - Flatfile Developer Docs\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"listen and respond to events in Flatfile\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://flatfileinc.mintlify.site/docs/_mintlify/api/og/v2?division=Documentation\u0026amp;title=Setup+a+listener\u0026amp;description=listen+and+respond+to+events+in+Flatfile\u0026amp;theme=1a8226b3069ecd536f43ada5\u0026amp;signature=27e9f49f5c9d0f1843369158c389696d192bd28ea480472b53a25ce58b6e8d96\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/docs/mintlify-assets/_mintlify/favicons/flatfileinc/eJAdNPO4HNQs9zZh/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"Flatfile Developer Docs\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#4C4ED9\">\u003clink data-mint-head rel=\"canonical\" href=\"https://flatfile.com/docs/legacy-docs/tutorials/projects/meet-the-listener\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/docs/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/docs/legacy-docs/tutorials/projects/meet-the-listener.md\">","agentPointerHref":"/docs/legacy-docs/tutorials/projects/meet-the-listener.md","siteName":"Flatfile Developer Docs","nav":{"global":{"anchors":[{"anchor":"API Reference","icon":"book-open","href":"https://reference.flatfile.com"},{"anchor":"Changelog","icon":"scroll-text","href":"https://flatfile.com/docs/changelog"},{"anchor":"Platform","icon":"rocket","href":"https://platform.flatfile.com"}]},"groups":[{"group":"Getting Started","icon":"circle-play","pages":[{"title":"Welcome to Flatfile","href":"/index"},{"title":"Getting Started with AutoBuild","href":"/getting-started/quickstart/autobuild"},{"title":"Creating Your First Project","href":"/getting-started/quickstart/first-project"}]},{"group":"Core Concepts","icon":"lightbulb","pages":[{"title":"Overview","href":"/core-concepts/overview"},{"group":"Infrastructure \u0026 Organization","pages":[{"title":"Environments","href":"/core-concepts/environments"},{"title":"Apps","href":"/core-concepts/apps"},{"title":"Spaces","href":"/core-concepts/spaces"}]},{"group":"Data Structure","pages":[{"title":"Blueprints","href":"/core-concepts/blueprints"},{"title":"Documents","href":"/core-concepts/documents"},{"title":"Workbooks","href":"/core-concepts/workbooks"},{"title":"Sheets","href":"/core-concepts/sheets"},{"title":"Fields","href":"/core-concepts/fields"},{"title":"Records","href":"/core-concepts/records"}]},{"group":"Automation \u0026 Processing","pages":[{"title":"Events and Listeners","href":"/core-concepts/listeners"},{"title":"Jobs","href":"/core-concepts/jobs"},{"title":"Actions","href":"/core-concepts/actions"},{"title":"Plugins","href":"/core-concepts/plugins"}]}]},{"group":"Coding Tutorial","icon":"code","pages":[{"title":"Coding Tutorial","href":"/coding-tutorial/overview"},{"group":"Listeners 101: Your First Listener","pages":[{"title":"01: Creating Your First Listener","href":"/coding-tutorial/101-your-first-listener/101.01-first-listener"},{"title":"02: Adding Validation to Your Listener","href":"/coding-tutorial/101-your-first-listener/101.02-adding-validation"},{"title":"03: Adding Actions to Your Listener","href":"/coding-tutorial/101-your-first-listener/101.03-adding-actions"}]}]},{"group":"Plugins","icon":"puzzle","pages":[{"title":"Overview","href":"/plugins/index"},{"group":"Docs","pages":[{"title":"Autocast Plugin","href":"/plugins/autocast"},{"title":"Automap Plugin","href":"/plugins/automap"},{"title":"Boolean Validator","href":"/plugins/boolean"},{"title":"Constraints Plugin","href":"/plugins/constraints"},{"title":"Currency Conversion Plugin","href":"/plugins/currency"},{"title":"Date Format Normalizer","href":"/plugins/date"},{"title":"Deduplicate Sheet Records","href":"/plugins/dedupe"},{"title":"Delimited File Zip Exporter","href":"/plugins/delimited-zip"},{"title":"Delimiter Extractor Plugin","href":"/plugins/delimiter-extractor"},{"title":"Email Validation Plugin","href":"/plugins/email"},{"title":"Export Workbook Plugin","href":"/plugins/export-workbook"},{"title":"Foreign Database Extractor for Microsoft SQL Server","href":"/plugins/foreign-db-extractor"},{"title":"Geocode Address Data","href":"/plugins/geocode"},{"title":"GPX File Parser and Analyzer","href":"/plugins/gpx"},{"title":"GraphQL Schema to Flatfile Blueprint Converter","href":"/plugins/graphql-schema"},{"title":"HTML Table Extractor","href":"/plugins/html-table"},{"title":"ISBN Validator Plugin","href":"/plugins/isbn"},{"title":"Job Handler Plugin","href":"/plugins/job-handler"},{"title":"JSON Extractor","href":"/plugins/json-extractor"},{"title":"JSON Schema Converter","href":"/plugins/json-schema"},{"title":"Markdown File Extractor","href":"/plugins/markdown"},{"title":"Merge.dev Connection Plugin","href":"/plugins/merge-connection"},{"title":"Number Validation Plugin","href":"/plugins/number"},{"title":"OpenAPI Schema to Flatfile Blueprint Converter","href":"/plugins/openapi-schema"},{"title":"PDF Extractor Plugin","href":"/plugins/pdf-extractor"},{"title":"Phone Number Validation and Formatting Plugin","href":"/plugins/phone"},{"title":"Pivot Table Exporter","href":"/plugins/pivot-table"},{"title":"Record Hook Plugin","href":"/plugins/record-hook"},{"title":"Rollout: Automatic Workbook Updates","href":"/plugins/rollout"},{"title":"Sentiment Analysis Plugin","href":"/plugins/sentiment"},{"title":"Space Configure from Template","href":"/plugins/space-configure-from-template"},{"title":"Flatfile Space Configuration Plugin","href":"/plugins/space-configure"},{"title":"SQL DDL to Flatfile Blueprint Converter","href":"/plugins/sql-ddl-converter"},{"title":"Stored Constraints Plugin","href":"/plugins/stored-constraints"},{"title":"String Validator Plugin","href":"/plugins/string"},{"title":"Text Summarization and Key Phrase Extraction Plugin","href":"/plugins/summarize"},{"title":"Field Translation using Google Translate API","href":"/plugins/translate"},{"title":"View Mapped Data Plugin","href":"/plugins/view-mapped"},{"title":"Webhook Egress","href":"/plugins/webhook-egress"},{"title":"Webhook Event Forwarder","href":"/plugins/webhook-event-forwarder"},{"title":"What3Words Converter Plugin","href":"/plugins/what3words"},{"title":"Excel Extractor","href":"/plugins/xlsx-extractor"},{"title":"XML Extractor","href":"/plugins/xml-extractor"},{"title":"YAML Schema to Flatfile Blueprint Converter","href":"/plugins/yaml-schema"},{"title":"Zip Extractor","href":"/plugins/zip-extractor"}]}]},{"group":"Advanced Guides","icon":"map","pages":[{"title":"Guides Overview","href":"/guides/overview"},{"title":"Authentication and Authorization","href":"/guides/authentication"},{"title":"Actions","href":"/guides/using-actions"},{"title":"Using Record Hooks","href":"/guides/using-record-hooks"},{"title":"Accepting Additional Fields","href":"/guides/accepting-additional-fields"},{"title":"Advanced Filters","href":"/guides/advanced-filters"},{"title":"Custom Extractors","href":"/guides/custom-extractors"},{"title":"Theming","href":"/guides/theme-your-space"},{"title":"Internationalization","href":"/guides/translating-your-space"},{"title":"Data Egress","href":"/guides/egress"},{"title":"Metadata","href":"/guides/utilizing-metadata"},{"title":"Multi-Part Jobs","href":"/guides/multi-part-jobs"},{"title":"Namespaces and Filters","href":"/guides/namespaces-and-filters"},{"title":"Secrets","href":"/guides/share-secrets"}]},{"group":"Embedding Flatfile","icon":"code","pages":[{"title":"Overview","href":"/embedding/overview"},{"title":"JavaScript Embedding","href":"/embedding/javascript"},{"title":"React Embedding","href":"/embedding/react"},{"title":"Angular Embedding","href":"/embedding/angular"},{"title":"Vue Embedding","href":"/embedding/vue"},{"title":"Advanced Configuration","href":"/embedding/advanced-configuration"},{"title":"Server Setup for Space Reuse","href":"/embedding/server-setup"}]},{"group":"Reference","icon":"book-open","pages":[{"title":"Event Reference","href":"/reference/events"},{"title":"Icon Reference","href":"/reference/icons"},{"title":"CLI Reference","href":"/reference/cli"},{"title":"Flatfile Query Language","href":"/reference/ffql"},{"title":"For LLMs","href":"/reference/for-llms"},{"title":"V2 Records API","href":"/reference/v2-records-api"}]}]},"basePath":"","title":"Setup a listener - Flatfile Developer Docs","buildId":"dpl_2AK98Hxhwu4fUXpx9atbv41cC328","deploymentId":"dpl_2AK98Hxhwu4fUXpx9atbv41cC328","dynamics":["10e4515597"],"chunks":["BannerMarkdown-CK-IGkvh.js","dist-PCbBHBTv.js","lib-DuNMoZ05.js","lib-B8HbPgcC.js","clsx-Y_UC780V.js","html-void-elements-mCSPHezU.js","katex-YMM-FMeD.js","marked.esm-CZWythHk.js"]}