diff --git a/.stats.yml b/.stats.yml index 97e2fbfc3..4bb27f8b2 100644 --- a/.stats.yml +++ b/.stats.yml @@ -1 +1 @@ -configured_endpoints: 131 +configured_endpoints: 133 diff --git a/api.md b/api.md index a78c2d087..7c74f39ea 100644 --- a/api.md +++ b/api.md @@ -388,9 +388,16 @@ Methods: ## SupplementalDocuments +Types: + +```python +from increase.types.entities import SupplementalDocument +``` + Methods: - client.entities.supplemental_documents.create(entity_id, \*\*params) -> Entity +- client.entities.supplemental_documents.list(\*\*params) -> SyncPage[SupplementalDocument] # InboundWireDrawdownRequests @@ -599,6 +606,12 @@ Methods: - client.simulations.check*deposits.return*(check_deposit_id) -> CheckDeposit - client.simulations.check_deposits.submit(check_deposit_id) -> CheckDeposit +## Programs + +Methods: + +- client.simulations.programs.create(\*\*params) -> Program + ## InboundWireDrawdownRequests Methods: diff --git a/src/increase/resources/accounts.py b/src/increase/resources/accounts.py index 154d68dc4..acfc64a76 100644 --- a/src/increase/resources/accounts.py +++ b/src/increase/resources/accounts.py @@ -46,7 +46,8 @@ def create( informational_entity_id: The identifier of an Entity that, while not owning the Account, is associated with its activity. Its relationship to your group must be `informational`. - program_id: The identifier for the Program that this Account falls under. + program_id: The identifier for the Program that this Account falls under. Required if you + operate more than one Program. extra_headers: Send extra headers @@ -162,6 +163,7 @@ def list( created_at: account_list_params.CreatedAt | NotGiven = NOT_GIVEN, cursor: str | NotGiven = NOT_GIVEN, entity_id: str | NotGiven = NOT_GIVEN, + informational_entity_id: str | NotGiven = NOT_GIVEN, limit: int | NotGiven = NOT_GIVEN, status: Literal["open", "closed"] | NotGiven = NOT_GIVEN, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -179,6 +181,8 @@ def list( entity_id: Filter Accounts for those belonging to the specified Entity. + informational_entity_id: Filter Accounts for those belonging to the specified Entity as informational. + limit: Limit the size of the list that is returned. The default (and maximum) is 100 objects. @@ -205,6 +209,7 @@ def list( "created_at": created_at, "cursor": cursor, "entity_id": entity_id, + "informational_entity_id": informational_entity_id, "limit": limit, "status": status, }, @@ -282,7 +287,8 @@ async def create( informational_entity_id: The identifier of an Entity that, while not owning the Account, is associated with its activity. Its relationship to your group must be `informational`. - program_id: The identifier for the Program that this Account falls under. + program_id: The identifier for the Program that this Account falls under. Required if you + operate more than one Program. extra_headers: Send extra headers @@ -398,6 +404,7 @@ def list( created_at: account_list_params.CreatedAt | NotGiven = NOT_GIVEN, cursor: str | NotGiven = NOT_GIVEN, entity_id: str | NotGiven = NOT_GIVEN, + informational_entity_id: str | NotGiven = NOT_GIVEN, limit: int | NotGiven = NOT_GIVEN, status: Literal["open", "closed"] | NotGiven = NOT_GIVEN, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -415,6 +422,8 @@ def list( entity_id: Filter Accounts for those belonging to the specified Entity. + informational_entity_id: Filter Accounts for those belonging to the specified Entity as informational. + limit: Limit the size of the list that is returned. The default (and maximum) is 100 objects. @@ -441,6 +450,7 @@ def list( "created_at": created_at, "cursor": cursor, "entity_id": entity_id, + "informational_entity_id": informational_entity_id, "limit": limit, "status": status, }, diff --git a/src/increase/resources/entities/supplemental_documents.py b/src/increase/resources/entities/supplemental_documents.py index 542f67d74..866746f45 100644 --- a/src/increase/resources/entities/supplemental_documents.py +++ b/src/increase/resources/entities/supplemental_documents.py @@ -6,8 +6,13 @@ from ..._types import NOT_GIVEN, Body, Query, Headers, NotGiven from ..._utils import maybe_transform from ..._resource import SyncAPIResource, AsyncAPIResource -from ..._base_client import make_request_options -from ...types.entities import supplemental_document_create_params +from ...pagination import SyncPage, AsyncPage +from ..._base_client import AsyncPaginator, make_request_options +from ...types.entities import ( + SupplementalDocument, + supplemental_document_list_params, + supplemental_document_create_params, +) __all__ = ["SupplementalDocuments", "AsyncSupplementalDocuments"] @@ -59,6 +64,58 @@ def create( cast_to=Entity, ) + def list( + self, + *, + entity_id: str, + cursor: str | NotGiven = NOT_GIVEN, + limit: int | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | None | NotGiven = NOT_GIVEN, + ) -> SyncPage[SupplementalDocument]: + """ + List Entity Supplemental Document Submissionss + + Args: + entity_id: The identifier of the Entity to list supplemental documents for. + + cursor: Return the page of entries after this one. + + limit: Limit the size of the list that is returned. The default (and maximum) is 100 + objects. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + return self._get_api_list( + "/entity_supplemental_documents", + page=SyncPage[SupplementalDocument], + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform( + { + "entity_id": entity_id, + "cursor": cursor, + "limit": limit, + }, + supplemental_document_list_params.SupplementalDocumentListParams, + ), + ), + model=SupplementalDocument, + ) + class AsyncSupplementalDocuments(AsyncAPIResource): async def create( @@ -106,3 +163,55 @@ async def create( ), cast_to=Entity, ) + + def list( + self, + *, + entity_id: str, + cursor: str | NotGiven = NOT_GIVEN, + limit: int | NotGiven = NOT_GIVEN, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | None | NotGiven = NOT_GIVEN, + ) -> AsyncPaginator[SupplementalDocument, AsyncPage[SupplementalDocument]]: + """ + List Entity Supplemental Document Submissionss + + Args: + entity_id: The identifier of the Entity to list supplemental documents for. + + cursor: Return the page of entries after this one. + + limit: Limit the size of the list that is returned. The default (and maximum) is 100 + objects. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + """ + return self._get_api_list( + "/entity_supplemental_documents", + page=AsyncPage[SupplementalDocument], + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + query=maybe_transform( + { + "entity_id": entity_id, + "cursor": cursor, + "limit": limit, + }, + supplemental_document_list_params.SupplementalDocumentListParams, + ), + ), + model=SupplementalDocument, + ) diff --git a/src/increase/resources/simulations/__init__.py b/src/increase/resources/simulations/__init__.py index 31b2fc52f..b033c6f90 100644 --- a/src/increase/resources/simulations/__init__.py +++ b/src/increase/resources/simulations/__init__.py @@ -1,6 +1,7 @@ # File generated from our OpenAPI spec by Stainless. from .cards import Cards, AsyncCards +from .programs import Programs, AsyncPrograms from .documents import Documents, AsyncDocuments from .simulations import Simulations, AsyncSimulations from .card_refunds import CardRefunds, AsyncCardRefunds @@ -44,6 +45,8 @@ "AsyncDigitalWalletTokenRequests", "CheckDeposits", "AsyncCheckDeposits", + "Programs", + "AsyncPrograms", "InboundWireDrawdownRequests", "AsyncInboundWireDrawdownRequests", "InterestPayments", diff --git a/src/increase/resources/simulations/ach_transfers.py b/src/increase/resources/simulations/ach_transfers.py index 90902c83c..b38bf244d 100644 --- a/src/increase/resources/simulations/ach_transfers.py +++ b/src/increase/resources/simulations/ach_transfers.py @@ -121,10 +121,58 @@ def return_( "file_record_edit_criteria", "enr_invalid_individual_name", "returned_per_odfi_request", - "addenda_error", "limited_participation_dfi", "incorrectly_coded_outbound_international_payment", "other", + "account_sold_to_another_dfi", + "addenda_error", + "beneficiary_or_account_holder_deceased", + "check_truncation_entry_return", + "corrected_return", + "duplicate_entry", + "duplicate_return", + "enr_duplicate_enrollment", + "enr_invalid_dfi_account_number", + "enr_invalid_individual_id_number", + "enr_invalid_representative_payee_indicator", + "enr_invalid_transaction_code", + "enr_return_of_enr_entry", + "enr_routing_number_check_digit_error", + "entry_not_processed_by_gateway", + "field_error", + "foreign_receiving_dfi_unable_to_settle", + "iat_entry_coding_error", + "improper_effective_entry_date", + "improper_source_document_source_document_presented", + "invalid_company_id", + "invalid_foreign_receiving_dfi_identification", + "invalid_individual_id_number", + "item_and_rck_entry_presented_for_payment", + "item_related_to_rck_entry_is_ineligible", + "mandatory_field_error", + "misrouted_dishonored_return", + "misrouted_return", + "no_errors_found", + "non_acceptance_of_r62_dishonored_return", + "non_participant_in_iat_program", + "permissible_return_entry", + "permissible_return_entry_not_accepted", + "rdfi_non_settlement", + "rdfi_participant_in_check_truncation_program", + "representative_payee_deceased_or_unable_to_continue_in_that_capacity", + "return_not_a_duplicate", + "return_of_erroneous_or_reversing_debit", + "return_of_improper_credit_entry", + "return_of_improper_debit_entry", + "return_of_xck_entry", + "source_document_presented_for_payment", + "state_law_affecting_rck_acceptance", + "stop_payment_on_item_related_to_rck_entry", + "stop_payment_on_source_document", + "timely_original_return", + "trace_number_error", + "untimely_dishonored_return", + "untimely_return", ] | NotGiven = NOT_GIVEN, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. @@ -318,10 +366,58 @@ async def return_( "file_record_edit_criteria", "enr_invalid_individual_name", "returned_per_odfi_request", - "addenda_error", "limited_participation_dfi", "incorrectly_coded_outbound_international_payment", "other", + "account_sold_to_another_dfi", + "addenda_error", + "beneficiary_or_account_holder_deceased", + "check_truncation_entry_return", + "corrected_return", + "duplicate_entry", + "duplicate_return", + "enr_duplicate_enrollment", + "enr_invalid_dfi_account_number", + "enr_invalid_individual_id_number", + "enr_invalid_representative_payee_indicator", + "enr_invalid_transaction_code", + "enr_return_of_enr_entry", + "enr_routing_number_check_digit_error", + "entry_not_processed_by_gateway", + "field_error", + "foreign_receiving_dfi_unable_to_settle", + "iat_entry_coding_error", + "improper_effective_entry_date", + "improper_source_document_source_document_presented", + "invalid_company_id", + "invalid_foreign_receiving_dfi_identification", + "invalid_individual_id_number", + "item_and_rck_entry_presented_for_payment", + "item_related_to_rck_entry_is_ineligible", + "mandatory_field_error", + "misrouted_dishonored_return", + "misrouted_return", + "no_errors_found", + "non_acceptance_of_r62_dishonored_return", + "non_participant_in_iat_program", + "permissible_return_entry", + "permissible_return_entry_not_accepted", + "rdfi_non_settlement", + "rdfi_participant_in_check_truncation_program", + "representative_payee_deceased_or_unable_to_continue_in_that_capacity", + "return_not_a_duplicate", + "return_of_erroneous_or_reversing_debit", + "return_of_improper_credit_entry", + "return_of_improper_debit_entry", + "return_of_xck_entry", + "source_document_presented_for_payment", + "state_law_affecting_rck_acceptance", + "stop_payment_on_item_related_to_rck_entry", + "stop_payment_on_source_document", + "timely_original_return", + "trace_number_error", + "untimely_dishonored_return", + "untimely_return", ] | NotGiven = NOT_GIVEN, # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. diff --git a/src/increase/resources/simulations/programs.py b/src/increase/resources/simulations/programs.py new file mode 100644 index 000000000..8f606de76 --- /dev/null +++ b/src/increase/resources/simulations/programs.py @@ -0,0 +1,104 @@ +# File generated from our OpenAPI spec by Stainless. + +from __future__ import annotations + +from ...types import Program +from ..._types import NOT_GIVEN, Body, Query, Headers, NotGiven +from ..._utils import maybe_transform +from ..._resource import SyncAPIResource, AsyncAPIResource +from ..._base_client import make_request_options +from ...types.simulations import program_create_params + +__all__ = ["Programs", "AsyncPrograms"] + + +class Programs(SyncAPIResource): + def create( + self, + *, + name: str, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | None | NotGiven = NOT_GIVEN, + idempotency_key: str | None = None, + ) -> Program: + """Simulates a program being created in your group. + + By default, your group has one + program called Commercial Banking. Note that when your group operates more than + one program, `program_id` is a required field when creating accounts. + + Args: + name: The name of the program being added. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + + idempotency_key: Specify a custom idempotency key for this request + """ + return self._post( + "/simulations/programs", + body=maybe_transform({"name": name}, program_create_params.ProgramCreateParams), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + idempotency_key=idempotency_key, + ), + cast_to=Program, + ) + + +class AsyncPrograms(AsyncAPIResource): + async def create( + self, + *, + name: str, + # Use the following arguments if you need to pass additional parameters to the API that aren't available via kwargs. + # The extra values given here take precedence over values defined on the client or passed to this method. + extra_headers: Headers | None = None, + extra_query: Query | None = None, + extra_body: Body | None = None, + timeout: float | None | NotGiven = NOT_GIVEN, + idempotency_key: str | None = None, + ) -> Program: + """Simulates a program being created in your group. + + By default, your group has one + program called Commercial Banking. Note that when your group operates more than + one program, `program_id` is a required field when creating accounts. + + Args: + name: The name of the program being added. + + extra_headers: Send extra headers + + extra_query: Add additional query parameters to the request + + extra_body: Add additional JSON properties to the request + + timeout: Override the client-level default timeout for this request, in seconds + + idempotency_key: Specify a custom idempotency key for this request + """ + return await self._post( + "/simulations/programs", + body=maybe_transform({"name": name}, program_create_params.ProgramCreateParams), + options=make_request_options( + extra_headers=extra_headers, + extra_query=extra_query, + extra_body=extra_body, + timeout=timeout, + idempotency_key=idempotency_key, + ), + cast_to=Program, + ) diff --git a/src/increase/resources/simulations/simulations.py b/src/increase/resources/simulations/simulations.py index 94c213ce3..3fdefe948 100644 --- a/src/increase/resources/simulations/simulations.py +++ b/src/increase/resources/simulations/simulations.py @@ -5,6 +5,7 @@ from typing import TYPE_CHECKING from .cards import Cards, AsyncCards +from .programs import Programs, AsyncPrograms from .documents import Documents, AsyncDocuments from ..._resource import SyncAPIResource, AsyncAPIResource from .card_refunds import CardRefunds, AsyncCardRefunds @@ -45,6 +46,7 @@ class Simulations(SyncAPIResource): documents: Documents digital_wallet_token_requests: DigitalWalletTokenRequests check_deposits: CheckDeposits + programs: Programs inbound_wire_drawdown_requests: InboundWireDrawdownRequests interest_payments: InterestPayments wire_transfers: WireTransfers @@ -62,6 +64,7 @@ def __init__(self, client: Increase) -> None: self.documents = Documents(client) self.digital_wallet_token_requests = DigitalWalletTokenRequests(client) self.check_deposits = CheckDeposits(client) + self.programs = Programs(client) self.inbound_wire_drawdown_requests = InboundWireDrawdownRequests(client) self.interest_payments = InterestPayments(client) self.wire_transfers = WireTransfers(client) @@ -79,6 +82,7 @@ class AsyncSimulations(AsyncAPIResource): documents: AsyncDocuments digital_wallet_token_requests: AsyncDigitalWalletTokenRequests check_deposits: AsyncCheckDeposits + programs: AsyncPrograms inbound_wire_drawdown_requests: AsyncInboundWireDrawdownRequests interest_payments: AsyncInterestPayments wire_transfers: AsyncWireTransfers @@ -96,6 +100,7 @@ def __init__(self, client: AsyncIncrease) -> None: self.documents = AsyncDocuments(client) self.digital_wallet_token_requests = AsyncDigitalWalletTokenRequests(client) self.check_deposits = AsyncCheckDeposits(client) + self.programs = AsyncPrograms(client) self.inbound_wire_drawdown_requests = AsyncInboundWireDrawdownRequests(client) self.interest_payments = AsyncInterestPayments(client) self.wire_transfers = AsyncWireTransfers(client) diff --git a/src/increase/types/account.py b/src/increase/types/account.py index 1ff104996..a12b2b93c 100644 --- a/src/increase/types/account.py +++ b/src/increase/types/account.py @@ -46,6 +46,13 @@ class Account(BaseModel): interest was accrued. """ + interest_rate: str + """ + The Interest Rate currently being earned on the account, as a string containing + a decimal number. For example, a 1% interest rate would be represented as + "0.01". + """ + name: str """The name you choose for the Account.""" diff --git a/src/increase/types/account_create_params.py b/src/increase/types/account_create_params.py index ed9fbcaed..0f9d3edd1 100644 --- a/src/increase/types/account_create_params.py +++ b/src/increase/types/account_create_params.py @@ -21,4 +21,7 @@ class AccountCreateParams(TypedDict, total=False): """ program_id: str - """The identifier for the Program that this Account falls under.""" + """The identifier for the Program that this Account falls under. + + Required if you operate more than one Program. + """ diff --git a/src/increase/types/account_list_params.py b/src/increase/types/account_list_params.py index 3d022f4b1..fec74ac9f 100644 --- a/src/increase/types/account_list_params.py +++ b/src/increase/types/account_list_params.py @@ -20,6 +20,9 @@ class AccountListParams(TypedDict, total=False): entity_id: str """Filter Accounts for those belonging to the specified Entity.""" + informational_entity_id: str + """Filter Accounts for those belonging to the specified Entity as informational.""" + limit: int """Limit the size of the list that is returned. diff --git a/src/increase/types/ach_transfer.py b/src/increase/types/ach_transfer.py index 7158ad16d..bac1c84d7 100644 --- a/src/increase/types/ach_transfer.py +++ b/src/increase/types/ach_transfer.py @@ -60,6 +60,9 @@ class Return(BaseModel): the transfer was created. """ + raw_return_reason_code: str + """The three character ACH return code, in the range R01 to R85.""" + return_reason_code: Literal[ "insufficient_fund", "no_account", @@ -80,10 +83,58 @@ class Return(BaseModel): "file_record_edit_criteria", "enr_invalid_individual_name", "returned_per_odfi_request", - "addenda_error", "limited_participation_dfi", "incorrectly_coded_outbound_international_payment", "other", + "account_sold_to_another_dfi", + "addenda_error", + "beneficiary_or_account_holder_deceased", + "check_truncation_entry_return", + "corrected_return", + "duplicate_entry", + "duplicate_return", + "enr_duplicate_enrollment", + "enr_invalid_dfi_account_number", + "enr_invalid_individual_id_number", + "enr_invalid_representative_payee_indicator", + "enr_invalid_transaction_code", + "enr_return_of_enr_entry", + "enr_routing_number_check_digit_error", + "entry_not_processed_by_gateway", + "field_error", + "foreign_receiving_dfi_unable_to_settle", + "iat_entry_coding_error", + "improper_effective_entry_date", + "improper_source_document_source_document_presented", + "invalid_company_id", + "invalid_foreign_receiving_dfi_identification", + "invalid_individual_id_number", + "item_and_rck_entry_presented_for_payment", + "item_related_to_rck_entry_is_ineligible", + "mandatory_field_error", + "misrouted_dishonored_return", + "misrouted_return", + "no_errors_found", + "non_acceptance_of_r62_dishonored_return", + "non_participant_in_iat_program", + "permissible_return_entry", + "permissible_return_entry_not_accepted", + "rdfi_non_settlement", + "rdfi_participant_in_check_truncation_program", + "representative_payee_deceased_or_unable_to_continue_in_that_capacity", + "return_not_a_duplicate", + "return_of_erroneous_or_reversing_debit", + "return_of_improper_credit_entry", + "return_of_improper_debit_entry", + "return_of_xck_entry", + "source_document_presented_for_payment", + "state_law_affecting_rck_acceptance", + "stop_payment_on_item_related_to_rck_entry", + "stop_payment_on_source_document", + "timely_original_return", + "trace_number_error", + "untimely_dishonored_return", + "untimely_return", ] """Why the ACH Transfer was returned.""" diff --git a/src/increase/types/declined_transaction.py b/src/increase/types/declined_transaction.py index db7c60051..ace8ed443 100644 --- a/src/increase/types/declined_transaction.py +++ b/src/increase/types/declined_transaction.py @@ -181,6 +181,7 @@ class SourceCheckDecline(BaseModel): "group_locked", "insufficient_funds", "unable_to_locate_account", + "not_our_item", "unable_to_process", "refer_to_image", "stop_payment_requested", diff --git a/src/increase/types/entities/__init__.py b/src/increase/types/entities/__init__.py index 38c593958..c7bf63561 100644 --- a/src/increase/types/entities/__init__.py +++ b/src/increase/types/entities/__init__.py @@ -2,6 +2,10 @@ from __future__ import annotations +from .supplemental_document import SupplementalDocument as SupplementalDocument +from .supplemental_document_list_params import ( + SupplementalDocumentListParams as SupplementalDocumentListParams, +) from .supplemental_document_create_params import ( SupplementalDocumentCreateParams as SupplementalDocumentCreateParams, ) diff --git a/src/increase/types/entities/supplemental_document.py b/src/increase/types/entities/supplemental_document.py new file mode 100644 index 000000000..e2ea94ffa --- /dev/null +++ b/src/increase/types/entities/supplemental_document.py @@ -0,0 +1,25 @@ +# File generated from our OpenAPI spec by Stainless. + +from datetime import datetime +from typing_extensions import Literal + +from ..._models import BaseModel + +__all__ = ["SupplementalDocument"] + + +class SupplementalDocument(BaseModel): + created_at: datetime + """ + The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) time at which the + Supplemental Document was created. + """ + + file_id: str + """The File containing the document.""" + + type: Literal["entity_supplemental_document"] + """A constant representing the object's type. + + For this resource it will always be `entity_supplemental_document`. + """ diff --git a/src/increase/types/entities/supplemental_document_list_params.py b/src/increase/types/entities/supplemental_document_list_params.py new file mode 100644 index 000000000..a910f20aa --- /dev/null +++ b/src/increase/types/entities/supplemental_document_list_params.py @@ -0,0 +1,21 @@ +# File generated from our OpenAPI spec by Stainless. + +from __future__ import annotations + +from typing_extensions import Required, TypedDict + +__all__ = ["SupplementalDocumentListParams"] + + +class SupplementalDocumentListParams(TypedDict, total=False): + entity_id: Required[str] + """The identifier of the Entity to list supplemental documents for.""" + + cursor: str + """Return the page of entries after this one.""" + + limit: int + """Limit the size of the list that is returned. + + The default (and maximum) is 100 objects. + """ diff --git a/src/increase/types/entity.py b/src/increase/types/entity.py index f51fbbf9b..91d4917b1 100644 --- a/src/increase/types/entity.py +++ b/src/increase/types/entity.py @@ -1,7 +1,7 @@ # File generated from our OpenAPI spec by Stainless. from typing import List, Optional -from datetime import date +from datetime import date, datetime from typing_extensions import Literal from .._models import BaseModel @@ -395,9 +395,21 @@ class Trust(BaseModel): class SupplementalDocument(BaseModel): + created_at: datetime + """ + The [ISO 8601](https://en.wikipedia.org/wiki/ISO_8601) time at which the + Supplemental Document was created. + """ + file_id: str """The File containing the document.""" + type: Literal["entity_supplemental_document"] + """A constant representing the object's type. + + For this resource it will always be `entity_supplemental_document`. + """ + class Entity(BaseModel): corporation: Optional[Corporation] @@ -431,7 +443,12 @@ class Entity(BaseModel): """The entity's legal structure.""" supplemental_documents: List[SupplementalDocument] - """Additional documentation associated with the entity.""" + """Additional documentation associated with the entity. + + This is limited to the first 10 documents for an entity. If an entity has more + than 10 documents, use the GET /entity_supplemental_documents list endpoint to + retrieve them. + """ trust: Optional[Trust] """Details of the trust entity. diff --git a/src/increase/types/simulations/__init__.py b/src/increase/types/simulations/__init__.py index 203bb4fb7..f55dfe43c 100644 --- a/src/increase/types/simulations/__init__.py +++ b/src/increase/types/simulations/__init__.py @@ -3,6 +3,7 @@ from __future__ import annotations from .card_authorize_params import CardAuthorizeParams as CardAuthorizeParams +from .program_create_params import ProgramCreateParams as ProgramCreateParams from .card_settlement_params import CardSettlementParams as CardSettlementParams from .document_create_params import DocumentCreateParams as DocumentCreateParams from .ach_transfer_simulation import ACHTransferSimulation as ACHTransferSimulation diff --git a/src/increase/types/simulations/ach_transfer_return_params.py b/src/increase/types/simulations/ach_transfer_return_params.py index 8fbfae11e..2f8a2dd06 100644 --- a/src/increase/types/simulations/ach_transfer_return_params.py +++ b/src/increase/types/simulations/ach_transfer_return_params.py @@ -28,10 +28,58 @@ class ACHTransferReturnParams(TypedDict, total=False): "file_record_edit_criteria", "enr_invalid_individual_name", "returned_per_odfi_request", - "addenda_error", "limited_participation_dfi", "incorrectly_coded_outbound_international_payment", "other", + "account_sold_to_another_dfi", + "addenda_error", + "beneficiary_or_account_holder_deceased", + "check_truncation_entry_return", + "corrected_return", + "duplicate_entry", + "duplicate_return", + "enr_duplicate_enrollment", + "enr_invalid_dfi_account_number", + "enr_invalid_individual_id_number", + "enr_invalid_representative_payee_indicator", + "enr_invalid_transaction_code", + "enr_return_of_enr_entry", + "enr_routing_number_check_digit_error", + "entry_not_processed_by_gateway", + "field_error", + "foreign_receiving_dfi_unable_to_settle", + "iat_entry_coding_error", + "improper_effective_entry_date", + "improper_source_document_source_document_presented", + "invalid_company_id", + "invalid_foreign_receiving_dfi_identification", + "invalid_individual_id_number", + "item_and_rck_entry_presented_for_payment", + "item_related_to_rck_entry_is_ineligible", + "mandatory_field_error", + "misrouted_dishonored_return", + "misrouted_return", + "no_errors_found", + "non_acceptance_of_r62_dishonored_return", + "non_participant_in_iat_program", + "permissible_return_entry", + "permissible_return_entry_not_accepted", + "rdfi_non_settlement", + "rdfi_participant_in_check_truncation_program", + "representative_payee_deceased_or_unable_to_continue_in_that_capacity", + "return_not_a_duplicate", + "return_of_erroneous_or_reversing_debit", + "return_of_improper_credit_entry", + "return_of_improper_debit_entry", + "return_of_xck_entry", + "source_document_presented_for_payment", + "state_law_affecting_rck_acceptance", + "stop_payment_on_item_related_to_rck_entry", + "stop_payment_on_source_document", + "timely_original_return", + "trace_number_error", + "untimely_dishonored_return", + "untimely_return", ] """The reason why the Federal Reserve or destination bank returned this transfer. diff --git a/src/increase/types/simulations/ach_transfer_simulation.py b/src/increase/types/simulations/ach_transfer_simulation.py index 9b4ffe8cd..72749df7c 100644 --- a/src/increase/types/simulations/ach_transfer_simulation.py +++ b/src/increase/types/simulations/ach_transfer_simulation.py @@ -139,6 +139,9 @@ class TransactionSourceACHTransferReturn(BaseModel): the transfer was created. """ + raw_return_reason_code: str + """The three character ACH return code, in the range R01 to R85.""" + return_reason_code: Literal[ "insufficient_fund", "no_account", @@ -159,10 +162,58 @@ class TransactionSourceACHTransferReturn(BaseModel): "file_record_edit_criteria", "enr_invalid_individual_name", "returned_per_odfi_request", - "addenda_error", "limited_participation_dfi", "incorrectly_coded_outbound_international_payment", "other", + "account_sold_to_another_dfi", + "addenda_error", + "beneficiary_or_account_holder_deceased", + "check_truncation_entry_return", + "corrected_return", + "duplicate_entry", + "duplicate_return", + "enr_duplicate_enrollment", + "enr_invalid_dfi_account_number", + "enr_invalid_individual_id_number", + "enr_invalid_representative_payee_indicator", + "enr_invalid_transaction_code", + "enr_return_of_enr_entry", + "enr_routing_number_check_digit_error", + "entry_not_processed_by_gateway", + "field_error", + "foreign_receiving_dfi_unable_to_settle", + "iat_entry_coding_error", + "improper_effective_entry_date", + "improper_source_document_source_document_presented", + "invalid_company_id", + "invalid_foreign_receiving_dfi_identification", + "invalid_individual_id_number", + "item_and_rck_entry_presented_for_payment", + "item_related_to_rck_entry_is_ineligible", + "mandatory_field_error", + "misrouted_dishonored_return", + "misrouted_return", + "no_errors_found", + "non_acceptance_of_r62_dishonored_return", + "non_participant_in_iat_program", + "permissible_return_entry", + "permissible_return_entry_not_accepted", + "rdfi_non_settlement", + "rdfi_participant_in_check_truncation_program", + "representative_payee_deceased_or_unable_to_continue_in_that_capacity", + "return_not_a_duplicate", + "return_of_erroneous_or_reversing_debit", + "return_of_improper_credit_entry", + "return_of_improper_debit_entry", + "return_of_xck_entry", + "source_document_presented_for_payment", + "state_law_affecting_rck_acceptance", + "stop_payment_on_item_related_to_rck_entry", + "stop_payment_on_source_document", + "timely_original_return", + "trace_number_error", + "untimely_dishonored_return", + "untimely_return", ] """Why the ACH Transfer was returned.""" @@ -866,6 +917,7 @@ class TransactionSourceInternalSource(BaseModel): """ reason: Literal[ + "account_closure", "bank_migration", "cashback", "collection_receivable", @@ -1518,6 +1570,7 @@ class DeclinedTransactionSourceCheckDecline(BaseModel): "group_locked", "insufficient_funds", "unable_to_locate_account", + "not_our_item", "unable_to_process", "refer_to_image", "stop_payment_requested", diff --git a/src/increase/types/simulations/card_authorization_simulation.py b/src/increase/types/simulations/card_authorization_simulation.py index 7210e46a7..dbcc49938 100644 --- a/src/increase/types/simulations/card_authorization_simulation.py +++ b/src/increase/types/simulations/card_authorization_simulation.py @@ -639,6 +639,7 @@ class DeclinedTransactionSourceCheckDecline(BaseModel): "group_locked", "insufficient_funds", "unable_to_locate_account", + "not_our_item", "unable_to_process", "refer_to_image", "stop_payment_requested", diff --git a/src/increase/types/simulations/inbound_real_time_payments_transfer_simulation_result.py b/src/increase/types/simulations/inbound_real_time_payments_transfer_simulation_result.py index 8b4ec4388..9ddb7cc3e 100644 --- a/src/increase/types/simulations/inbound_real_time_payments_transfer_simulation_result.py +++ b/src/increase/types/simulations/inbound_real_time_payments_transfer_simulation_result.py @@ -139,6 +139,9 @@ class TransactionSourceACHTransferReturn(BaseModel): the transfer was created. """ + raw_return_reason_code: str + """The three character ACH return code, in the range R01 to R85.""" + return_reason_code: Literal[ "insufficient_fund", "no_account", @@ -159,10 +162,58 @@ class TransactionSourceACHTransferReturn(BaseModel): "file_record_edit_criteria", "enr_invalid_individual_name", "returned_per_odfi_request", - "addenda_error", "limited_participation_dfi", "incorrectly_coded_outbound_international_payment", "other", + "account_sold_to_another_dfi", + "addenda_error", + "beneficiary_or_account_holder_deceased", + "check_truncation_entry_return", + "corrected_return", + "duplicate_entry", + "duplicate_return", + "enr_duplicate_enrollment", + "enr_invalid_dfi_account_number", + "enr_invalid_individual_id_number", + "enr_invalid_representative_payee_indicator", + "enr_invalid_transaction_code", + "enr_return_of_enr_entry", + "enr_routing_number_check_digit_error", + "entry_not_processed_by_gateway", + "field_error", + "foreign_receiving_dfi_unable_to_settle", + "iat_entry_coding_error", + "improper_effective_entry_date", + "improper_source_document_source_document_presented", + "invalid_company_id", + "invalid_foreign_receiving_dfi_identification", + "invalid_individual_id_number", + "item_and_rck_entry_presented_for_payment", + "item_related_to_rck_entry_is_ineligible", + "mandatory_field_error", + "misrouted_dishonored_return", + "misrouted_return", + "no_errors_found", + "non_acceptance_of_r62_dishonored_return", + "non_participant_in_iat_program", + "permissible_return_entry", + "permissible_return_entry_not_accepted", + "rdfi_non_settlement", + "rdfi_participant_in_check_truncation_program", + "representative_payee_deceased_or_unable_to_continue_in_that_capacity", + "return_not_a_duplicate", + "return_of_erroneous_or_reversing_debit", + "return_of_improper_credit_entry", + "return_of_improper_debit_entry", + "return_of_xck_entry", + "source_document_presented_for_payment", + "state_law_affecting_rck_acceptance", + "stop_payment_on_item_related_to_rck_entry", + "stop_payment_on_source_document", + "timely_original_return", + "trace_number_error", + "untimely_dishonored_return", + "untimely_return", ] """Why the ACH Transfer was returned.""" @@ -866,6 +917,7 @@ class TransactionSourceInternalSource(BaseModel): """ reason: Literal[ + "account_closure", "bank_migration", "cashback", "collection_receivable", @@ -1518,6 +1570,7 @@ class DeclinedTransactionSourceCheckDecline(BaseModel): "group_locked", "insufficient_funds", "unable_to_locate_account", + "not_our_item", "unable_to_process", "refer_to_image", "stop_payment_requested", diff --git a/src/increase/types/simulations/interest_payment_simulation_result.py b/src/increase/types/simulations/interest_payment_simulation_result.py index ed2d564b3..d1e5dea22 100644 --- a/src/increase/types/simulations/interest_payment_simulation_result.py +++ b/src/increase/types/simulations/interest_payment_simulation_result.py @@ -127,6 +127,9 @@ class TransactionSourceACHTransferReturn(BaseModel): the transfer was created. """ + raw_return_reason_code: str + """The three character ACH return code, in the range R01 to R85.""" + return_reason_code: Literal[ "insufficient_fund", "no_account", @@ -147,10 +150,58 @@ class TransactionSourceACHTransferReturn(BaseModel): "file_record_edit_criteria", "enr_invalid_individual_name", "returned_per_odfi_request", - "addenda_error", "limited_participation_dfi", "incorrectly_coded_outbound_international_payment", "other", + "account_sold_to_another_dfi", + "addenda_error", + "beneficiary_or_account_holder_deceased", + "check_truncation_entry_return", + "corrected_return", + "duplicate_entry", + "duplicate_return", + "enr_duplicate_enrollment", + "enr_invalid_dfi_account_number", + "enr_invalid_individual_id_number", + "enr_invalid_representative_payee_indicator", + "enr_invalid_transaction_code", + "enr_return_of_enr_entry", + "enr_routing_number_check_digit_error", + "entry_not_processed_by_gateway", + "field_error", + "foreign_receiving_dfi_unable_to_settle", + "iat_entry_coding_error", + "improper_effective_entry_date", + "improper_source_document_source_document_presented", + "invalid_company_id", + "invalid_foreign_receiving_dfi_identification", + "invalid_individual_id_number", + "item_and_rck_entry_presented_for_payment", + "item_related_to_rck_entry_is_ineligible", + "mandatory_field_error", + "misrouted_dishonored_return", + "misrouted_return", + "no_errors_found", + "non_acceptance_of_r62_dishonored_return", + "non_participant_in_iat_program", + "permissible_return_entry", + "permissible_return_entry_not_accepted", + "rdfi_non_settlement", + "rdfi_participant_in_check_truncation_program", + "representative_payee_deceased_or_unable_to_continue_in_that_capacity", + "return_not_a_duplicate", + "return_of_erroneous_or_reversing_debit", + "return_of_improper_credit_entry", + "return_of_improper_debit_entry", + "return_of_xck_entry", + "source_document_presented_for_payment", + "state_law_affecting_rck_acceptance", + "stop_payment_on_item_related_to_rck_entry", + "stop_payment_on_source_document", + "timely_original_return", + "trace_number_error", + "untimely_dishonored_return", + "untimely_return", ] """Why the ACH Transfer was returned.""" @@ -854,6 +905,7 @@ class TransactionSourceInternalSource(BaseModel): """ reason: Literal[ + "account_closure", "bank_migration", "cashback", "collection_receivable", diff --git a/src/increase/types/simulations/program_create_params.py b/src/increase/types/simulations/program_create_params.py new file mode 100644 index 000000000..22b346cec --- /dev/null +++ b/src/increase/types/simulations/program_create_params.py @@ -0,0 +1,12 @@ +# File generated from our OpenAPI spec by Stainless. + +from __future__ import annotations + +from typing_extensions import Required, TypedDict + +__all__ = ["ProgramCreateParams"] + + +class ProgramCreateParams(TypedDict, total=False): + name: Required[str] + """The name of the program being added.""" diff --git a/src/increase/types/simulations/wire_transfer_simulation.py b/src/increase/types/simulations/wire_transfer_simulation.py index 383035787..113e9de12 100644 --- a/src/increase/types/simulations/wire_transfer_simulation.py +++ b/src/increase/types/simulations/wire_transfer_simulation.py @@ -127,6 +127,9 @@ class TransactionSourceACHTransferReturn(BaseModel): the transfer was created. """ + raw_return_reason_code: str + """The three character ACH return code, in the range R01 to R85.""" + return_reason_code: Literal[ "insufficient_fund", "no_account", @@ -147,10 +150,58 @@ class TransactionSourceACHTransferReturn(BaseModel): "file_record_edit_criteria", "enr_invalid_individual_name", "returned_per_odfi_request", - "addenda_error", "limited_participation_dfi", "incorrectly_coded_outbound_international_payment", "other", + "account_sold_to_another_dfi", + "addenda_error", + "beneficiary_or_account_holder_deceased", + "check_truncation_entry_return", + "corrected_return", + "duplicate_entry", + "duplicate_return", + "enr_duplicate_enrollment", + "enr_invalid_dfi_account_number", + "enr_invalid_individual_id_number", + "enr_invalid_representative_payee_indicator", + "enr_invalid_transaction_code", + "enr_return_of_enr_entry", + "enr_routing_number_check_digit_error", + "entry_not_processed_by_gateway", + "field_error", + "foreign_receiving_dfi_unable_to_settle", + "iat_entry_coding_error", + "improper_effective_entry_date", + "improper_source_document_source_document_presented", + "invalid_company_id", + "invalid_foreign_receiving_dfi_identification", + "invalid_individual_id_number", + "item_and_rck_entry_presented_for_payment", + "item_related_to_rck_entry_is_ineligible", + "mandatory_field_error", + "misrouted_dishonored_return", + "misrouted_return", + "no_errors_found", + "non_acceptance_of_r62_dishonored_return", + "non_participant_in_iat_program", + "permissible_return_entry", + "permissible_return_entry_not_accepted", + "rdfi_non_settlement", + "rdfi_participant_in_check_truncation_program", + "representative_payee_deceased_or_unable_to_continue_in_that_capacity", + "return_not_a_duplicate", + "return_of_erroneous_or_reversing_debit", + "return_of_improper_credit_entry", + "return_of_improper_debit_entry", + "return_of_xck_entry", + "source_document_presented_for_payment", + "state_law_affecting_rck_acceptance", + "stop_payment_on_item_related_to_rck_entry", + "stop_payment_on_source_document", + "timely_original_return", + "trace_number_error", + "untimely_dishonored_return", + "untimely_return", ] """Why the ACH Transfer was returned.""" @@ -854,6 +905,7 @@ class TransactionSourceInternalSource(BaseModel): """ reason: Literal[ + "account_closure", "bank_migration", "cashback", "collection_receivable", diff --git a/src/increase/types/transaction.py b/src/increase/types/transaction.py index a9bf97bfe..ab95b02f5 100644 --- a/src/increase/types/transaction.py +++ b/src/increase/types/transaction.py @@ -126,6 +126,9 @@ class SourceACHTransferReturn(BaseModel): the transfer was created. """ + raw_return_reason_code: str + """The three character ACH return code, in the range R01 to R85.""" + return_reason_code: Literal[ "insufficient_fund", "no_account", @@ -146,10 +149,58 @@ class SourceACHTransferReturn(BaseModel): "file_record_edit_criteria", "enr_invalid_individual_name", "returned_per_odfi_request", - "addenda_error", "limited_participation_dfi", "incorrectly_coded_outbound_international_payment", "other", + "account_sold_to_another_dfi", + "addenda_error", + "beneficiary_or_account_holder_deceased", + "check_truncation_entry_return", + "corrected_return", + "duplicate_entry", + "duplicate_return", + "enr_duplicate_enrollment", + "enr_invalid_dfi_account_number", + "enr_invalid_individual_id_number", + "enr_invalid_representative_payee_indicator", + "enr_invalid_transaction_code", + "enr_return_of_enr_entry", + "enr_routing_number_check_digit_error", + "entry_not_processed_by_gateway", + "field_error", + "foreign_receiving_dfi_unable_to_settle", + "iat_entry_coding_error", + "improper_effective_entry_date", + "improper_source_document_source_document_presented", + "invalid_company_id", + "invalid_foreign_receiving_dfi_identification", + "invalid_individual_id_number", + "item_and_rck_entry_presented_for_payment", + "item_related_to_rck_entry_is_ineligible", + "mandatory_field_error", + "misrouted_dishonored_return", + "misrouted_return", + "no_errors_found", + "non_acceptance_of_r62_dishonored_return", + "non_participant_in_iat_program", + "permissible_return_entry", + "permissible_return_entry_not_accepted", + "rdfi_non_settlement", + "rdfi_participant_in_check_truncation_program", + "representative_payee_deceased_or_unable_to_continue_in_that_capacity", + "return_not_a_duplicate", + "return_of_erroneous_or_reversing_debit", + "return_of_improper_credit_entry", + "return_of_improper_debit_entry", + "return_of_xck_entry", + "source_document_presented_for_payment", + "state_law_affecting_rck_acceptance", + "stop_payment_on_item_related_to_rck_entry", + "stop_payment_on_source_document", + "timely_original_return", + "trace_number_error", + "untimely_dishonored_return", + "untimely_return", ] """Why the ACH Transfer was returned.""" @@ -853,6 +904,7 @@ class SourceInternalSource(BaseModel): """ reason: Literal[ + "account_closure", "bank_migration", "cashback", "collection_receivable", diff --git a/tests/api_resources/entities/test_supplemental_documents.py b/tests/api_resources/entities/test_supplemental_documents.py index 4f8a89822..08b95da2c 100644 --- a/tests/api_resources/entities/test_supplemental_documents.py +++ b/tests/api_resources/entities/test_supplemental_documents.py @@ -9,6 +9,8 @@ from increase import Increase, AsyncIncrease from tests.utils import assert_matches_type from increase.types import Entity +from increase.pagination import SyncPage, AsyncPage +from increase.types.entities import SupplementalDocument base_url = os.environ.get("API_BASE_URL", "http://127.0.0.1:4010") api_key = os.environ.get("API_KEY", "something1234") @@ -27,6 +29,22 @@ def test_method_create(self, client: Increase) -> None: ) assert_matches_type(Entity, supplemental_document, path=["response"]) + @parametrize + def test_method_list(self, client: Increase) -> None: + supplemental_document = client.entities.supplemental_documents.list( + entity_id="string", + ) + assert_matches_type(SyncPage[SupplementalDocument], supplemental_document, path=["response"]) + + @parametrize + def test_method_list_with_all_params(self, client: Increase) -> None: + supplemental_document = client.entities.supplemental_documents.list( + entity_id="string", + cursor="string", + limit=0, + ) + assert_matches_type(SyncPage[SupplementalDocument], supplemental_document, path=["response"]) + class TestAsyncSupplementalDocuments: strict_client = AsyncIncrease(base_url=base_url, api_key=api_key, _strict_response_validation=True) @@ -40,3 +58,19 @@ async def test_method_create(self, client: AsyncIncrease) -> None: file_id="string", ) assert_matches_type(Entity, supplemental_document, path=["response"]) + + @parametrize + async def test_method_list(self, client: AsyncIncrease) -> None: + supplemental_document = await client.entities.supplemental_documents.list( + entity_id="string", + ) + assert_matches_type(AsyncPage[SupplementalDocument], supplemental_document, path=["response"]) + + @parametrize + async def test_method_list_with_all_params(self, client: AsyncIncrease) -> None: + supplemental_document = await client.entities.supplemental_documents.list( + entity_id="string", + cursor="string", + limit=0, + ) + assert_matches_type(AsyncPage[SupplementalDocument], supplemental_document, path=["response"]) diff --git a/tests/api_resources/simulations/test_programs.py b/tests/api_resources/simulations/test_programs.py new file mode 100644 index 000000000..38fea4d1c --- /dev/null +++ b/tests/api_resources/simulations/test_programs.py @@ -0,0 +1,40 @@ +# File generated from our OpenAPI spec by Stainless. + +from __future__ import annotations + +import os + +import pytest + +from increase import Increase, AsyncIncrease +from tests.utils import assert_matches_type +from increase.types import Program + +base_url = os.environ.get("API_BASE_URL", "http://127.0.0.1:4010") +api_key = os.environ.get("API_KEY", "something1234") + + +class TestPrograms: + strict_client = Increase(base_url=base_url, api_key=api_key, _strict_response_validation=True) + loose_client = Increase(base_url=base_url, api_key=api_key, _strict_response_validation=False) + parametrize = pytest.mark.parametrize("client", [strict_client, loose_client], ids=["strict", "loose"]) + + @parametrize + def test_method_create(self, client: Increase) -> None: + program = client.simulations.programs.create( + name="x", + ) + assert_matches_type(Program, program, path=["response"]) + + +class TestAsyncPrograms: + strict_client = AsyncIncrease(base_url=base_url, api_key=api_key, _strict_response_validation=True) + loose_client = AsyncIncrease(base_url=base_url, api_key=api_key, _strict_response_validation=False) + parametrize = pytest.mark.parametrize("client", [strict_client, loose_client], ids=["strict", "loose"]) + + @parametrize + async def test_method_create(self, client: AsyncIncrease) -> None: + program = await client.simulations.programs.create( + name="x", + ) + assert_matches_type(Program, program, path=["response"]) diff --git a/tests/api_resources/test_accounts.py b/tests/api_resources/test_accounts.py index b0656ebd5..57003932c 100644 --- a/tests/api_resources/test_accounts.py +++ b/tests/api_resources/test_accounts.py @@ -76,6 +76,7 @@ def test_method_list_with_all_params(self, client: Increase) -> None: }, cursor="string", entity_id="string", + informational_entity_id="string", limit=0, status="open", ) @@ -150,6 +151,7 @@ async def test_method_list_with_all_params(self, client: AsyncIncrease) -> None: }, cursor="string", entity_id="string", + informational_entity_id="string", limit=0, status="open", )