Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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 .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ jobs:
- name: Get GitHub OIDC Token
if: github.repository == 'stainless-sdks/finch-python'
id: github-oidc
uses: actions/github-script@v6
uses: actions/github-script@v8
with:
script: core.setOutput('github_token', await core.getIDToken());

Expand Down
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "1.44.1"
".": "1.45.0"
}
2 changes: 1 addition & 1 deletion .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 46
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/finch%2Ffinch-46f433f34d440aa1dfcc48cc8d822c598571b68be2f723ec99e1b4fba6c13b1e.yml
openapi_spec_hash: 5b5cd728776723ac773900f7e8a32c05
config_hash: 0892e2e0eeb0343a022afa62e9080dd1
config_hash: ccdf6a5b4aaa2a0897c89ac8685d8eb0
19 changes: 19 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,24 @@
# Changelog

## 1.45.0 (2026-01-26)

Full Changelog: [v1.44.1...v1.45.0](https://github.com/Finch-API/finch-api-python/compare/v1.44.1...v1.45.0)

### Features

* **api:** add per endpoint security ([686b27e](https://github.com/Finch-API/finch-api-python/commit/686b27e6d19cc5858b420e2b1bb265f50791c7ea))


### Bug Fixes

* **tests:** skip broken date validation test ([e22eb0f](https://github.com/Finch-API/finch-api-python/commit/e22eb0ffed3e42143600c931f2ab5b342160230c))


### Chores

* **ci:** upgrade `actions/github-script` ([f342729](https://github.com/Finch-API/finch-api-python/commit/f3427295a99f7aa4a45412f699ec6b3cc41b16c2))
* **internal:** codegen related update ([b746d12](https://github.com/Finch-API/finch-api-python/commit/b746d12f98b1fcb287bf1b7844fc8a2d864a7d86))

## 1.44.1 (2026-01-16)

Full Changelog: [v1.44.0...v1.44.1](https://github.com/Finch-API/finch-api-python/compare/v1.44.0...v1.44.1)
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[project]
name = "finch-api"
version = "1.44.1"
version = "1.45.0"
description = "The official Python library for the Finch API"
dynamic = ["readme"]
license = "Apache-2.0"
Expand Down
2 changes: 1 addition & 1 deletion src/finch/_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__ = "finch"
__version__ = "1.44.1" # x-release-please-version
__version__ = "1.45.0" # x-release-please-version
4 changes: 4 additions & 0 deletions src/finch/resources/access_tokens.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,8 @@ def create(

timeout: Override the client-level default timeout for this request, in seconds
"""
extra_headers = {"Authorization": omit, **(extra_headers or {})}

if not is_given(client_id):
if self._client.client_id is None:
raise ValueError(
Expand Down Expand Up @@ -157,6 +159,8 @@ async def create(

timeout: Override the client-level default timeout for this request, in seconds
"""
extra_headers = {"Authorization": omit, **(extra_headers or {})}

if not is_given(client_id):
if self._client.client_id is None:
raise ValueError(
Expand Down
4 changes: 4 additions & 0 deletions src/finch/resources/account.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,7 @@ def disconnect(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> DisconnectResponse:
"""Disconnect one or more `access_token`s from your application."""
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._post(
"/disconnect",
options=make_request_options(
Expand All @@ -66,6 +67,7 @@ def introspect(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> Introspection:
"""Read account information associated with an `access_token`"""
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._get(
"/introspect",
options=make_request_options(
Expand Down Expand Up @@ -106,6 +108,7 @@ async def disconnect(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> DisconnectResponse:
"""Disconnect one or more `access_token`s from your application."""
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return await self._post(
"/disconnect",
options=make_request_options(
Expand All @@ -125,6 +128,7 @@ async def introspect(
timeout: float | httpx.Timeout | None | NotGiven = not_given,
) -> Introspection:
"""Read account information associated with an `access_token`"""
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return await self._get(
"/introspect",
options=make_request_options(
Expand Down
4 changes: 4 additions & 0 deletions src/finch/resources/connect/sessions.py
Original file line number Diff line number Diff line change
Expand Up @@ -104,6 +104,7 @@ def new(

timeout: Override the client-level default timeout for this request, in seconds
"""
extra_headers = {**self._client._basic_auth, **(extra_headers or {})}
return self._post(
"/connect/sessions",
body=maybe_transform(
Expand Down Expand Up @@ -177,6 +178,7 @@ def reauthenticate(

timeout: Override the client-level default timeout for this request, in seconds
"""
extra_headers = {**self._client._basic_auth, **(extra_headers or {})}
return self._post(
"/connect/sessions/reauthenticate",
body=maybe_transform(
Expand Down Expand Up @@ -278,6 +280,7 @@ async def new(

timeout: Override the client-level default timeout for this request, in seconds
"""
extra_headers = {**self._client._basic_auth, **(extra_headers or {})}
return await self._post(
"/connect/sessions",
body=await async_maybe_transform(
Expand Down Expand Up @@ -351,6 +354,7 @@ async def reauthenticate(

timeout: Override the client-level default timeout for this request, in seconds
"""
extra_headers = {**self._client._basic_auth, **(extra_headers or {})}
return await self._post(
"/connect/sessions/reauthenticate",
body=await async_maybe_transform(
Expand Down
10 changes: 10 additions & 0 deletions src/finch/resources/hris/benefits/benefits.py
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,7 @@ def create(

timeout: Override the client-level default timeout for this request, in seconds
"""
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._post(
"/employer/benefits",
body=maybe_transform(
Expand Down Expand Up @@ -155,6 +156,7 @@ def retrieve(
"""
if not benefit_id:
raise ValueError(f"Expected a non-empty value for `benefit_id` but received {benefit_id!r}")
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._get(
f"/employer/benefits/{benefit_id}",
options=make_request_options(
Expand Down Expand Up @@ -198,6 +200,7 @@ def update(
"""
if not benefit_id:
raise ValueError(f"Expected a non-empty value for `benefit_id` but received {benefit_id!r}")
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._post(
f"/employer/benefits/{benefit_id}",
body=maybe_transform({"description": description}, benefit_update_params.BenefitUpdateParams),
Expand Down Expand Up @@ -236,6 +239,7 @@ def list(

timeout: Override the client-level default timeout for this request, in seconds
"""
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._get_api_list(
"/employer/benefits",
page=SyncSinglePage[CompanyBenefit],
Expand Down Expand Up @@ -274,6 +278,7 @@ def list_supported_benefits(

timeout: Override the client-level default timeout for this request, in seconds
"""
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._get_api_list(
"/employer/benefits/meta",
page=SyncSinglePage[SupportedBenefit],
Expand Down Expand Up @@ -356,6 +361,7 @@ async def create(

timeout: Override the client-level default timeout for this request, in seconds
"""
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return await self._post(
"/employer/benefits",
body=await async_maybe_transform(
Expand Down Expand Up @@ -407,6 +413,7 @@ async def retrieve(
"""
if not benefit_id:
raise ValueError(f"Expected a non-empty value for `benefit_id` but received {benefit_id!r}")
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return await self._get(
f"/employer/benefits/{benefit_id}",
options=make_request_options(
Expand Down Expand Up @@ -452,6 +459,7 @@ async def update(
"""
if not benefit_id:
raise ValueError(f"Expected a non-empty value for `benefit_id` but received {benefit_id!r}")
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return await self._post(
f"/employer/benefits/{benefit_id}",
body=await async_maybe_transform({"description": description}, benefit_update_params.BenefitUpdateParams),
Expand Down Expand Up @@ -492,6 +500,7 @@ def list(

timeout: Override the client-level default timeout for this request, in seconds
"""
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._get_api_list(
"/employer/benefits",
page=AsyncSinglePage[CompanyBenefit],
Expand Down Expand Up @@ -530,6 +539,7 @@ def list_supported_benefits(

timeout: Override the client-level default timeout for this request, in seconds
"""
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._get_api_list(
"/employer/benefits/meta",
page=AsyncSinglePage[SupportedBenefit],
Expand Down
8 changes: 8 additions & 0 deletions src/finch/resources/hris/benefits/individuals.py
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@ def enroll_many(
"""
if not benefit_id:
raise ValueError(f"Expected a non-empty value for `benefit_id` but received {benefit_id!r}")
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._post(
f"/employer/benefits/{benefit_id}/individuals",
body=maybe_transform(individuals, Iterable[individual_enroll_many_params.Individual]),
Expand Down Expand Up @@ -126,6 +127,7 @@ def enrolled_ids(
"""
if not benefit_id:
raise ValueError(f"Expected a non-empty value for `benefit_id` but received {benefit_id!r}")
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._get(
f"/employer/benefits/{benefit_id}/enrolled",
options=make_request_options(
Expand Down Expand Up @@ -172,6 +174,7 @@ def retrieve_many_benefits(
"""
if not benefit_id:
raise ValueError(f"Expected a non-empty value for `benefit_id` but received {benefit_id!r}")
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._get_api_list(
f"/employer/benefits/{benefit_id}/individuals",
page=SyncSinglePage[IndividualBenefit],
Expand Down Expand Up @@ -222,6 +225,7 @@ def unenroll_many(
"""
if not benefit_id:
raise ValueError(f"Expected a non-empty value for `benefit_id` but received {benefit_id!r}")
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._delete(
f"/employer/benefits/{benefit_id}/individuals",
body=maybe_transform(
Expand Down Expand Up @@ -295,6 +299,7 @@ async def enroll_many(
"""
if not benefit_id:
raise ValueError(f"Expected a non-empty value for `benefit_id` but received {benefit_id!r}")
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return await self._post(
f"/employer/benefits/{benefit_id}/individuals",
body=await async_maybe_transform(individuals, Iterable[individual_enroll_many_params.Individual]),
Expand Down Expand Up @@ -338,6 +343,7 @@ async def enrolled_ids(
"""
if not benefit_id:
raise ValueError(f"Expected a non-empty value for `benefit_id` but received {benefit_id!r}")
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return await self._get(
f"/employer/benefits/{benefit_id}/enrolled",
options=make_request_options(
Expand Down Expand Up @@ -384,6 +390,7 @@ def retrieve_many_benefits(
"""
if not benefit_id:
raise ValueError(f"Expected a non-empty value for `benefit_id` but received {benefit_id!r}")
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._get_api_list(
f"/employer/benefits/{benefit_id}/individuals",
page=AsyncSinglePage[IndividualBenefit],
Expand Down Expand Up @@ -434,6 +441,7 @@ async def unenroll_many(
"""
if not benefit_id:
raise ValueError(f"Expected a non-empty value for `benefit_id` but received {benefit_id!r}")
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return await self._delete(
f"/employer/benefits/{benefit_id}/individuals",
body=await async_maybe_transform(
Expand Down
2 changes: 2 additions & 0 deletions src/finch/resources/hris/company/company.py
Original file line number Diff line number Diff line change
Expand Up @@ -74,6 +74,7 @@ def retrieve(

timeout: Override the client-level default timeout for this request, in seconds
"""
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._get(
"/employer/company",
options=make_request_options(
Expand Down Expand Up @@ -136,6 +137,7 @@ async def retrieve(

timeout: Override the client-level default timeout for this request, in seconds
"""
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return await self._get(
"/employer/company",
options=make_request_options(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ def list(

timeout: Override the client-level default timeout for this request, in seconds
"""
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._get_api_list(
"/employer/pay-statement-item",
page=SyncResponsesPage[PayStatementItemListResponse],
Expand Down Expand Up @@ -190,6 +191,7 @@ def list(

timeout: Override the client-level default timeout for this request, in seconds
"""
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._get_api_list(
"/employer/pay-statement-item",
page=AsyncResponsesPage[PayStatementItemListResponse],
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,7 @@ def create(

timeout: Override the client-level default timeout for this request, in seconds
"""
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._post(
"/employer/pay-statement-item/rule",
body=maybe_transform(
Expand Down Expand Up @@ -141,6 +142,7 @@ def update(
"""
if not rule_id:
raise ValueError(f"Expected a non-empty value for `rule_id` but received {rule_id!r}")
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._put(
f"/employer/pay-statement-item/rule/{rule_id}",
body=maybe_transform({"optional_property": optional_property}, rule_update_params.RuleUpdateParams),
Expand Down Expand Up @@ -179,6 +181,7 @@ def list(

timeout: Override the client-level default timeout for this request, in seconds
"""
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._get_api_list(
"/employer/pay-statement-item/rule",
page=SyncResponsesPage[RuleListResponse],
Expand Down Expand Up @@ -220,6 +223,7 @@ def delete(
"""
if not rule_id:
raise ValueError(f"Expected a non-empty value for `rule_id` but received {rule_id!r}")
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._delete(
f"/employer/pay-statement-item/rule/{rule_id}",
options=make_request_options(
Expand Down Expand Up @@ -294,6 +298,7 @@ async def create(

timeout: Override the client-level default timeout for this request, in seconds
"""
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return await self._post(
"/employer/pay-statement-item/rule",
body=await async_maybe_transform(
Expand Down Expand Up @@ -345,6 +350,7 @@ async def update(
"""
if not rule_id:
raise ValueError(f"Expected a non-empty value for `rule_id` but received {rule_id!r}")
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return await self._put(
f"/employer/pay-statement-item/rule/{rule_id}",
body=await async_maybe_transform(
Expand Down Expand Up @@ -385,6 +391,7 @@ def list(

timeout: Override the client-level default timeout for this request, in seconds
"""
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._get_api_list(
"/employer/pay-statement-item/rule",
page=AsyncResponsesPage[RuleListResponse],
Expand Down Expand Up @@ -426,6 +433,7 @@ async def delete(
"""
if not rule_id:
raise ValueError(f"Expected a non-empty value for `rule_id` but received {rule_id!r}")
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return await self._delete(
f"/employer/pay-statement-item/rule/{rule_id}",
options=make_request_options(
Expand Down
2 changes: 2 additions & 0 deletions src/finch/resources/hris/directory.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,6 +71,7 @@ def list(

timeout: Override the client-level default timeout for this request, in seconds
"""
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._get_api_list(
"/employer/directory",
page=SyncIndividualsPage[IndividualInDirectory],
Expand Down Expand Up @@ -185,6 +186,7 @@ def list(

timeout: Override the client-level default timeout for this request, in seconds
"""
extra_headers = {**self._client._bearer_auth, **(extra_headers or {})}
return self._get_api_list(
"/employer/directory",
page=AsyncIndividualsPage[IndividualInDirectory],
Expand Down
Loading
Loading