Metadata-Version: 2.1
Name: Sift
Version: 5.2.0
Summary: Python bindings for Sift Science's API
Home-page: https://siftscience.com
Author: Sift Science
Author-email: support@siftscience.com
Classifier: Programming Language :: Python
Classifier: Programming Language :: Python :: 2.7
Classifier: Programming Language :: Python :: 3
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: License :: OSI Approved :: MIT License
Classifier: Topic :: Software Development :: Libraries :: Python Modules
Requires-Python: >=2.7
Description-Content-Type: text/markdown
Provides-Extra: test
License-File: LICENSE

# Sift Python Bindings

Bindings for Sift's APIs -- including the
[Events](https://sift.com/resources/references/events-api.html),
[Labels](https://sift.com/resources/references/labels-api.html),
and
[Score](https://sift.com/resources/references/score-api.html)
APIs.


## Installation

Set up a virtual environment with virtualenv (otherwise you will need
to make the pip calls as sudo):

    virtualenv venv
    source venv/bin/activate

Get the latest released package from pip:

Python 2:

    pip install Sift

Python 3:

    pip3 install Sift

or install newest source directly from GitHub:

Python 2:

    pip install git+https://github.com/SiftScience/sift-python

Python 3:

    pip3 install git+https://github.com/SiftScience/sift-python


## Documentation

Please see [here](https://sift.com/developers/docs/python/events-api/overview) for the
most up-to-date documentation.

## Changelog

Please see
[the CHANGELOG](https://github.com/SiftScience/sift-python/blob/master/CHANGES.md)
for a history of all changes.

Note, that in v2.0.0, the API semantics were changed to raise an
exception in the case of error to be more pythonic. Client code will
need to be updated to catch `sift.client.ApiException` exceptions.


## Usage

Here's an example:

```python

import json
import sift.client

client = sift.Client(api_key='<your API key here>', account_id='<your account ID here>')

# User ID's may only contain a-z, A-Z, 0-9, =, ., -, _, +, @, :, &, ^, %, !, $
user_id = "23056"

# Track a transaction event -- note this is a blocking call
properties = {
    "$user_id": user_id,
    "$user_email": "buyer@gmail.com",
    "$seller_user_id": "2371",
    "seller_user_email": "seller@gmail.com",
    "$transaction_id": "573050",
    "$payment_method": {
        "$payment_type": "$credit_card",
        "$payment_gateway": "$braintree",
        "$card_bin": "542486",
        "$card_last4": "4444"
    },
    "$currency_code": "USD",
    "$amount": 15230000,
}

try:
    response = client.track("$transaction", properties)
    if response.is_ok():
        print "Successfully tracked event"
except sift.client.ApiException:
    # request failed
    pass

# Request a score for the user with user_id 23056
try:
    response = client.score(user_id)
    s = json.dumps(response.body)
    print s

except sift.client.ApiException:
    # request failed
    pass

try:
    # Label the user with user_id 23056 as Bad with all optional fields
    response = client.label(user_id, {
        "$is_bad": True,
        "$abuse_type": "payment_abuse",
        "$description": "Chargeback issued",
        "$source": "Manual Review",
        "$analyst": "analyst.name@your_domain.com"
    })
except sift.client.ApiException:
    # request failed
    pass

# Remove a label from a user with user_id 23056
try:
    response = client.unlabel(user_id, abuse_type='content_abuse')
except sift.client.ApiException:
    # request failed
    pass

# Get the status of a workflow run
try:
    response = client.get_workflow_status('my_run_id')
except sift.client.ApiException:
    # request failed
    pass

# Get the latest decisions for a user
try:
    response = client.get_user_decisions('example_user')
except sift.client.ApiException:
    # request failed
    pass

# Get the latest decisions for an order
try:
    response = client.get_order_decisions('example_order')
except sift.client.ApiException:
    # request failed
    pass

# Get the latest decisions for a session
try:
    response = client.get_session_decisions('example_user', 'example_session')
except sift.client.ApiException:
    # request failed
    pass

# Get the latest decisions for a piece of content
try:
    response = client.get_content_decisions('example_user', 'example_content')
except sift.client.ApiException:
    # request failed
    pass
```


## Testing

Before submitting a change, make sure the following commands run without
errors from the root dir of the repository:

    python -m unittest discover
    python3 -m unittest discover


5.2.0 2022-11-07
- Update  PSP Merchant Management API

5.1.0 2022-06-22
- Added return_route_info query parameter 
- Fixed decimal amount json serialization bug 

5.0.2 2022-01-24
- Fix usage of urllib for Python 2.7

5.0.1 2019-03-07
- Update metadata in setup.py

5.0.0 2019-01-08
================
- Add connection pooling

INCOMPATIBLE CHANGES INTRODUCED IN 5.0.0:

- Removed support for Python 2.6

- Fix url encoding for all endpoints

  Previously, encoding user ids in URLs was inconsistent between endpoints, encoded for some
  endpoints, unencoded for others. Additionally, when encoded in the URL path, forward slashes
  weren't encoded. Callers with workarounds for this bug must remove these workarounds when
  upgrading to 5.0.0.

- Improved error handling

  Previously, illegal arguments passed to methods like `Client.track()` and failed calls resulting
  from server-side errors both raised `ApiExceptions`. Illegal arguments validated in the client
  now raise either `TypeErrors` or `ValueErrors`. Server-side errors still raise `ApiExceptions`,
  and `ApiException` has been augmented with metadata for handling the error.

4.3.0.0 2018-07-31
==================
-   Add support for rescore_user and get_user_score APIs

4.2.0.0 2018-07-05
==================
-   Add new query parameter force_workflow_run

4.1.0.0 2018-06-01
==================

-   Add get session level decisions in Get Decisions APIs.

4.0.1 2018-04-06
==================

- Updated documentation in CHANGES.md and README.md

4.0.0.0 2018-03-30
==================

- Adds support for Sift Science API Version 205, including new [`$create_content`](https://siftscience.com/developers/docs/curl/events-api/reserved-events/create-content) and [`$update_content`](https://siftscience.com/developers/docs/curl/events-api/reserved-events/update-content) formats
- V205 APIs are now called -- **this is an incompatible change**
   - Use `version = '204'` when constructing the Client to call the previous API version
- Adds support for content decisions to [Decisions API](https://siftscience.com/developers/docs/curl/decisions-api)


INCOMPATIBLE CHANGES INTRODUCED IN API V205:
- `$create_content` and `$update_content` have significantly changed, and the old format will be rejected
- `$send_message` and `$submit_review` events are no longer valid
- V205 improves server-side event data validation. In V204 and earlier, server-side validation accepted some events that did not conform to the published APIs in our [developer documentation](https://siftscience.com/developers/docs/curl/events-api). V205 does not modify existing event APIs other than those mentioned above, but may reject invalid event data that were previously accepted. **Please test your integration on V205 in sandbox before using in production.**

3.2.0.0 2018-02-12
==================

-   Add session level decisions in Apply Decisions APIs.
-   Add support for filtering get decisions by entity type session.

3.1.0.0 2017-01-17
==================

-   Adds support for Get, Apply Decisions APIs

3.0.0.0 2016-07-19
==================

-   Adds support for v204 of Sift Science's APIs
-   Adds Workflow Status API, User Decisions API, Order Decisions API
-   V204 APIs are now called by default -- this is an incompatible change
    (use version='203' to call the previous API version)

2.0.1.0 (2016-07-07)
====================

-   Fixes bug parsing chunked HTTP responses

2.0.0.0 (2016-06-21)
====================

-   Major version bump; client APIs have changed to raise exceptions
    in the case of API errors to be more Pythonic

1.1.2.1 (2015-05-18)
====================

-   Added Python 2.6 compatibility
-   Added Travis CI
-   Minor bug fixes

1.1.2.0 (2015-02-04)
====================

-   Added Unlabel functionaly
-   Minor bug fixes.

1.1.1.0 (2014-09-3)
===================

-   Added timeout parameter to track, score, and label functions.

1.1.0.0 (2014-08-25)
====================

-   Added Module-scoped API key.
-   Minor documentation updates.

0.2.0 (2014-08-20)
==================

-   Added Label and Score functions.
-   Added Python 3 compatibility.

0.1.1 (2014-02-21)
==================

-   Bump default API version to v203.

0.1.0 (2013-01-08)
==================

-   Just the Python REST client itself.
