Fastest way to get financial data from Plaid into your Postgres database. Go from zero to live in 5 minutes without a single line of code.

Overview

Venice

Venice logo

Venice is a the fastest way to get financial data from Plaid into your Postgres database.

Zero to production in 5 minutes without a single line of code:

  1. Add environment variables (Plaid API key, database credentials, JWT secret).
  2. Embed pre-built UI with user-scoped accessToken.
  3. Voila! Query data in your database.

Quick start

One click deploy with Vercel

Deploy with Vercel

Venice demo

Questions & support?

Join us on Slack

Table of Contents

Why we exist

We built Venice after working on multiple fintech products. Despite the explosion of amazing fintech services like Plaid, setting up a stack still takes a ton of work. Writing integration code, UI to help user manage their connections, maintaining uptime, running data pipelines, and building the company proved to be a lot to handle. There are a ton of undifferentated plumbing here and we think we can build it once as a community and not have everyone re-invent the wheel. That way fintech developers can do what they do best — build fintech, not ETL pipelines!

What we built so far

  • Connection portal:
    • Ready to use UI for your customers to add financial connections, repair broken ones, or manually trigger a sync.
  • Token management:
    • Keep track of access tokens and don't pay for the ones you don't use
  • Incremental sync:
    • Fast and efficient sync that can be called idempotently
  • Rate limiting:
    • End point specific rate limiting to maximize performance
  • Webhook handling:
    • Get connection and data updates in real time.
  • Database sync:
    • Forget HTTP requests. The best API is the one from your database.
  • Extensible architecture:
    • No code or full code, drop down to any level of abstraction you need. You can easily extend Venice to send data to Firebase, MongoDB, or your internal API for instance.

Architecture

Venice scales up and down based on your needs. Get started with no-code, call API when the need arises, or get your hands dirty in source code with your custom fork.

Venice is designed to be modular and extensible. Drop down to the level of abstraction that best fits your need.

Here are 5 ways you can use Venice, each built on a layer below:

  • No code self-service portal (Beta).
  • Embeddable portal (Beta).
  • Theme-able React components (Planned).
  • Headless React components (Planned).
  • Stateful HTTP API (trpc Alpha, OpenAPI planned).
  • Stateless HTTP API where you handle your own persistence (Planned)
  • TypeScript core library that runs on every platform that JS does (Planned)

Getting started

  1. Click the "Deploy to Vercel" link.
  2. Create a repository on Vercel.
  3. Go to Supabase.com and create a new project.
  4. On Supabase, go to Settings > Database and scroll down to "Connection String" and click "URI".
  5. Copy that link and insert it as your POSTGRES_OR_WEBHOOK_URL in Vercel — remember to add your password to the URL when you paste it into Vercel.
  6. On Supabase, Go to Settings > API and scroll down to get your JWT token. Copy this and paste it into Vercel.
  7. Go to Plaid > Team Settings > Keys and copy the Plaid ID and Sandbox Secret key into Vercel.
  8. Deploy Vercel.
  9. Once Vercel is ready, click to open the domain.
  10. Go to jwt.io, enter the same JWT token here as you saw in Supabase. Copy this access token.
  11. Paste the access token into the URL of the Vercel Domain and add the words "?accessToken=[YOUR ACCESS TOKEN]".
  12. Voila! You should see your page. Click new connection and connect using Plaid Link. Visit the database or table in Supabase to see the transactions and accounts!

Environment variables

Name Description
NEXT_PUBLIC_SERVER_URL Fully qualified url your venice next.js app used for redirects, webhooks and server-side rendering.
e.g. https://connect.example.com or http://localhost:3000 for development. Defaults to https://$VERCEL_URL if not provided
@see https://vercel.com/docs/concepts/projects/environment-variables
Providing this explicitly is still preferrred as $VERCEL_URL does not account for custom domain
POSTGRES_OR_WEBHOOK_URL Pass a valid postgres(ql):// url for stateful mode. Will be used Primary database used for metadata and user data storage
Pass a valid http(s):// url for stateless mode. Sync data and metadata be sent to provided URL and you are responsible for your own persistence
JWT_SECRET_OR_PUBLIC_KEY Used for validating authenticity of accessToken
int_plaid__clientId string
int_plaid__secrets__sandbox string - (Optional)
int_plaid__secrets__development string - (Optional)
int_plaid__secrets__production string - (Optional)
int_plaid__clientName string = "This Application" - The name of your application, as it should be displayed in Link.
Maximum length of 30 characters.
If a value longer than 30 characters is provided, Link will display "This Application" instead.
int_plaid__products Array<assets | auth | balance | identity | investments | liabilities | payment_initiation | transactions | credit_details | income | income_verification | deposit_switch | standing_orders | transfer | employment | recurring_transactions> = ["transactions"]
int_plaid__countryCodes Array<US | GB | ES | NL | FR | IE | CA | DE | IT> = ["US"]
int_plaid__language en | fr | es | nl | de = "en"

