Giter Site home page Giter Site logo

njnafir / plaid-python Goto Github PK

View Code? Open in Web Editor NEW

This project forked from plaid/plaid-python

0.0 0.0 0.0 2.84 MB

Python bindings for Plaid

Home Page: https://plaid.com/docs

License: MIT License

Python 98.81% Makefile 0.01% Dockerfile 0.01% Mustache 1.19%

plaid-python's Introduction

plaid-python Circle CI PyPI version

The official python client library for the Plaid API, which is generated from our OpenAPI spec. For the last non-generated version of our library, go here.

Table of Contents

Install

This library only supports python3!

$ pip3 install plaid-python

Documentation

The module supports all Plaid API endpoints. For complete information about the API, head to the docs.

Getting Started

Calling Endpoints

To call an endpoint you must create a PlaidApi object.

import plaid
from plaid.api import plaid_api

# Available environments are
# 'Production'
# 'Development'
# 'Sandbox'
configuration = plaid.Configuration(
    host=plaid.Environment.Sandbox,
    api_key={
        'clientId': client_id,
        'secret': secret,
    }
)

api_client = plaid.ApiClient(configuration)
client = plaid_api.PlaidApi(api_client)

Each endpoint returns a dictionary which contains the parsed JSON from the HTTP response.

Versioning

This release only supports the latest Plaid API version, 2020-09-14.

For information about what has changed between versions and how to update your integration, head to the API upgrade guide.

The plaid-python client library is typically updated on a monthly basis. The canonical source for the latest version number is the client library changelog.

Errors

All non-200 responses will throw a plaid.ApiException.

import plaid
from plaid.model.asset_report_get_request import AssetReportGetRequest

try:
    request = AssetReportGetRequest(
        asset_report_token=asset_report_token,
    )
    return client.asset_report_get(request)
except plaid.ApiException as e:
    response = json.loads(e.body)
    # check the code attribute of the error to determine the specific error
    if response['error_code'] == 'ITEM_LOGIN_REQUIRED':
        # the users' login information has changed, generate a public_token
        # for the user and initialize Link in update mode to
        # restore access to this user's data
        # see https://plaid.com/docs/api/#updating-items-via-link
    else:
        ...

For more information on Plaid response codes, head to the docs.

Data type differences from API and from previous versions

Converting the response to a JSON

As this is a common question, we've included this in the README. plaid-python uses models like TransactionsSyncResponse to encapsulate API responses. If you want to convert this to a JSON, do something like this:

import json
...
response = ... # type TransactionsSyncResponse
# to_dict makes it first a python dictionary, and then we turn it into a string JSON.
json_string = json.dumps(response.to_dict())

Dates

Dates and datetimes in requests, which are represented as strings in the API and in previous client library versions, are represented in this version of the Python client library as Python datetime.date or datetime.datetime objects. If you need to convert between dates and strings, you can use the datetime.strptime method. For an example, see the Retrieve Transactions sample code later in this Readme. For more information on the Python's datetime module, see Python's official documentation.

Note that the datetime.strptime method will silently remove time zone information. Time zone information is required for request fields that accept datetimes. Failing to include time zone information (or passing in a string, instead of a datetime.datetime object) will result in an error. See the following examples for guidance on datetime.date and datetime.datetime usage.

If the API reference documentation for a field specifies format: date, either of following are acceptable:

from datetime import date

a = date(2022, 5, 5)
b = date.fromisoformat('2022-05-05')

If the API reference documentation for a field specifies format: date-time, the following is acceptable:

from datetime import datetime

a = datetime(2022, 5, 5, 22, 35, 49, tzinfo=datetime.timezone.utc)

Enums

While the API and previous library versions represent enums using strings, this current library uses Python classes with restricted values.

Old:

'products': ['auth', 'transactions'],
'country_codes': ['US'],

Current:

products=[Products('auth'), Products('transactions')],
country_codes=[CountryCode('US')],

