Metadata-Version: 2.1
Name: prosper-api
Version: 0.9.2
Summary: Python trading library for Prosper.com
Home-page: https://github.com/grahamtt/prosper-api
License: Apache-2.0
Author: Graham Tibbitts
Author-email: graham.tibbitts@gmail.com
Requires-Python: >=3.9,<4.0
Classifier: License :: OSI Approved :: Apache Software License
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3 :: Only
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.8
Classifier: Topic :: Office/Business :: Financial :: Investment
Provides-Extra: secure
Requires-Dist: backoff (>=2.2.1,<3.0.0)
Requires-Dist: dpath (>=2.1.6,<3.0.0)
Requires-Dist: keyring (>=24.2.0,<25.0.0) ; extra == "secure"
Requires-Dist: prosper-shared (>=0.2.9,<0.3.0)
Requires-Dist: pydantic (>=2.7.4,<3.0.0)
Requires-Dist: ratelimit (>=2.2.1,<3.0.0)
Requires-Dist: requests (>=2.31.0,<3.0.0)
Requires-Dist: schema (>=0.7.5,<0.8.0)
Requires-Dist: simplejson (>=3.19.2,<4.0.0)
Project-URL: Repository, https://github.com/grahamtt/prosper-api
Description-Content-Type: text/markdown

# Prosper API client for Python

Python trading library for Prosper.com