Local Development

  1. Clone repo git clone [email protected]:usevenice/venice.git.

  2. Copy .env.example into .env and populate your own values.

  3. Install dependencies and run:

nvm use 16 # Optional, we recommend node 16.x
pnpm install
pnpm run migration up # Other databases such as Mongo / Redis / Firebase will be supported later. Let us know if you would like to contribute
pnpm run dev
  1. Visit http://localhost:3000.

Couple things you can try:

  • Connect via first selecting institution vs. connecting via selecting provider.
  • Venice works fully as a CLI tool as well.
# Sync a connection
pnpm run venice syncConnection --id $connectionId

# Sync pipeline
pnpm run venice syncPipeline --source.id $connectionId --destination.id conn_fs --destination.settings.basePath ./data

# Sync pipeline by fully specifying all source & destination settings
pnpm run venice syncPipeline --source.id conn_plaid --source.settings.accessToken $accessToken --destination.id conn_fs --destination.settings.basePath ./data

Tips

  • Use shdotenv to load env vars from .env files

FAQs

Why is it called Venice?

First to pay homage to Venice as the birth place of modern accounting. Second, the Venetian canals were used to transport goods, much like useVenice pipelines are used to transport financial data.

Do you get to see any of the data we pass through?

No. You deploy this within your own infra.

What are we working now and next?

Join the discussion at our GitHub Roadmap Project.

Contribute & Support

Join us on Slack

Comments
  • Errors in non-sandbox environments

    Errors in non-sandbox environments

    I am looking to use the plaid development environment, and have set the secrets via the env var int_plaid__secrets__development in vercel. When I click "New Connection" in the browser, I get the following logged to the JS console

    [useVeniceConnect] int_plaid Connection failed TRPCClientError: Unable to get client envName=sandbox
    

    And the HTTP request to /api/preConnect has a payload of:

    {
      "0": [
        {
          "id": "int_plaid"
        },
        {
          "envName": "sandbox"
        }
      ]
    }
    

    and response of:

    [{"id":null,"error":{"message":"Unable to get client envName=sandbox","code":-32603,"data":{"code":"INTERNAL_SERVER_ERROR","httpStatus":500,"path":"preConnect"}}}]
    

    It seems the system is not picking up the development env

    opened by jbuck94 6
  • 400 error during preConnect after initial deploy

    400 error during preConnect after initial deploy

    Hi all 👋

    I tried out Venice this morning—love the idea—but hit a snag when trying to add a new connection:

    [{"id":null,"error":{"message":"invalid_type at mutations.preConnect.input.config: Required","code":-32600,"data":{"code":"BAD_REQUEST","httpStatus":400,"path":"preConnect"}}}]%
    

    The cURL equivalent is:

    curl 'https://api-iu289via0-fastlane-happiness.vercel.app/api/preConnect?batch=1' \
      -H 'authority: api-iu289via0-fastlane-happiness.vercel.app' \
      -H 'accept: */*' \
      -H 'accept-language: en-US,en;q=0.9' \
      -H 'authorization: Bearer [redacted]' \
      -H 'content-type: application/json' \
      -H 'origin: https://api-fastlane-happiness.vercel.app' \
      -H 'referer: https://api-fastlane-happiness.vercel.app/' \
      -H 'sec-fetch-dest: empty' \
      -H 'sec-fetch-mode: cors' \
      -H 'sec-fetch-site: cross-site' \
      -H 'sec-gpc: 1' \
      -H 'user-agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/106.0.0.0 Safari/537.36' \
      -H 'x-ledger-id: iwasrobbed' \
      --data-raw '{"0":[{"id":"int_plaid"},{"envName":"sandbox"}]}' \
      --compressed
    

    Any ideas what the issue could be?

    Screen Shot 2022-10-07 at 1 29 02 PM
    opened by iwasrobbed 6
  • Add documentation setup

    Add documentation setup

    Summary

    This PR adds the initial setup and configuration for documentation with Mintlify that you can preview at venice.mintlify.com. The setup is designed to work largely with the existing setup and content such as the README.md and docs/next-steps.md

    Screen Shot 2022-10-05 at 2 02 44 AM
    opened by hanywang2 3
  • create mongodb provider as destination sync

    create mongodb provider as destination sync

    Need a review for what can be improved or fix, like is it the correct format or not. Basically I'm using the same destination format/ structures from fs provider

    opened by bayuaslamaa 3
  • New openapi codegen for yodlee client

    New openapi codegen for yodlee client

    I'm proposing to use https://github.com/anttiviljami/openapi-client-axios/blob/master/DOCS.md instead of openapi-typescript, because it has a similiar issue with this because of node-fetch https://github.com/nock/nock/issues/2197

    opened by bayuaslamaa 1
Postgres.js - The Fastest full featured PostgreSQL client for Node.js and Deno