Examples

Create an Item using Link

Exchange a public_token from Plaid Link for a Plaid access token:

import plaid
from plaid.model.item_public_token_exchange_request import ItemPublicTokenExchangeRequest

# the public token is received from Plaid Link
exchange_request = ItemPublicTokenExchangeRequest(
    public_token=pt_response['public_token']
)
exchange_response = client.item_public_token_exchange(exchange_request)
access_token = exchange_response['access_token']

Create a Stripe bank account token

Exchange a Plaid Link public_token for an API access_token. Then exchange that access_token and the Plaid Link account_id (received along with the public_token) for a Stripe bank_account_token:

import plaid
from plaid.model.item_public_token_exchange_request import ItemPublicTokenExchangeRequest
from plaid.model.processor_stripe_bank_account_token_create_request import ProcessorStripeBankAccountTokenCreateRequest

exchange_request = ItemPublicTokenExchangeRequest(
    public_token=pt_response['public_token']
)
exchange_response = client.item_public_token_exchange(exchange_request)
access_token = exchange_response['access_token']

request = ProcessorStripeBankAccountTokenCreateRequest(
    access_token=access_token,
    account_id='[Account ID]',
)
stripe_response = client.processor_stripe_bank_account_token_create(request)
bank_account_token = stripe_response['stripe_bank_account_token']

Remove Item

import plaid
from plaid.model.item_remove_request import ItemRemoveRequest

# Provide the access token for the Item you want to remove
request = ItemRemoveRequest(
    access_token=accessToken
)
response = client.item_remove(request)

Retrieve Transactions (preferred method)

import plaid
from plaid.model.transactions_sync_request import TransactionsSyncRequest

request = TransactionsSyncRequest(
    access_token=access_token,
)
response = client.transactions_sync(request)
transactions = response['added']

# the transactions in the response are paginated, so make multiple calls while incrementing the cursor to
# retrieve all transactions
while (response['has_more']):
    request = TransactionsSyncRequest(
        access_token=access_token,
        cursor=response['next_cursor']
    )
    response = client.transactions_sync(request)
    transactions += response['added']

Retrieve Transactions (older method)

import plaid
from plaid.model.transactions_get_request_options import TransactionsGetRequestOptions
from plaid.model.transactions_get_request import TransactionsGetRequest

request = TransactionsGetRequest(
    access_token=access_token,
    start_date=datetime.strptime('2020-01-01', '%Y-%m-%d').date(),
    end_date=datetime.strptime('2021-01-01', '%Y-%m-%d').date(),
)
response = client.transactions_get(request)
transactions = response['transactions']

# the transactions in the response are paginated, so make multiple calls while increasing the offset to
# retrieve all transactions
while len(transactions) < response['total_transactions']:
    options = TransactionsGetRequestOptions()
    options.offset = len(transactions)

    request = TransactionsGetRequest(
        access_token=access_token,
        start_date=datetime.strptime('2020-01-01', '%Y-%m-%d').date(),
        end_date=datetime.strptime('2021-01-01', '%Y-%m-%d').date(),
        options=options
    )
    response = client.transactions_get(request)

Retrieve Asset Report PDF

from plaid.model.asset_report_pdf_get_request import AssetReportPDFGetRequest

pdf_request = AssetReportPDFGetRequest(asset_report_token=PDF_TOKEN)
pdf = client.asset_report_pdf_get(pdf_request)
FILE = open('asset_report.pdf', 'wb')
FILE.write(pdf.read())
FILE.close()

Authentication

Public endpoints (category information) require no authentication and can be accessed as follows:

categories = client.categories_get({})

Authenticated endpoints require a (client_id, secret) pair. You do not need to pass in authentication to individual endpoints once you have set it on the plaid.Configuration object.

Contributing

Please see Contributing for guidelines and instructions for local development.

License

MIT

plaid-python's People

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.