Skip to main content

Python client for the Dime Payments API

Project description

Dime Payments Python SDK

A typed Python client for the Dime Payments API. Works with Python 3.10+ on any platform.

from dime_payments import Client

dime = Client('your-api-token')

txn = dime.transactions.charge_card('000010', {
    'amount': '49.99',
    'token': 'tok_abc123',
})

print(txn.transaction_status)  # "Success"

Requirements

  • Python 3.10+
  • A Dime API token (a Laravel Sanctum personal access token). Tokens are minted inside the Dime application, not via this SDK, and carry abilities (e.g. transaction:charge-card-token, customer:read) that gate which calls succeed.

Installation

pip install dime-python-sdk

Configuration

The simplest setup needs only a token:

dime = Client('your-api-token')

Point it at another environment, or use Config for full control:

from dime_payments import Client, Config

# Staging environment
dime = Client('your-api-token', 'https://staging.dimepayments.com')

# Full control
dime = Client(Config(
    token='your-api-token',
    base_url='https://app.dimepayments.com',
    timeout=30.0,       # seconds
    max_retries=2,      # retries 429 / 5xx / network errors with backoff
    retry_base_delay=0.5,
))

The SDK sends Authorization: Bearer <token> and JSON headers on every request. Transient failures (HTTP 429 and 5xx, network errors) are retried with exponential backoff, honoring the Retry-After header when present.

Resources

Every resource hangs off the client as a property. The merchant sid is always passed explicitly; remaining fields go in an attributes or filters dict. All amounts are returned as strings to avoid float rounding.

Property Endpoints
dime.transactions charge_card, charge_ach, tokenize_card, refund, void, show, list
dime.customers list, show, create, update, delete
dime.payment_methods list, show, create, update, delete
dime.merchants list, show, create, update, get_form_link
dime.addresses list, show, create, update, delete
dime.deposits list, list_with_transactions, show
dime.recurring_payments list, show, create, edit, pause, cancel, activate, delete

Transactions

# Charge a stored token
txn = dime.transactions.charge_card('000010', {
    'amount': '100.00',
    'token': 'tok_abc123',
    'email': 'customer@example.com',
})

# Charge raw card details (merchant must be PCI compliant)
txn = dime.transactions.charge_card('000010', {
    'amount': '100.00',
    'cardholder_name': 'John Doe',
    'card_number': '4111111111111111',
    'expiration_date': '01/2027',
    'cvv': '123',
})

# ACH
txn = dime.transactions.charge_ach('000010', {
    'routing_number': '123456789',
    'account_number': '9876543210',
    'account_type': 'Checking',
    'account_name': 'John Doe',
    'amount': '75.00',
})

# Tokenize without charging
result = dime.transactions.tokenize_card('000010', {
    'cardholder_name': 'John Doe',
    'card_number': '4111111111111111',
    'expiration_date': '01/2027',
})
print(result.token)

# Refund / void
dime.transactions.refund('000010', {'amount': '25.00', 'transaction_info_id': 123456})
dime.transactions.void('000010', 'CC', 123456)

# Read
txn = dime.transactions.show('000010', {'transaction_info_id': 123456})

Customers, payment methods, addresses

customer = dime.customers.create('000010', {
    'first_name': 'Jane',
    'last_name': 'Doe',
    'email': 'jane@example.com',
})

pm = dime.payment_methods.create('000010', {
    'uuid': customer.uuid,
    'type': 'cc',
    'cc_name_on_card': 'Jane Doe',
    'cc_number': '4111111111111111',
    'cc_expiration_date': '01/2027',
    'cc_brand': 'Visa',
    'default': True,
})

address = dime.addresses.create('000010', customer.uuid, {
    'recipient': 'Jane Doe',
    'line_one': '123 Main St',
    'city': 'Atlanta',
    'state': 'GA',
    'zip': '30301',
})

Recurring payments

rp = dime.recurring_payments.create('000010', {
    'name': 'Monthly donation',
    'amount': '25.00',
    'start_date': '2026-07-01 00:00:00',
    'recurrence_schedule': 'Monthly',
    'payment_method': pm.id,
    'customer_uuid': customer.uuid,
})

dime.recurring_payments.pause('000010', rp.id, '2026-09-01 00:00:00')
dime.recurring_payments.activate('000010', rp.id)
dime.recurring_payments.cancel('000010', rp.id)

Pagination

List endpoints return a CursorPage. Iterate one page, walk pages manually, or stream every item across all pages with auto_paging():

page = dime.transactions.list('000010', {
    'start_date': '2026-01-01 00:00:00',
    'end_date': '2026-01-31 23:59:59',
})

# First page only
for txn in page:
    print(txn.amount)

# Next page manually
if page.has_more():
    next_page = page.next()

# Every transaction across every page (fetches lazily)
for txn in page.auto_paging():
    print(txn.transaction_number)

Error handling

Every failure raises a DimeException subclass. Catch the base type, or a specific one:

from dime_payments import (
    DimeException,
    ValidationException,
    RateLimitException,
)
import time

try:
    dime.transactions.charge_card('000010', {'amount': '0'})
except ValidationException as e:
    e.get_errors()   # {'data.amount': ['must be greater than 0']}
    e.first_error()
except RateLimitException as e:
    wait = e.get_retry_after() or 1
    time.sleep(wait)
except DimeException as e:
    e.get_status_code()    # HTTP status
    e.get_response_body()  # decoded API body
Exception When
ValidationException HTTP 400/422 with field errors
AuthenticationException HTTP 401 (missing/invalid token)
PermissionDeniedException HTTP 403 (belongs-to-company guard)
NotFoundException HTTP 404
RateLimitException HTTP 429 (carries Retry-After)
ServerException HTTP 5xx
ConnectionException No HTTP response (DNS, timeout, network error)
ApiException Any other non-2xx

Notes

  • GET requests carry a JSON body. The Dime API expects read parameters in the request body even for GET endpoints; the SDK handles this transparently.
  • No API versioning. Endpoints live under /api with no version prefix.

Development

python3.12 -m venv .venv
source .venv/bin/activate
pip install -e ".[dev]"
pytest                  # run tests

License

MIT. See LICENSE.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dime_python_sdk-1.0.0.tar.gz (16.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dime_python_sdk-1.0.0-py3-none-any.whl (28.2 kB view details)

Uploaded Python 3

File details

Details for the file dime_python_sdk-1.0.0.tar.gz.

File metadata

  • Download URL: dime_python_sdk-1.0.0.tar.gz
  • Upload date:
  • Size: 16.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.7

File hashes

Hashes for dime_python_sdk-1.0.0.tar.gz
Algorithm Hash digest
SHA256 f6ec102e3fb05389a73ef13224c6b89a0433a85550359b8b17508799341f4cf7
MD5 d766e95a14a7dea40bebe9caa9ef8277
BLAKE2b-256 270efbe4a15d5687c5b746dea1aeb894dfe452a935f22c858894181aca921a5a

See more details on using hashes here.

File details

Details for the file dime_python_sdk-1.0.0-py3-none-any.whl.

File metadata

File hashes

Hashes for dime_python_sdk-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 53e0b0649603e26f8b60bdcfffeaca1457a051017e932a0ee8b2e71e34a32eb4
MD5 74b9eeb9327291a8d0ba3431ca6afbf2
BLAKE2b-256 e3034bdbf3ff3940e77f637f371d7987ef08abdfb2d2758c9fd6177295e5cd01

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page