?? Fastest full-featured node & deno client ?? ES6 Tagged Template Strings at the core ??‍♀️ Simple surface API ??️ Dynamic query support ?? Chat and

Rasmus Porsager 4.3k Jan 1, 2023
An easy and simple way to manage your financial transactions.

MyWallet An easy and simple way to manage your financial transactions. With MyWallet you can track your incomes and expenses and always keep track of

Caroline Oliveira 7 Nov 16, 2022
CryptoDappy is the fastest way to get started with Flow.

Demo application (testnet) Learning hub (start learning here) What's CryptoDappy? CryptoDappy is the fastest way to get started with blockchain develo

Benjamin Ebner 91 Aug 18, 2022
The fastest way to get started with a fully-fledged web3 frontend

create-web3-frontend The fastest way to get started with a fully-fledged web3 frontend setup consisting of Next.js, wagmi and Tailwind CSS. npx create

Dhaiwat Pandya 153 Dec 28, 2022
The simplest way to use AWS/GCP/Azure. From code to cloud in a few minutes.

Utopiops Utopiops is the best way for teams of any size to use cloud (AWS/Azure/GCP), with or without prior experience. We provide a platform that hel

utopiops 98 Dec 25, 2022
A simple Node.js code to get unlimited instagram public pictures by every user without api, without credentials.

Instagram Without APIs Instagram Scraping in August 2022, no credentials required This is a Node.js library, are you looking for the same in PHP? go t

Francesco Orsi 28 Dec 29, 2022
Headless UI components without writing a single line of JavaScript.

Zerolines.js Headless UI components without writing a single line of JavaScript. See Oficial Site: Zerolines.js Components Tab Modal Dropdown Drawer O

null 8 Sep 29, 2022
The fastest way ⚡️ to create sitemap in your Deno Fresh project 🍋

Fresh SEO ??     Quickly creating sitemaps for your Deno Fresh project. Getting Started Run the setup at the root of your project. deno run

Steven Yung 34 Dec 19, 2022
The Omnibookmarks browser extension is the fastest way to open bookmarks

★ Omnibookmarks The Omnibookmarks browser extension is the fastest way to open bookmarks. Just type a keyword into the address bar to quickly open or

Nate Hill 16 Aug 20, 2022
An efficient (and the fastest!) way to search the web privately using Brave Search Engine

Brave Search An efficient (and the fastest) way to search the web privately using Brave Search Engine. Not affiliated with Brave Search. Tested on Chr

Jishan Shaikh 7 Jun 2, 2022
A Turborepo with Strapi v4 (w/ postgres database) + Next.js powered by docker and docker-compose

Turborepo + Strapi + Next.js + Docker A Turborepo with Strapi v4 (w/ postgres database) + Next.js powered by docker and docker-compose. ⚠️ Prerequisit

Elvin Chu 60 Dec 29, 2022
Connect to a Postgres database from a Cloudflare Worker, using Cloudflare Tunnel

Cloudflare Workers Postgres Client This is an experimental module. Heavily based on cloudflare/worker-template-postgres, but cleaned up and bundled in

BubblyDoo 17 Dec 22, 2022
JSON Visio is data visualization tool for your json data which seamlessly illustrates your data on graphs without having to restructure anything, paste directly or import file.

JSON Visio is data visualization tool for your json data which seamlessly illustrates your data on graphs without having to restructure anything, paste directly or import file.

Aykut Saraç 20.6k Jan 4, 2023
A Single place to Discover, Collaborate, and Get your data right

A Single place to Discover, Collaborate, and Get your data right Darkseal Darkseal includes the following: Metadata schemas - Defines core abstraction

GuinsooLab 13 Dec 28, 2022
Squeeth is a new financial primitive in DeFi that gives traders exposure to ETH²

Squeeth Monorepo The Squeethiest ?? ?? What is Squeeth The squeeth contract is designed for users to long or short a special index: Eth², as an implem

Opyn 156 Jan 4, 2023
Marry in Web3, Mint Paired Soulbound NFTs by MultiSign Flow, No transfer, No sell, a non-financial Dapp

ERC721-520 Token 是 NFT-like Soulbound Token Standard(灵魂绑定凭证) 的一种实现,是 ERC721 标准的扩展。 ERC721-520 Token 不可转让,不可售卖,一个人同时只能有一个有效 Token ERC721-520 Token 由二者通

Marry3 48 Dec 21, 2022
Visualize, modify, and build your database with dbSpy! An open-source data modeling tool to facilitate relational database development.

Visualize, modify, and build your database with dbSpy! dbSpy is an open-source data modeling tool to facilitate relational database development. Key F

OSLabs 115 Dec 22, 2022
Zero Two Bot,A fully Modular Whatsapp Bot to do everything possible in WhatsApp by Team Zero Two

?? ???????? ?????? ???? ?? A Moduler WhatsApp Bot designed for both PM and Groups - To take your boring WhatsApp usage into a whole different level. T

Sam Pandey 69 Dec 25, 2022