Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
292317d
chore: configure new SDK language
stainless-app[bot] Jan 29, 2026
a799eec
chore: Enable stainless MCP in config
stainless-app[bot] Jan 29, 2026
5658dcc
feat(client): add custom JSON encoder for extended type support
stainless-app[bot] Jan 29, 2026
a7135fb
feat(api): Add naics_code to account holder requests/responses
stainless-app[bot] Jan 30, 2026
7d111f8
docs: Fix documentation of tokenization channel and tokenization sour…
stainless-app[bot] Feb 3, 2026
bd365bf
codegen metadata
stainless-app[bot] Feb 4, 2026
67243a9
chore(internal): bump dependencies
stainless-app[bot] Feb 9, 2026
aea1658
feat(api): Add /v2/auth_rules/results endpoint for listing rule evalu…
stainless-app[bot] Feb 10, 2026
e50dd4d
fix(api): Update /v2/auth_rules/results endpoint parameter naming and…
stainless-app[bot] Feb 10, 2026
ced5f0d
feat(api): Add result schemas for Authorization and Authentication (3…
stainless-app[bot] Feb 11, 2026
73de2f2
chore(internal): fix lint error on Python 3.14
stainless-app[bot] Feb 11, 2026
994647d
codegen metadata
stainless-app[bot] Feb 12, 2026
ede8a8a
feat(api): Add PENDING_REVIEW status to KYB enrollment simulation
stainless-app[bot] Feb 12, 2026
f428d56
chore: format all `api.md` files
stainless-app[bot] Feb 12, 2026
51d053e
feat(api): Add hold token field to book transfers
stainless-app[bot] Feb 12, 2026
a3a74ea
feat(api): Add network specific wallet recommendation reasons
stainless-app[bot] Feb 13, 2026
d65ed36
feat(api): Add amounts object to ASA request
stainless-app[bot] Feb 13, 2026
6012440
release: 0.115.0
stainless-app[bot] Feb 13, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "0.114.0"
".": "0.115.0"
}
8 changes: 4 additions & 4 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 175
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic%2Flithic-ce2adff9b644ed4562b5342a4a43d0b40c98d43b4e063b4626f4ca5d342f1b92.yml
openapi_spec_hash: fbc84b866ce96457261ac58b4e75c71d
config_hash: 31d71922d7838f34ae0875c9b8026d99
configured_endpoints: 176
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/lithic%2Flithic-c24eebe942f400bff8922a6fbef1ce551ad14f61eb4da21b50d823a62ca42586.yml
openapi_spec_hash: b79ed927e625dedff69cea29131a34d9
config_hash: 693dddc4721eef512d75ab6c60897794
34 changes: 34 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,39 @@
# Changelog

## 0.115.0 (2026-02-13)