[![GitHub Workflow Status (with event)](https://img.shields.io/github/actions/workflow/status/grahamtt/prosper-api/build-and-release.yml?logo=github)](https://github.com/grahamtt/prosper-api)
[![PyPI - Version](https://img.shields.io/pypi/v/prosper-api?label=prosper-api)](https://pypi.org/project/prosper-api/)
![PyPI - Python Version](https://img.shields.io/pypi/pyversions/prosper-api)
![PyPI - License](https://img.shields.io/pypi/l/prosper-api)
[![Code Climate coverage](https://img.shields.io/codeclimate/coverage/grahamtt/prosper-api?logo=codeclimate)](https://codeclimate.com/github/grahamtt/prosper-api)
[![Code Climate maintainability](https://img.shields.io/codeclimate/maintainability-percentage/grahamtt/prosper-api?logo=codeclimate)](https://codeclimate.com/github/grahamtt/prosper-api)
[![OpenSSF Best Practices](https://www.bestpractices.dev/projects/8063/badge)](https://www.bestpractices.dev/projects/8063)
![GitHub commit activity (branch)](https://img.shields.io/github/commit-activity/m/grahamtt/prosper-api?logo=github)
![GitHub issues](https://img.shields.io/github/issues-raw/grahamtt/prosper-api?logo=github)

## Installation

### With Pip

```bash
pip install prosper-api
```

#### Optional `keyring` support

```bash
pip install 'prosper-api[secure]'
```

### With Poetry

```bash
poetry add prosper-api
```

#### Optional `keyring` support

```bash
poetry add 'prosper-api[secure]'
```

## Setup

> ℹ️ The library currently only supports personal use, where the client id and credentials are from the same account. Support
> for multi-account mode is [planned](https://github.com/grahamtt/prosper-api/issues/3).

### Config file location

- Linux/Unix: `$HOME/.config/prosper-api/config.toml`
- Windows: `%HOMEDIR%%HOMEPATH\AppData\Local\prosper-api\prosper-api\config.toml`
- MacOs: `$HOME/Library/Application Support/prosper-api/config.toml`

### Default

Create a config file with the following contents:

```toml
[credentials]
client-id = "0123456789abcdef0123456789abcdef"
client-secret = "fedcba9876543210fedcba9876543210"
username = "PROBABLY_YOUR_EMAIL_ADDRESS"
password = "AWESOME_PASSWORD"
```

### More secure

> ℹ️ You must have installed `keyring` or used the '\[secure\]' mode when installing the library.

Remove the `client-secret` and `password` portions of the config:

```toml
[credentials]
client-id = "0123456789abcdef0123456789abcdef"
username = "PROBABLY_YOUR_EMAIL_ADDRESS"
```

Run the following to store your credentials securely in your OS credentials storage, e.g. Keychain for MacOS, etc.
For each command, you will be prompted to enter the corresponding secret. For 'CLIENT_ID', enter the client secret. For
'USERNAME' enter the corresponding password.

```bash
keyring set prosper-api '{CLIENT_ID}'
keyring set prosper-api '{USERNAME}'
```

## Use

See [a sample bot](https://github.com/grahamtt/prosper-auto-invest) for concrete usage.

### Get account details

The following will get the details of your account, including available cash and investment allocations.

```python
from prosper_api.client import Client
from prosper_api.models import Account

client = Client()
account: Account = client.get_account_info()
```

### Search listings

The following will get all the current listings you haven't invested in.

```python
from prosper_api.client import Client
from prosper_api.models import Listing, SearchListingsRequest, SearchListingsResponse
from typing import List

PAGE_SIZE=25
client = Client()
listings: List[Listing] = []
offset = 0
while True:
    result: SearchListingsResponse = client.search_listings(SearchListingsRequest(invested=False, biddable=True, limit=PAGE_SIZE, offset=offset))
    listings += result.result
    offset += PAGE_SIZE
    if len(listings) >= result.total_count or len(result.result) < PAGE_SIZE:
        break
```

> ℹ️ The full set of filters listed in the [Prosper API docs](https://developers.prosper.com/docs/investor/listings-api/)
> are available

### Place order

The following will place an order, given a listing id.

```python
from prosper_api.client import Client
from prosper_api.models import Order

client = Client()
listing_id: int = 12341234
order_dollar_amount: float = 25
order_result: Order = client.order(listing_id, order_dollar_amount)
```

### List notes

The following will list all the notes in your account. The same pattern can be used to list orders, loans, and payments.

```python
from prosper_api.client import Client
from prosper_api.models import Note, ListNotesRequest, ListNotesResponse
from typing import List

client = Client()
notes: List[Note] = []
PAGE_SIZE = 25
offset = 0
while True:
    result: ListNotesResponse = client.list_notes(ListNotesRequest(limit=PAGE_SIZE, offset=offset, sort_by="age_in_months", sort_dir="asc"))
    notes += result.result
    offset += PAGE_SIZE
    if len(notes) >= result.total_count or len(result.result) < PAGE_SIZE:
        break
```

## Configuration

Available config values:

```yaml
prosper-api.auth.token-cache:
  default: /home/graham/.cache/prosper-api/token-cache
  description: The filesystem location where the auth token will be cached.
  optional: false
  type: str
prosper-api.credentials.client-id:
  constraint: ^[a-f0-9]{32}$
  description: The client-id from Prosper.
  optional: false
  type: str
prosper-api.credentials.client-secret:
  constraint: ^[a-f0-9]{32}$
  description: The client-secret from Prosper; can be stored and accessed securely using the keyring
    library.
  optional: true
  type: str
prosper-api.credentials.password:
  description: Your Prosper password; can be stored and accessed securely using the keyring library.
  optional: true
  type: str
prosper-api.credentials.username:
  description: Your Prosper username
  optional: false
  type: str
prosper-shared.serde.parse-dates:
  default: true
  description: Date values represented as strings should be parsed into `date` and `datetime` objects.
    Supports ISO-8601-compliant date strings.
  optional: false
  type: bool
prosper-shared.serde.parse-enums:
  default: true
  description: Enum values represented as strings should be parsed into their respective types.
  optional: false
  type: bool
prosper-shared.serde.use-decimals:
  default: true
  description: Floating point values should be parsed as decimals instead of floats.
  optional: false
  type: bool
```

## Feedback

This project uses [GitHub issues](https://github.com/grahamtt/prosper-api/issues) for feature requests and bug reports.

## Contributing

This project uses [Poetry](https://python-poetry.org/docs/) to manage dependencies and building. Follow the instructions
to install it. Then use `poetry install --all-extras` to install the project dependencies. Then run `poetry run autohooks activate`
to set up the pre-commit hooks. Please ensure the hooks pass before submitting a pull request.