Full Changelog: [v0.114.0...v0.115.0](https://github.com/lithic-com/lithic-python/compare/v0.114.0...v0.115.0)

### Features

* **api:** Add /v2/auth_rules/results endpoint for listing rule evaluation data ([aea1658](https://github.com/lithic-com/lithic-python/commit/aea1658f300aeb41d859c9bb7271d883f3b4a2c3))
* **api:** Add amounts object to ASA request ([d65ed36](https://github.com/lithic-com/lithic-python/commit/d65ed36a3ec9b52ffde11768ac705be37678f1e2))
* **api:** Add hold token field to book transfers ([51d053e](https://github.com/lithic-com/lithic-python/commit/51d053eb788f43396d71c14acfd6dd80e8fefe77))
* **api:** Add naics_code to account holder requests/responses ([a7135fb](https://github.com/lithic-com/lithic-python/commit/a7135fb5f63687973cc1856731eb6c7f524994e3))
* **api:** Add network specific wallet recommendation reasons ([a3a74ea](https://github.com/lithic-com/lithic-python/commit/a3a74ea5a051037b1585369cfcdfaccdc54a1d29))
* **api:** Add PENDING_REVIEW status to KYB enrollment simulation ([ede8a8a](https://github.com/lithic-com/lithic-python/commit/ede8a8ac24af85f8dd21178007af35f7b35aa133))
* **api:** Add result schemas for Authorization and Authentication (3DS) actions ([ced5f0d](https://github.com/lithic-com/lithic-python/commit/ced5f0db1ae27e02bde4402cfff8ef4a9e33ce1a))
* **client:** add custom JSON encoder for extended type support ([5658dcc](https://github.com/lithic-com/lithic-python/commit/5658dccf4d989063d2d4ffdb243cfec17861a000))


### Bug Fixes

* **api:** Update /v2/auth_rules/results endpoint parameter naming and action types ([e50dd4d](https://github.com/lithic-com/lithic-python/commit/e50dd4d8a866a47d77c0e92c6e0703053c54f403))


### Chores

* configure new SDK language ([292317d](https://github.com/lithic-com/lithic-python/commit/292317d003f007992d8848fbe4a870164bac9d29))
* Enable stainless MCP in config ([a799eec](https://github.com/lithic-com/lithic-python/commit/a799eeca71933e98243cf351caf374b9a59d9ce9))
* format all `api.md` files ([f428d56](https://github.com/lithic-com/lithic-python/commit/f428d56ec1200a79ea23658daf01771dc8b198c7))
* **internal:** bump dependencies ([67243a9](https://github.com/lithic-com/lithic-python/commit/67243a9d839bb33d4b53a7a7b8cc02678d068f66))
* **internal:** fix lint error on Python 3.14 ([73de2f2](https://github.com/lithic-com/lithic-python/commit/73de2f20082fecd5e07af008ff79b161c2b4378d))


### Documentation

* Fix documentation of tokenization channel and tokenization source for tokenization rules ([7d111f8](https://github.com/lithic-com/lithic-python/commit/7d111f8f8ee283412f9846f239ff626a410a2a24))

## 0.114.0 (2026-01-27)

Full Changelog: [v0.113.0...v0.114.0](https://github.com/lithic-com/lithic-python/compare/v0.113.0...v0.114.0)
Expand Down
9 changes: 9 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,15 @@ The Lithic Python library provides convenient access to the Lithic REST API from
application. The library includes type definitions for all request params and response fields,
and offers both synchronous and asynchronous clients powered by [httpx](https://github.com/encode/httpx).

## MCP Server

Use the Lithic MCP Server to enable AI assistants to interact with this API, allowing them to explore endpoints, make test requests, and use documentation to help integrate this SDK into your application.

[![Add to Cursor](https://cursor.com/deeplink/mcp-install-dark.svg)](https://cursor.com/en-US/install-mcp?name=lithic-mcp&config=eyJuYW1lIjoibGl0aGljLW1jcCIsInRyYW5zcG9ydCI6Imh0dHAiLCJ1cmwiOiJodHRwczovL2xpdGhpYy5zdGxtY3AuY29tIiwiaGVhZGVycyI6eyJ4LWxpdGhpYy1hcGkta2V5IjoiTXkgTGl0aGljIEFQSSBLZXkifX0)
[![Install in VS Code](https://img.shields.io/badge/_-Add_to_VS_Code-blue?style=for-the-badge&logo=data:image/svg%2bxml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCA0MCA0MCI+PHBhdGggZmlsbD0iI0VFRSIgZmlsbC1ydWxlPSJldmVub2RkIiBkPSJNMzAuMjM1IDM5Ljg4NGEyLjQ5MSAyLjQ5MSAwIDAgMS0xLjc4MS0uNzNMMTIuNyAyNC43OGwtMy40NiAyLjYyNC0zLjQwNiAyLjU4MmExLjY2NSAxLjY2NSAwIDAgMS0xLjA4Mi4zMzggMS42NjQgMS42NjQgMCAwIDEtMS4wNDYtLjQzMWwtMi4yLTJhMS42NjYgMS42NjYgMCAwIDEgMC0yLjQ2M0w3LjQ1OCAyMCA0LjY3IDE3LjQ1MyAxLjUwNyAxNC41N2ExLjY2NSAxLjY2NSAwIDAgMSAwLTIuNDYzbDIuMi0yYTEuNjY1IDEuNjY1IDAgMCAxIDIuMTMtLjA5N2w2Ljg2MyA1LjIwOUwyOC40NTIuODQ0YTIuNDg4IDIuNDg4IDAgMCAxIDEuODQxLS43MjljLjM1MS4wMDkuNjk5LjA5MSAxLjAxOS4yNDVsOC4yMzYgMy45NjFhMi41IDIuNSAwIDAgMSAxLjQxNSAyLjI1M3YuMDk5LS4wNDVWMzMuMzd2LS4wNDUuMDk1YTIuNTAxIDIuNTAxIDAgMCAxLTEuNDE2IDIuMjU3bC04LjIzNSAzLjk2MWEyLjQ5MiAyLjQ5MiAwIDAgMS0xLjA3Ny4yNDZabS43MTYtMjguOTQ3LTExLjk0OCA5LjA2MiAxMS45NTIgOS4wNjUtLjAwNC0xOC4xMjdaIi8+PC9zdmc+)](https://vscode.stainless.com/mcp/%7B%22name%22%3A%22lithic-mcp%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Flithic.stlmcp.com%22%2C%22headers%22%3A%7B%22x-lithic-api-key%22%3A%22My%20Lithic%20API%20Key%22%7D%7D)

> Note: You may need to set environment variables in your MCP client.

## Documentation

The REST API documentation can be found on [docs.lithic.com](https://docs.lithic.com). The full API of this library can be found in [api.md](api.md).
Expand Down
2 changes: 2 additions & 0 deletions api.md
Original file line number Diff line number Diff line change
Expand Up @@ -96,6 +96,7 @@ from lithic.types.auth_rules import (
RuleStats,
VelocityLimitParams,
VelocityLimitPeriod,
V2ListResultsResponse,
V2RetrieveFeaturesResponse,
V2RetrieveReportResponse,
)
Expand All @@ -109,6 +110,7 @@ Methods:
- <code title="get /v2/auth_rules">client.auth_rules.v2.<a href="./src/lithic/resources/auth_rules/v2/v2.py">list</a>(\*\*<a href="src/lithic/types/auth_rules/v2_list_params.py">params</a>) -> <a href="./src/lithic/types/auth_rules/auth_rule.py">SyncCursorPage[AuthRule]</a></code>
- <code title="delete /v2/auth_rules/{auth_rule_token}">client.auth_rules.v2.<a href="./src/lithic/resources/auth_rules/v2/v2.py">delete</a>(auth_rule_token) -> None</code>
- <code title="post /v2/auth_rules/{auth_rule_token}/draft">client.auth_rules.v2.<a href="./src/lithic/resources/auth_rules/v2/v2.py">draft</a>(auth_rule_token, \*\*<a href="src/lithic/types/auth_rules/v2_draft_params.py">params</a>) -> <a href="./src/lithic/types/auth_rules/auth_rule.py">AuthRule</a></code>
- <code title="get /v2/auth_rules/results">client.auth_rules.v2.<a href="./src/lithic/resources/auth_rules/v2/v2.py">list_results</a>(\*\*<a href="src/lithic/types/auth_rules/v2_list_results_params.py">params</a>) -> <a href="./src/lithic/types/auth_rules/v2_list_results_response.py">SyncCursorPage[V2ListResultsResponse]</a></code>
- <code title="post /v2/auth_rules/{auth_rule_token}/promote">client.auth_rules.v2.<a href="./src/lithic/resources/auth_rules/v2/v2.py">promote</a>(auth_rule_token) -> <a href="./src/lithic/types/auth_rules/auth_rule.py">AuthRule</a></code>
- <code title="get /v2/auth_rules/{auth_rule_token}/features">client.auth_rules.v2.<a href="./src/lithic/resources/auth_rules/v2/v2.py">retrieve_features</a>(auth_rule_token, \*\*<a href="src/lithic/types/auth_rules/v2_retrieve_features_params.py">params</a>) -> <a href="./src/lithic/types/auth_rules/v2_retrieve_features_response.py">V2RetrieveFeaturesResponse</a></code>
- <code title="get /v2/auth_rules/{auth_rule_token}/report">client.auth_rules.v2.<a href="./src/lithic/resources/auth_rules/v2/v2.py">retrieve_report</a>(auth_rule_token, \*\*<a href="src/lithic/types/auth_rules/v2_retrieve_report_params.py">params</a>) -> <a href="./src/lithic/types/auth_rules/v2_retrieve_report_response.py">V2RetrieveReportResponse</a></code>
Expand Down
4 changes: 2 additions & 2 deletions pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "lithic"
version = "0.114.0"
version = "0.115.0"
description = "The official Python library for the lithic API"
dynamic = ["readme"]
license = "Apache-2.0"
Expand Down Expand Up @@ -71,7 +71,7 @@ format = { chain = [
# run formatting again to fix any inconsistencies when imports are stripped
"format:ruff",
]}
"format:docs" = "python scripts/utils/ruffen-docs.py README.md api.md"
"format:docs" = "bash -c 'python scripts/utils/ruffen-docs.py README.md $(find . -type f -name api.md)'"
"format:ruff" = "ruff format"

"lint" = { chain = [
Expand Down
20 changes: 10 additions & 10 deletions requirements-dev.lock
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@
-e file:.
aiohappyeyeballs==2.6.1
# via aiohttp
aiohttp==3.13.2
aiohttp==3.13.3
# via httpx-aiohttp
# via lithic
aiosignal==1.4.0
# via aiohttp
annotated-types==0.7.0
# via pydantic
anyio==4.12.0
anyio==4.12.1
# via httpx
# via lithic
argcomplete==3.6.3
Expand All @@ -32,7 +32,7 @@ attrs==25.4.0
# via standardwebhooks
backports-asyncio-runner==1.2.0
# via pytest-asyncio
certifi==2025.11.12
certifi==2026.1.4
# via httpcore
# via httpx
colorlog==6.10.1
Expand Down Expand Up @@ -65,15 +65,15 @@ httpx==0.28.1
# via lithic
# via respx
# via standardwebhooks
httpx-aiohttp==0.1.9
httpx-aiohttp==0.1.12
# via lithic
humanize==4.13.0
# via nox
idna==3.11
# via anyio
# via httpx
# via yarl
importlib-metadata==8.7.0
importlib-metadata==8.7.1
iniconfig==2.1.0
# via pytest
markdown-it-py==3.0.0
Expand All @@ -86,14 +86,14 @@ multidict==6.7.0
mypy==1.17.0
mypy-extensions==1.1.0
# via mypy
nodeenv==1.9.1
nodeenv==1.10.0
# via pyright
nox==2025.11.12
packaging==25.0
# via dependency-groups
# via nox
# via pytest
pathspec==0.12.1
pathspec==1.0.3
# via mypy
platformdirs==4.4.0
# via virtualenv
Expand All @@ -120,15 +120,15 @@ python-dateutil==2.9.0.post0
# via time-machine
respx==0.22.0
rich==14.2.0
ruff==0.14.7
ruff==0.14.13
six==1.17.0
# via python-dateutil
sniffio==1.3.1
# via lithic
standardwebhooks==1.0.0
# via lithic
time-machine==2.19.0
tomli==2.3.0
tomli==2.4.0
# via dependency-groups
# via mypy
# via nox
Expand All @@ -152,7 +152,7 @@ typing-extensions==4.15.0
# via virtualenv
typing-inspection==0.4.2
# via pydantic
virtualenv==20.35.4
virtualenv==20.36.1
# via nox
wrapt==2.0.1
# via deprecated
Expand Down
8 changes: 4 additions & 4 deletions requirements.lock
Original file line number Diff line number Diff line change
Expand Up @@ -12,22 +12,22 @@
-e file:.
aiohappyeyeballs==2.6.1
# via aiohttp
aiohttp==3.13.2
aiohttp==3.13.3
# via httpx-aiohttp
# via lithic
aiosignal==1.4.0
# via aiohttp
annotated-types==0.7.0
# via pydantic
anyio==4.12.0
anyio==4.12.1
# via httpx
# via lithic
async-timeout==5.0.1
# via aiohttp
attrs==25.4.0
# via aiohttp
# via standardwebhooks
certifi==2025.11.12
certifi==2026.1.4
# via httpcore
# via httpx
deprecated==1.3.1
Expand All @@ -47,7 +47,7 @@ httpx==0.28.1
# via httpx-aiohttp
# via lithic
# via standardwebhooks
httpx-aiohttp==0.1.9
httpx-aiohttp==0.1.12
# via lithic
idna==3.11
# via anyio
Expand Down
7 changes: 5 additions & 2 deletions src/lithic/_base_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,6 +86,7 @@
APIConnectionError,
APIResponseValidationError,
)
from ._utils._json import openapi_dumps
from ._legacy_response import LegacyAPIResponse

log: logging.Logger = logging.getLogger(__name__)
Expand Down Expand Up @@ -555,8 +556,10 @@ def _build_request(
kwargs["content"] = options.content
elif isinstance(json_data, bytes):
kwargs["content"] = json_data
else:
kwargs["json"] = json_data if is_given(json_data) else None
elif not files:
# Don't set content when JSON is sent as multipart/form-data,
# since httpx's content param overrides other body arguments
kwargs["content"] = openapi_dumps(json_data) if is_given(json_data) and json_data is not None else None
kwargs["files"] = files
else:
headers.pop("Content-Type", None)
Expand Down
6 changes: 3 additions & 3 deletions src/lithic/_compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,7 @@ def model_dump(
exclude_defaults: bool = False,
warnings: bool = True,
mode: Literal["json", "python"] = "python",
by_alias: bool | None = None,
) -> dict[str, Any]:
if (not PYDANTIC_V1) or hasattr(model, "model_dump"):
return model.model_dump(
Expand All @@ -148,13 +149,12 @@ def model_dump(
exclude_defaults=exclude_defaults,
# warnings are not supported in Pydantic v1
warnings=True if PYDANTIC_V1 else warnings,
by_alias=by_alias,
)
return cast(
"dict[str, Any]",
model.dict( # pyright: ignore[reportDeprecated, reportUnnecessaryCast]
exclude=exclude,
exclude_unset=exclude_unset,
exclude_defaults=exclude_defaults,
exclude=exclude, exclude_unset=exclude_unset, exclude_defaults=exclude_defaults, by_alias=bool(by_alias)
),
)

Expand Down
2 changes: 1 addition & 1 deletion src/lithic/_utils/_compat.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ def is_union(tp: Optional[Type[Any]]) -> bool:
else:
import types

return tp is Union or tp is types.UnionType
return tp is Union or tp is types.UnionType # type: ignore[comparison-overlap]


def is_typeddict(tp: Type[Any]) -> bool:
Expand Down
35 changes: 35 additions & 0 deletions src/lithic/_utils/_json.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
import json
from typing import Any
from datetime import datetime
from typing_extensions import override

import pydantic

from .._compat import model_dump


def openapi_dumps(obj: Any) -> bytes:
"""
Serialize an object to UTF-8 encoded JSON bytes.
Extends the standard json.dumps with support for additional types
commonly used in the SDK, such as `datetime`, `pydantic.BaseModel`, etc.
"""
return json.dumps(
obj,
cls=_CustomEncoder,
# Uses the same defaults as httpx's JSON serialization
ensure_ascii=False,
separators=(",", ":"),
allow_nan=False,
).encode()


class _CustomEncoder(json.JSONEncoder):
@override
def default(self, o: Any) -> Any:
if isinstance(o, datetime):
return o.isoformat()
if isinstance(o, pydantic.BaseModel):
return model_dump(o, exclude_unset=True, mode="json", by_alias=True)
return super().default(o)
2 changes: 1 addition & 1 deletion src/lithic/_version.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
# File generated from our OpenAPI spec by Stainless. See CONTRIBUTING.md for details.

__title__ = "lithic"
__version__ = "0.114.0" # x-release-please-version
__version__ = "0.115.0" # x-release-please-version
Loading