From 3afbb6588265f9fa327b998d037362e03493ff00 Mon Sep 17 00:00:00 2001
From: "fern-api[bot]" <115122769+fern-api[bot]@users.noreply.github.com>
Date: Thu, 1 Oct 2026 16:21:49 +0000
Subject: [PATCH 1/2] [fern-generated] Update SDK
Generated by Fern
CLI Version: 0.66.25
Generators:
- fernapi/fern-python-sdk: 4.3.18
---
.fern/replay.lock | 10 +
.fernignore | 3 +
.gitattributes | 1 +
poetry.lock | 111 +++---
reference.md | 222 ++++++++++-
src/sayari/__init__.py | 42 ++
src/sayari/base_client.py | 8 +
src/sayari/generated_types/__init__.py | 10 +
src/sayari/generated_types/types/__init__.py | 10 +
.../types/attribute_details.py | 2 +
.../generated_types/types/attributes.py | 1 +
.../types/esg_event_intensity.py | 5 +
.../generated_types/types/identifier_type.py | 21 +
.../types/monetary_value_context.py | 1 +
src/sayari/generated_types/types/risk.py | 131 +++++++
.../generated_types/types/risk_category.py | 1 +
.../types/risk_event_category.py | 23 ++
.../generated_types/types/risk_event_data.py | 20 +
.../generated_types/types/risk_event_info.py | 26 ++
.../types/risk_event_properties.py | 105 +++++
src/sayari/generated_types/types/tag.py | 7 +
src/sayari/generated_types/types/unit.py | 17 +-
.../types/weak_identifier_type.py | 13 +
src/sayari/metadata/client.py | 4 +-
src/sayari/project_entity/__init__.py | 2 +
src/sayari/project_entity/client.py | 56 ++-
src/sayari/project_entity/types/__init__.py | 2 +
.../create_resolved_project_entity_request.py | 33 +-
.../types/project_entities_response.py | 4 +-
.../types/resolution_attr_schema.py | 34 ++
.../types/resolution_attributes.py | 20 +-
.../types/save_project_entity_body.py | 4 +-
...ty_supply_chain_snapshot_by_id_response.py | 12 +-
src/sayari/resolution/client.py | 4 +-
src/sayari/screen/__init__.py | 27 ++
src/sayari/screen/client.py | 367 ++++++++++++++++++
src/sayari/screen/types/__init__.py | 25 ++
src/sayari/screen/types/screen_response.py | 345 ++++++++++++++++
.../screen/types/screen_response_attribute.py | 21 +
.../types/screen_response_attribute_value.py | 19 +
.../screen/types/screen_response_item.py | 30 ++
.../screen/types/screen_response_match.py | 22 ++
.../screen/types/screen_response_request.py | 23 ++
.../screen/types/watchlist_attribute_value.py | 5 +
.../screen/types/watchlist_entity_match.py | 153 ++++++++
.../screen/types/watchlist_key_value.py | 24 ++
.../watchlist_risk_intelligence_value.py | 74 ++++
src/sayari/screen_by_name/__init__.py | 2 +
src/sayari/screen_by_name/client.py | 336 ++++++++++++++++
src/sayari/shared_errors/__init__.py | 4 +
src/sayari/shared_errors/errors/__init__.py | 2 +
src/sayari/shared_errors/errors/forbidden.py | 9 +
src/sayari/shared_errors/types/__init__.py | 2 +
.../shared_errors/types/forbidden_response.py | 25 ++
54 files changed, 2344 insertions(+), 136 deletions(-)
create mode 100644 .fern/replay.lock
create mode 100644 .gitattributes
create mode 100644 src/sayari/generated_types/types/esg_event_intensity.py
create mode 100644 src/sayari/generated_types/types/risk_event_category.py
create mode 100644 src/sayari/generated_types/types/risk_event_data.py
create mode 100644 src/sayari/generated_types/types/risk_event_info.py
create mode 100644 src/sayari/generated_types/types/risk_event_properties.py
create mode 100644 src/sayari/project_entity/types/resolution_attr_schema.py
create mode 100644 src/sayari/screen/__init__.py
create mode 100644 src/sayari/screen/client.py
create mode 100644 src/sayari/screen/types/__init__.py
create mode 100644 src/sayari/screen/types/screen_response.py
create mode 100644 src/sayari/screen/types/screen_response_attribute.py
create mode 100644 src/sayari/screen/types/screen_response_attribute_value.py
create mode 100644 src/sayari/screen/types/screen_response_item.py
create mode 100644 src/sayari/screen/types/screen_response_match.py
create mode 100644 src/sayari/screen/types/screen_response_request.py
create mode 100644 src/sayari/screen/types/watchlist_attribute_value.py
create mode 100644 src/sayari/screen/types/watchlist_entity_match.py
create mode 100644 src/sayari/screen/types/watchlist_key_value.py
create mode 100644 src/sayari/screen/types/watchlist_risk_intelligence_value.py
create mode 100644 src/sayari/screen_by_name/__init__.py
create mode 100644 src/sayari/screen_by_name/client.py
create mode 100644 src/sayari/shared_errors/errors/forbidden.py
create mode 100644 src/sayari/shared_errors/types/forbidden_response.py
diff --git a/.fern/replay.lock b/.fern/replay.lock
new file mode 100644
index 00000000..7f00e888
--- /dev/null
+++ b/.fern/replay.lock
@@ -0,0 +1,10 @@
+# DO NOT EDIT MANUALLY - Managed by Fern Replay
+version: "1.0"
+generations:
+ - commit_sha: 15a726d62e8fe792e6ef72ffe6ecdc4375d0e6c4
+ tree_hash: 628b62a9f7cbb0b776ad23016aaaeb08f912cba5
+ timestamp: 2026-10-01T16:21:46.695Z
+ cli_version: unknown
+ generator_versions: {}
+current_generation: 15a726d62e8fe792e6ef72ffe6ecdc4375d0e6c4
+patches: []
diff --git a/.fernignore b/.fernignore
index 41c1e958..08ebcbb6 100644
--- a/.fernignore
+++ b/.fernignore
@@ -6,3 +6,6 @@ Makefile
README.md
src/sayari/client.py
tests/custom/test_sdk.py
+.fern/replay.lock
+.fern/replay.yml
+.gitattributes
diff --git a/.gitattributes b/.gitattributes
new file mode 100644
index 00000000..74928d6a
--- /dev/null
+++ b/.gitattributes
@@ -0,0 +1 @@
+.fern/replay.lock linguist-generated=true
diff --git a/poetry.lock b/poetry.lock
index f4d44285..28102320 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -38,13 +38,13 @@ trio = ["trio (>=0.26.1)"]
[[package]]
name = "certifi"
-version = "2025.11.12"
+version = "2026.7.22"
description = "Python package for providing Mozilla's CA Bundle."
optional = false
python-versions = ">=3.7"
files = [
- {file = "certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b"},
- {file = "certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316"},
+ {file = "certifi-2026.7.22-py3-none-any.whl", hash = "sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775"},
+ {file = "certifi-2026.7.22.tar.gz", hash = "sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55"},
]
[[package]]
@@ -133,17 +133,17 @@ zstd = ["zstandard (>=0.18.0)"]
[[package]]
name = "idna"
-version = "3.11"
+version = "3.15"
description = "Internationalized Domain Names in Applications (IDNA)"
optional = false
python-versions = ">=3.8"
files = [
- {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"},
- {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"},
+ {file = "idna-3.15-py3-none-any.whl", hash = "sha256:048adeaf8c2d788c40fee287673ccaa74c24ffd8dcf09ffa555a2fbb59f10ac8"},
+ {file = "idna-3.15.tar.gz", hash = "sha256:ca962446ea538f7092a95e057da437618e886f4d349216d2b1e294abfdb65fdc"},
]
[package.extras]
-all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
+all = ["mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
[[package]]
name = "iniconfig"
@@ -215,13 +215,13 @@ files = [
[[package]]
name = "packaging"
-version = "25.0"
+version = "26.2"
description = "Core utilities for Python packages"
optional = false
python-versions = ">=3.8"
files = [
- {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"},
- {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"},
+ {file = "packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e"},
+ {file = "packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661"},
]
[[package]]
@@ -476,53 +476,58 @@ files = [
[[package]]
name = "tomli"
-version = "2.3.0"
+version = "2.4.1"
description = "A lil' TOML parser"
optional = false
python-versions = ">=3.8"
files = [
- {file = "tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45"},
- {file = "tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba"},
- {file = "tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf"},
- {file = "tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441"},
- {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845"},
- {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c"},
- {file = "tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456"},
- {file = "tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be"},
- {file = "tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac"},
- {file = "tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22"},
- {file = "tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f"},
- {file = "tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52"},
- {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8"},
- {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6"},
- {file = "tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876"},
- {file = "tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878"},
- {file = "tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b"},
- {file = "tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae"},
- {file = "tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b"},
- {file = "tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf"},
- {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f"},
- {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05"},
- {file = "tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606"},
- {file = "tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999"},
- {file = "tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e"},
- {file = "tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3"},
- {file = "tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc"},
- {file = "tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0"},
- {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879"},
- {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005"},
- {file = "tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463"},
- {file = "tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8"},
- {file = "tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77"},
- {file = "tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf"},
- {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530"},
- {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b"},
- {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67"},
- {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f"},
- {file = "tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0"},
- {file = "tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba"},
- {file = "tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b"},
- {file = "tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549"},
+ {file = "tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30"},
+ {file = "tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a"},
+ {file = "tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076"},
+ {file = "tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9"},
+ {file = "tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c"},
+ {file = "tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc"},
+ {file = "tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049"},
+ {file = "tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e"},
+ {file = "tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece"},
+ {file = "tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a"},
+ {file = "tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085"},
+ {file = "tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9"},
+ {file = "tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5"},
+ {file = "tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585"},
+ {file = "tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1"},
+ {file = "tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917"},
+ {file = "tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9"},
+ {file = "tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257"},
+ {file = "tomli-2.4.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:36d2bd2ad5fb9eaddba5226aa02c8ec3fa4f192631e347b3ed28186d43be6b54"},
+ {file = "tomli-2.4.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb0dc4e38e6a1fd579e5d50369aa2e10acfc9cace504579b2faabb478e76941a"},
+ {file = "tomli-2.4.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7f2c7f2b9ca6bdeef8f0fa897f8e05085923eb091721675170254cbc5b02897"},
+ {file = "tomli-2.4.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f3c6818a1a86dd6dca7ddcaaf76947d5ba31aecc28cb1b67009a5877c9a64f3f"},
+ {file = "tomli-2.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d312ef37c91508b0ab2cee7da26ec0b3ed2f03ce12bd87a588d771ae15dcf82d"},
+ {file = "tomli-2.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51529d40e3ca50046d7606fa99ce3956a617f9b36380da3b7f0dd3dd28e68cb5"},
+ {file = "tomli-2.4.1-cp313-cp313-win32.whl", hash = "sha256:2190f2e9dd7508d2a90ded5ed369255980a1bcdd58e52f7fe24b8162bf9fedbd"},
+ {file = "tomli-2.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:8d65a2fbf9d2f8352685bc1364177ee3923d6baf5e7f43ea4959d7d8bc326a36"},
+ {file = "tomli-2.4.1-cp313-cp313-win_arm64.whl", hash = "sha256:4b605484e43cdc43f0954ddae319fb75f04cc10dd80d830540060ee7cd0243cd"},
+ {file = "tomli-2.4.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:fd0409a3653af6c147209d267a0e4243f0ae46b011aa978b1080359fddc9b6cf"},
+ {file = "tomli-2.4.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:a120733b01c45e9a0c34aeef92bf0cf1d56cfe81ed9d47d562f9ed591a9828ac"},
+ {file = "tomli-2.4.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:559db847dc486944896521f68d8190be1c9e719fced785720d2216fe7022b662"},
+ {file = "tomli-2.4.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01f520d4f53ef97964a240a035ec2a869fe1a37dde002b57ebc4417a27ccd853"},
+ {file = "tomli-2.4.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7f94b27a62cfad8496c8d2513e1a222dd446f095fca8987fceef261225538a15"},
+ {file = "tomli-2.4.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ede3e6487c5ef5d28634ba3f31f989030ad6af71edfb0055cbbd14189ff240ba"},
+ {file = "tomli-2.4.1-cp314-cp314-win32.whl", hash = "sha256:3d48a93ee1c9b79c04bb38772ee1b64dcf18ff43085896ea460ca8dec96f35f6"},
+ {file = "tomli-2.4.1-cp314-cp314-win_amd64.whl", hash = "sha256:88dceee75c2c63af144e456745e10101eb67361050196b0b6af5d717254dddf7"},
+ {file = "tomli-2.4.1-cp314-cp314-win_arm64.whl", hash = "sha256:b8c198f8c1805dc42708689ed6864951fd2494f924149d3e4bce7710f8eb5232"},
+ {file = "tomli-2.4.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:d4d8fe59808a54658fcc0160ecfb1b30f9089906c50b23bcb4c69eddc19ec2b4"},
+ {file = "tomli-2.4.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7008df2e7655c495dd12d2a4ad038ff878d4ca4b81fccaf82b714e07eae4402c"},
+ {file = "tomli-2.4.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1d8591993e228b0c930c4bb0db464bdad97b3289fb981255d6c9a41aedc84b2d"},
+ {file = "tomli-2.4.1-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:734e20b57ba95624ecf1841e72b53f6e186355e216e5412de414e3c51e5e3c41"},
+ {file = "tomli-2.4.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8a650c2dbafa08d42e51ba0b62740dae4ecb9338eefa093aa5c78ceb546fcd5c"},
+ {file = "tomli-2.4.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:504aa796fe0569bb43171066009ead363de03675276d2d121ac1a4572397870f"},
+ {file = "tomli-2.4.1-cp314-cp314t-win32.whl", hash = "sha256:b1d22e6e9387bf4739fbe23bfa80e93f6b0373a7f1b96c6227c32bef95a4d7a8"},
+ {file = "tomli-2.4.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2c1c351919aca02858f740c6d33adea0c5deea37f9ecca1cc1ef9e884a619d26"},
+ {file = "tomli-2.4.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eab21f45c7f66c13f2a9e0e1535309cee140182a9cdae1e041d02e47291e8396"},
+ {file = "tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe"},
+ {file = "tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f"},
]
[[package]]
diff --git a/reference.md b/reference.md
index d9af5d89..b6fbafee 100644
--- a/reference.md
+++ b/reference.md
@@ -1059,7 +1059,7 @@ client.info.get_history()
-
-Get metadta about the api, both its versions, which releases are present, and the identity of the authenticated user.
+Get metadata about the api, both its versions, which releases are present, and the identity of the authenticated user.
@@ -3396,7 +3396,10 @@ The resolution endpoints allow users to search for matching entities against a p
```python
from sayari import Sayari
-from sayari.project_entity import CreateResolvedProjectEntityRequest
+from sayari.project_entity import (
+ CreateResolvedProjectEntityRequest,
+ ResolutionAttrSchema,
+)
client = Sayari(
client_id="YOUR_CLIENT_ID",
@@ -3405,11 +3408,15 @@ client = Sayari(
client.project_entity.create_project_entity(
project_id="0n4473",
request=CreateResolvedProjectEntityRequest(
- name=["Marvel Garment"],
- country=["KHM"],
- address=[
- "Beung Thom 3 Village, Sangkat Beung Thom, Posenchey, Phnom Penh"
- ],
+ limit=25,
+ profile="suppliers",
+ attributes=ResolutionAttrSchema(
+ name=["Marvel Garment"],
+ country=["KHM"],
+ address=[
+ "Beung Thom 3 Village, Sangkat Beung Thom, Posenchey, Phnom Penh"
+ ],
+ ),
),
)
@@ -4069,7 +4076,7 @@ Checks if a project entity with the given attributes already exists.
```python
from sayari import Sayari
-from sayari.project_entity import ResolutionAttributes
+from sayari.project_entity import ResolutionAttributes, ResolutionAttrSchema
client = Sayari(
client_id="YOUR_CLIENT_ID",
@@ -4078,8 +4085,10 @@ client = Sayari(
client.project_entity.project_entity_exists(
project_id="YVB88Y",
request=ResolutionAttributes(
- name=["Example Company"],
- country=["USA"],
+ attributes=ResolutionAttrSchema(
+ name=["Example Company"],
+ country=["USA"],
+ ),
),
)
@@ -4153,7 +4162,7 @@ Stores a project entity given entity IDs and a list of attributes.
```python
from sayari import Sayari
-from sayari.project_entity import ResolutionAttributes, SaveProjectEntityBody
+from sayari.project_entity import ResolutionAttrSchema, SaveProjectEntityBody
client = Sayari(
client_id="YOUR_CLIENT_ID",
@@ -4163,7 +4172,7 @@ client.project_entity.save_project_entity(
project_id="YVB88Y",
request=SaveProjectEntityBody(
entity_ids=["entity_id_1", "entity_id_2"],
- attributes=ResolutionAttributes(
+ attributes=ResolutionAttrSchema(
name=["Example Company"],
country=["USA"],
),
@@ -5711,7 +5720,7 @@ client.resolution.resolution(
-
-**enable_llm_clean:** `typing.Optional[bool]` β Whether to enable LLM-based data cleaning to remove noise and standardize entity attributes. Defaults to true if not supplied. Set to false to disable LLM cleaning.
+**enable_llm_clean:** `typing.Optional[bool]` β Whether to enable LLM-based data cleaning to remove noise and standardize entity attributes. Defaults to false if not supplied. Set to true to enable LLM cleaning.
@@ -6186,6 +6195,193 @@ client.resource.delete_resource(
+
+
+
+
+## ScreenByName
+client.screen_by_name.screen_by_name(...)
+
+-
+
+#### π Description
+
+
+-
+
+
+-
+
+Screen a name against watchlist records to identify potential matches. Requires the `screened_risk` role.
+
+
+
+
+
+#### π Usage
+
+
+-
+
+
+-
+
+```python
+from sayari import Sayari
+
+client = Sayari(
+ client_id="YOUR_CLIENT_ID",
+ client_secret="YOUR_CLIENT_SECRET",
+)
+client.screen_by_name.screen_by_name(
+ name="AEROCARIBBEAN AIRLINES",
+ type="company",
+)
+
+```
+
+
+
+
+
+#### βοΈ Parameters
+
+
+-
+
+
+-
+
+**name:** `str` β Name to screen against watchlist records.
+
+
+
+
+
+-
+
+**type:** `typing.Optional[str]` β Comma-separated list of watchlist record types to filter by.
+
+
+
+
+
+-
+
+**release_name:** `typing.Optional[str]` β Watchlist release name to filter by.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` β Request-specific configuration.
+
+
+
+
+
+
+
+
+
+
+
+## Screen
+client.screen.screen(...)
+
+-
+
+#### π Description
+
+
+-
+
+
+-
+
+Screen a project entity against watchlist records to identify potential matches. Requires the `screened_risk` role.
+
+
+
+
+
+#### π Usage
+
+
+-
+
+
+-
+
+```python
+from sayari import Sayari
+
+client = Sayari(
+ client_id="YOUR_CLIENT_ID",
+ client_secret="YOUR_CLIENT_SECRET",
+)
+client.screen.screen(
+ project_id="YVB88Y",
+ project_entity_id="YVodz6",
+ type="company",
+)
+
+```
+
+
+
+
+
+#### βοΈ Parameters
+
+
+-
+
+
+-
+
+**project_id:** `str` β Project identifier.
+
+
+
+
+
+-
+
+**project_entity_id:** `str` β Project entity identifier.
+
+
+
+
+
+-
+
+**type:** `typing.Optional[str]` β Comma-separated list of watchlist record types to filter by.
+
+
+
+
+
+-
+
+**release_name:** `typing.Optional[str]` β Watchlist release name to filter by.
+
+
+
+
+
+-
+
+**request_options:** `typing.Optional[RequestOptions]` β Request-specific configuration.
+
+
+
+
+
+
+
diff --git a/src/sayari/__init__.py b/src/sayari/__init__.py
index 26543ce7..e1ccd97b 100644
--- a/src/sayari/__init__.py
+++ b/src/sayari/__init__.py
@@ -18,6 +18,8 @@
record,
resolution,
resource,
+ screen,
+ screen_by_name,
search,
shared_errors,
shared_types,
@@ -65,6 +67,7 @@
DateOfBirthInfo,
DateOfBirthProperties,
Entities,
+ EsgEventIntensity,
FinanceType,
FinancesData,
FinancesInfo,
@@ -107,6 +110,10 @@
ReportingPeriodType,
Risk,
RiskCategory,
+ RiskEventCategory,
+ RiskEventData,
+ RiskEventInfo,
+ RiskEventProperties,
RiskIntelligenceData,
RiskIntelligenceInfo,
RiskIntelligenceProperties,
@@ -262,6 +269,7 @@
ProjectRiskChangesResponse,
ProjectRiskChangesResponseData,
ProjectRiskFactor,
+ ResolutionAttrSchema,
ResolutionAttributes,
ResolutionProfile,
RiskCategoriesSummary,
@@ -324,6 +332,18 @@
ResolutionUploadResponse,
)
from .resource import DeleteResourceResponse, EntityResponseData, ResourceType, SaveEntityRequest, SaveEntityResponse
+from .screen import (
+ ScreenResponse,
+ ScreenResponseAttribute,
+ ScreenResponseAttributeValue,
+ ScreenResponseItem,
+ ScreenResponseMatch,
+ ScreenResponseRequest,
+ WatchlistAttributeValue,
+ WatchlistEntityMatch,
+ WatchlistKeyValue,
+ WatchlistRiskIntelligenceValue,
+)
from .search import (
Coordinates,
EntitySearchResponse,
@@ -340,6 +360,8 @@
BadRequestResponse,
ConnectionError,
ConnectionErrorResponse,
+ Forbidden,
+ ForbiddenResponse,
InternalServerError,
InternalServerErrorResponse,
MethodNotAllowed,
@@ -525,6 +547,7 @@
"EntitySummary",
"EntitySummaryResponse",
"EntityTranslatedLabel",
+ "EsgEventIntensity",
"EventInfo",
"FacetBucket",
"FacetsResponse",
@@ -537,6 +560,8 @@
"FinancialsData",
"FinancialsInfo",
"FinancialsProperties",
+ "Forbidden",
+ "ForbiddenResponse",
"Gender",
"GenderData",
"GenderInfo",
@@ -717,6 +742,7 @@
"RelationshipInfo",
"Relationships",
"ReportingPeriodType",
+ "ResolutionAttrSchema",
"ResolutionAttributes",
"ResolutionBody",
"ResolutionPersistedResponse",
@@ -738,6 +764,10 @@
"RiskChangeFactorChangeType",
"RiskChangeFilters",
"RiskData",
+ "RiskEventCategory",
+ "RiskEventData",
+ "RiskEventInfo",
+ "RiskEventProperties",
"RiskFactor",
"RiskIntelligenceData",
"RiskIntelligenceInfo",
@@ -752,6 +782,12 @@
"SaveProjectEntityBody",
"Sayari",
"SayariEnvironment",
+ "ScreenResponse",
+ "ScreenResponseAttribute",
+ "ScreenResponseAttributeValue",
+ "ScreenResponseItem",
+ "ScreenResponseMatch",
+ "ScreenResponseRequest",
"SearchField",
"SearchResults",
"ShareInformation",
@@ -833,6 +869,10 @@
"UsageInfo",
"UsageResponse",
"UserInfo",
+ "WatchlistAttributeValue",
+ "WatchlistEntityMatch",
+ "WatchlistKeyValue",
+ "WatchlistRiskIntelligenceValue",
"WeakIdentifierData",
"WeakIdentifierInfo",
"WeakIdentifierProperties",
@@ -856,6 +896,8 @@
"record",
"resolution",
"resource",
+ "screen",
+ "screen_by_name",
"search",
"shared_errors",
"shared_types",
diff --git a/src/sayari/base_client.py b/src/sayari/base_client.py
index 81965b11..db20cddc 100644
--- a/src/sayari/base_client.py
+++ b/src/sayari/base_client.py
@@ -20,6 +20,8 @@
from .record.client import RecordClient
from .resolution.client import ResolutionClient
from .resource.client import ResourceClient
+from .screen_by_name.client import ScreenByNameClient
+from .screen.client import ScreenClient
from .search.client import SearchClient
from .supply_chain.client import SupplyChainClient
from .trade.client import TradeClient
@@ -40,6 +42,8 @@
from .record.client import AsyncRecordClient
from .resolution.client import AsyncResolutionClient
from .resource.client import AsyncResourceClient
+from .screen_by_name.client import AsyncScreenByNameClient
+from .screen.client import AsyncScreenClient
from .search.client import AsyncSearchClient
from .supply_chain.client import AsyncSupplyChainClient
from .trade.client import AsyncTradeClient
@@ -137,6 +141,8 @@ def __init__(
self.record = RecordClient(client_wrapper=self._client_wrapper)
self.resolution = ResolutionClient(client_wrapper=self._client_wrapper)
self.resource = ResourceClient(client_wrapper=self._client_wrapper)
+ self.screen_by_name = ScreenByNameClient(client_wrapper=self._client_wrapper)
+ self.screen = ScreenClient(client_wrapper=self._client_wrapper)
self.search = SearchClient(client_wrapper=self._client_wrapper)
self.supply_chain = SupplyChainClient(client_wrapper=self._client_wrapper)
self.trade = TradeClient(client_wrapper=self._client_wrapper)
@@ -234,6 +240,8 @@ def __init__(
self.record = AsyncRecordClient(client_wrapper=self._client_wrapper)
self.resolution = AsyncResolutionClient(client_wrapper=self._client_wrapper)
self.resource = AsyncResourceClient(client_wrapper=self._client_wrapper)
+ self.screen_by_name = AsyncScreenByNameClient(client_wrapper=self._client_wrapper)
+ self.screen = AsyncScreenClient(client_wrapper=self._client_wrapper)
self.search = AsyncSearchClient(client_wrapper=self._client_wrapper)
self.supply_chain = AsyncSupplyChainClient(client_wrapper=self._client_wrapper)
self.trade = AsyncTradeClient(client_wrapper=self._client_wrapper)
diff --git a/src/sayari/generated_types/__init__.py b/src/sayari/generated_types/__init__.py
index 6c99cdac..1d58c954 100644
--- a/src/sayari/generated_types/__init__.py
+++ b/src/sayari/generated_types/__init__.py
@@ -34,6 +34,7 @@
DateOfBirthInfo,
DateOfBirthProperties,
Entities,
+ EsgEventIntensity,
FinanceType,
FinancesData,
FinancesInfo,
@@ -76,6 +77,10 @@
ReportingPeriodType,
Risk,
RiskCategory,
+ RiskEventCategory,
+ RiskEventData,
+ RiskEventInfo,
+ RiskEventProperties,
RiskIntelligenceData,
RiskIntelligenceInfo,
RiskIntelligenceProperties,
@@ -132,6 +137,7 @@
"DateOfBirthInfo",
"DateOfBirthProperties",
"Entities",
+ "EsgEventIntensity",
"FinanceType",
"FinancesData",
"FinancesInfo",
@@ -174,6 +180,10 @@
"ReportingPeriodType",
"Risk",
"RiskCategory",
+ "RiskEventCategory",
+ "RiskEventData",
+ "RiskEventInfo",
+ "RiskEventProperties",
"RiskIntelligenceData",
"RiskIntelligenceInfo",
"RiskIntelligenceProperties",
diff --git a/src/sayari/generated_types/types/__init__.py b/src/sayari/generated_types/types/__init__.py
index 2682d8cf..277a2b11 100644
--- a/src/sayari/generated_types/types/__init__.py
+++ b/src/sayari/generated_types/types/__init__.py
@@ -33,6 +33,7 @@
from .date_of_birth_info import DateOfBirthInfo
from .date_of_birth_properties import DateOfBirthProperties
from .entities import Entities
+from .esg_event_intensity import EsgEventIntensity
from .finance_type import FinanceType
from .finances_data import FinancesData
from .finances_info import FinancesInfo
@@ -75,6 +76,10 @@
from .reporting_period_type import ReportingPeriodType
from .risk import Risk
from .risk_category import RiskCategory
+from .risk_event_category import RiskEventCategory
+from .risk_event_data import RiskEventData
+from .risk_event_info import RiskEventInfo
+from .risk_event_properties import RiskEventProperties
from .risk_intelligence_data import RiskIntelligenceData
from .risk_intelligence_info import RiskIntelligenceInfo
from .risk_intelligence_properties import RiskIntelligenceProperties
@@ -130,6 +135,7 @@
"DateOfBirthInfo",
"DateOfBirthProperties",
"Entities",
+ "EsgEventIntensity",
"FinanceType",
"FinancesData",
"FinancesInfo",
@@ -172,6 +178,10 @@
"ReportingPeriodType",
"Risk",
"RiskCategory",
+ "RiskEventCategory",
+ "RiskEventData",
+ "RiskEventInfo",
+ "RiskEventProperties",
"RiskIntelligenceData",
"RiskIntelligenceInfo",
"RiskIntelligenceProperties",
diff --git a/src/sayari/generated_types/types/attribute_details.py b/src/sayari/generated_types/types/attribute_details.py
index f4ac03a7..7ec9f8b3 100644
--- a/src/sayari/generated_types/types/attribute_details.py
+++ b/src/sayari/generated_types/types/attribute_details.py
@@ -19,6 +19,7 @@
from .name_info import NameInfo
from .person_status_info import PersonStatusInfo
from .position_info import PositionInfo
+from .risk_event_info import RiskEventInfo
from .risk_intelligence_info import RiskIntelligenceInfo
from .shares_info import SharesInfo
from .status_info import StatusInfo
@@ -46,6 +47,7 @@ class AttributeDetails(UniversalBaseModel):
name: typing.Optional[NameInfo] = None
person_status: typing.Optional[PersonStatusInfo] = None
position: typing.Optional[PositionInfo] = None
+ risk_event: typing.Optional[RiskEventInfo] = None
risk_intelligence: typing.Optional[RiskIntelligenceInfo] = None
shares: typing.Optional[SharesInfo] = None
status: typing.Optional[StatusInfo] = None
diff --git a/src/sayari/generated_types/types/attributes.py b/src/sayari/generated_types/types/attributes.py
index 5a82abf4..d53af7ac 100644
--- a/src/sayari/generated_types/types/attributes.py
+++ b/src/sayari/generated_types/types/attributes.py
@@ -21,6 +21,7 @@
"name",
"person_status",
"position",
+ "risk_event",
"risk_intelligence",
"shares",
"status",
diff --git a/src/sayari/generated_types/types/esg_event_intensity.py b/src/sayari/generated_types/types/esg_event_intensity.py
new file mode 100644
index 00000000..5dcfeed1
--- /dev/null
+++ b/src/sayari/generated_types/types/esg_event_intensity.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+EsgEventIntensity = typing.Union[typing.Literal["high", "low", "medium"], typing.Any]
diff --git a/src/sayari/generated_types/types/identifier_type.py b/src/sayari/generated_types/types/identifier_type.py
index bde8faac..a50811ef 100644
--- a/src/sayari/generated_types/types/identifier_type.py
+++ b/src/sayari/generated_types/types/identifier_type.py
@@ -4,6 +4,7 @@
IdentifierType = typing.Union[
typing.Literal[
+ "acer_code",
"aer_free_zone_license",
"aer_free_zone_reg_no",
"aer_ner_number",
@@ -32,6 +33,7 @@
"arm_enterprise_code",
"arm_passport_number",
"arm_registration_no",
+ "arm_statement_identifier",
"arm_vat_no",
"aruba_chamber_of_commerce_id",
"atg_business_registry_internal_id",
@@ -43,6 +45,7 @@
"aus_consolidated_sanctions_reference",
"aus_credit_licence_number",
"aus_credit_rep_number",
+ "aus_equifax_uhc_name_hash",
"aus_passport",
"aus_trademark_reg_no",
"aut_firmenbuch_no",
@@ -62,6 +65,7 @@
"bgr_uic",
"bh_cr_number",
"bh_cr_number_and_branch",
+ "bhr_passport",
"bhs_tin",
"bih_customs_number",
"bih_jib_number",
@@ -106,6 +110,7 @@
"can_pe_registration_number",
"can_qc_mbs_num",
"can_qc_sap_registry_ref_num",
+ "can_sedar_profile_number",
"can_techsalerator_id",
"can_tm_registration_no",
"ccamlr_rfmo_id",
@@ -120,6 +125,7 @@
"chl_import_export_control_id",
"chl_import_manifest_number",
"chl_importer_exporter_id",
+ "chn_algorithm_filing_no",
"chn_cninfo_internal_shareholder_id",
"chn_cnipa_tm",
"chn_csrc_no",
@@ -194,6 +200,7 @@
"ecu_shipment_ref_no",
"egy_id",
"egy_passport",
+ "eic_code",
"esp_be_code",
"esp_borme_reg_id",
"esp_cif",
@@ -242,12 +249,15 @@
"ggy_trademark_no",
"ggy_trademark_submission_ref",
"gib_corp_reg_number",
+ "gln_code",
"global_trade_internal_shipment_id",
"grc_afm_number",
"grc_gemi_number",
+ "grc_passport",
"grc_vat_number",
"gtm_cui_number",
"gtm_nit_number",
+ "hkg_identity_card",
"hkg_stock_code",
"hkg_tender_ref_code",
"hnd_coc_company_registration_number",
@@ -274,6 +284,7 @@
"ihs_owner_code",
"imn_company_number",
"imo_no",
+ "ind_bse_ticker_code",
"ind_charity_registration_number",
"ind_company_registration_number",
"ind_coopsoc_registration_number",
@@ -325,6 +336,7 @@
"jo_internal_id",
"jo_national_institution_number",
"jor_id_no",
+ "jor_passport",
"jor_voter_card_no",
"jordan_company_no",
"jpn_corporate_no",
@@ -346,6 +358,7 @@
"kwt_passport",
"lao_enterprise_number",
"lbn_national_id",
+ "lbn_passport",
"lby_passport",
"lca_business_registry_internal_id",
"lei",
@@ -419,6 +432,7 @@
"nga_crp_reg_internal_id",
"nga_drivers",
"nga_nin",
+ "nga_passport",
"nga_registration_number",
"nga_registration_sn",
"nga_tax_id",
@@ -521,6 +535,7 @@
"slv_uid_number",
"smr_economic_operator_code",
"snl_internal_id",
+ "som_passport",
"som_ubi",
"south_africa_enterprise_number",
"south_africa_passport_number",
@@ -574,6 +589,7 @@
"tza_brela_reg_num",
"tza_tansad_number",
"tza_tin",
+ "uga_passport",
"uga_tin",
"uk_company_number",
"uk_firm_reference_number",
@@ -602,6 +618,7 @@
"usa_cusip_number",
"usa_dc_entity_no",
"usa_dc_file_no",
+ "usa_dc_ssl",
"usa_de_file_number",
"usa_de_registered_agent_id",
"usa_fei_number",
@@ -660,6 +677,7 @@
"usa_oti_id",
"usa_pa_corporate_registry_id",
"usa_piid",
+ "usa_prime_award_unique_key",
"usa_puerto_rico_register_number",
"usa_ri_fei_no",
"usa_sam_exclusions_number",
@@ -671,6 +689,7 @@
"usa_sec_file_number_ia",
"usa_sec_private_fund",
"usa_social_security_number",
+ "usa_subaward_sam_report_id",
"usa_tn_control_no",
"usa_tn_party_id",
"usa_upin_number",
@@ -679,6 +698,7 @@
"usa_uspto_reg_no",
"usa_uspto_serial_number",
"usa_usvi_corp_number",
+ "usa_va_fairfax_parcel_id",
"usa_va_old_reg_id",
"usa_va_reg_id",
"usa_vt_biz_id",
@@ -709,6 +729,7 @@
"wipo_intl_reg_no",
"wsm_reg_id",
"xxx_acuris_id",
+ "xxx_cedar_rose_person_uid",
"xxx_cedar_rose_uid",
"xxx_crb_monitor_entity_id",
"xxx_edi_global_issuer_id",
diff --git a/src/sayari/generated_types/types/monetary_value_context.py b/src/sayari/generated_types/types/monetary_value_context.py
index 92f71e18..9362c661 100644
--- a/src/sayari/generated_types/types/monetary_value_context.py
+++ b/src/sayari/generated_types/types/monetary_value_context.py
@@ -18,6 +18,7 @@
"free_alongside_ship",
"free_carrier",
"free_on_board",
+ "sale_value",
],
typing.Any,
]
diff --git a/src/sayari/generated_types/types/risk.py b/src/sayari/generated_types/types/risk.py
index 478a2ac0..c3efb457 100644
--- a/src/sayari/generated_types/types/risk.py
+++ b/src/sayari/generated_types/types/risk.py
@@ -4,6 +4,7 @@
Risk = typing.Union[
typing.Literal[
+ "acea_default_list",
"aspi_uyghur_forced_labor_report_entity",
"aspi_uyghur_forced_labor_report_entity_adjacent",
"basel_aml",
@@ -12,21 +13,27 @@
"bis_boycott_requester_list",
"bis_entity_minority_ownership",
"bis_meu_minority_ownership",
+ "china_state_asset_controller",
+ "chinese_core_soe",
"chinese_soe_adjacent",
"chinese_state_owned",
+ "cicca_unfulfilled_awards",
"cmic_entity",
"cmic_entity_50_percent_rule",
"controlled_by_aus_sanctioned",
"controlled_by_bis_entity",
"controlled_by_bis_meu",
"controlled_by_eu_sanctioned",
+ "controlled_by_implausible_date_of_birth",
"controlled_by_jpn_sanctioned",
+ "controlled_by_mass_business_registration",
"controlled_by_ofac_fto_sanctioned",
"controlled_by_ofac_illicit_drugs_eo14059_sanctioned",
"controlled_by_ofac_sdgt_sanctioned",
"controlled_by_ofac_sdn",
"controlled_by_ofac_sdnt_sanctioned",
"controlled_by_ofac_sdntk_sanctioned",
+ "controlled_by_tcsp_keyword_risk",
"controlled_by_uk_sanctioned",
"controlled_by_ukr_sanctioned",
"controlled_by_un_sanctioned",
@@ -51,7 +58,9 @@
"export_controls_section_1260h_50_percent_rule",
"export_controls_unverified_list",
"export_controls_unverified_list_50_percent_rule",
+ "export_to_blr_soe",
"export_to_chinese_soe",
+ "export_to_rus_soe",
"export_to_sanctioned",
"export_to_sanctioned_other",
"export_to_soe",
@@ -169,6 +178,8 @@
"formerly_sanctioned_usa_ofac_sdn",
"formerly_sanctioned_xxx_ebrd",
"formerly_sanctioned_xxx_iabd",
+ "ica_unfulfilled_awards",
+ "implausible_date_of_birth",
"imports_bis_high_priority_items",
"imports_bis_high_priority_items_critical_components",
"imports_conflict_minerals",
@@ -180,6 +191,44 @@
"imports_eudr_shipment_soya",
"imports_eudr_shipment_wood",
"imports_from_bis_addresses_high_diversion_risk",
+ "imports_from_jpn_meti_end_user_entity",
+ "imports_from_jpn_mofa_export_ban_entity",
+ "imports_from_sanctioned_arg_repet_jus_entity",
+ "imports_from_sanctioned_aus_dfat_entity",
+ "imports_from_sanctioned_bel_fpsf_entity",
+ "imports_from_sanctioned_can_gac_entity",
+ "imports_from_sanctioned_che_seco_entity",
+ "imports_from_sanctioned_cze_mof_entity",
+ "imports_from_sanctioned_eu_dg_fisma_ec_entity",
+ "imports_from_sanctioned_eu_ec_regulation_833_2014_entity",
+ "imports_from_sanctioned_eu_ec_sanctions_map_entity",
+ "imports_from_sanctioned_eu_sanctions_entity",
+ "imports_from_sanctioned_fra_dgt_mefids_entity",
+ "imports_from_sanctioned_gbr_fcdo_entity",
+ "imports_from_sanctioned_gbr_hmt_ofsi_entity",
+ "imports_from_sanctioned_isr_mod_nbctf_entity",
+ "imports_from_sanctioned_jpn_mof_entity",
+ "imports_from_sanctioned_ltu_mi_entity",
+ "imports_from_sanctioned_lva_fis_entity",
+ "imports_from_sanctioned_mys_moha_entity",
+ "imports_from_sanctioned_nld_mofa_entity",
+ "imports_from_sanctioned_nzl_mfat_rus_entity",
+ "imports_from_sanctioned_pol_mia_entity",
+ "imports_from_sanctioned_sgp_agc_entity",
+ "imports_from_sanctioned_ukr_nsdc_entity",
+ "imports_from_sanctioned_ukr_sfms_entity",
+ "imports_from_sanctioned_un_sc_entity",
+ "imports_from_sanctioned_usa_ofac_non_sdn_entity",
+ "imports_from_sanctioned_usa_ofac_sdn_entity",
+ "imports_from_sanctioned_xxx_ebrd_entity",
+ "imports_from_sanctioned_xxx_iabd_entity",
+ "imports_from_usa_aeca_debarred_entity",
+ "imports_from_usa_bis_denied_persons_entity",
+ "imports_from_usa_bis_entity",
+ "imports_from_usa_bis_meu_entity",
+ "imports_from_usa_bis_unverified_entity",
+ "imports_from_usa_isn_entity",
+ "imports_from_usa_section_1260h_entity",
"imports_ilab_child_labor",
"imports_ilab_forced_labor",
"imports_ndaa_889_telecom_equipment",
@@ -190,6 +239,11 @@
"jpn_meti_end_user",
"jpn_mofa_export_ban",
"law_enforcement_action",
+ "law_enforcement_action_breaking",
+ "law_enforcement_action_historic",
+ "law_enforcement_action_recent",
+ "mass_address_usage",
+ "mass_business_registration",
"meu_list_contractors",
"military_civil_fusion",
"military_civil_fusion_50_percent_rule",
@@ -207,6 +261,7 @@
"ofac_sdntk_sanctioned",
"owned_by_aspi_forced_labor_entity",
"owned_by_bis_meu_entity",
+ "owned_by_blr_soe",
"owned_by_chinese_soe",
"owned_by_cmic_entity",
"owned_by_entity_in_export_controls",
@@ -221,6 +276,8 @@
"owned_by_ofac_sdn_mex_dto_sanctioned",
"owned_by_ofac_sdnt_sanctioned",
"owned_by_ofac_sdntk_sanctioned",
+ "owned_by_regulatory_action_entity",
+ "owned_by_rus_soe",
"owned_by_sanctioned_arg_repet_jus_entity",
"owned_by_sanctioned_aus_dfat_entity",
"owned_by_sanctioned_bel_fpsf_entity",
@@ -255,6 +312,7 @@
"owned_by_section_1260h_entity",
"owned_by_sheffield_hallam_university_reports_forced_labor_entity",
"owned_by_soe",
+ "owned_by_tcsp_keyword_risk",
"owned_by_usa_aeca_debarred_entity",
"owned_by_usa_bis_denied_persons_entity",
"owned_by_usa_bis_entity",
@@ -265,6 +323,7 @@
"owned_by_wro_entity",
"owned_by_xinjiang_entity",
"owner_of_aspi_forced_labor_entity",
+ "owner_of_blr_soe",
"owner_of_chinese_soe",
"owner_of_export_controls_entity",
"owner_of_export_controls_other_entity",
@@ -279,6 +338,7 @@
"owner_of_ofac_sdnt_sanctioned",
"owner_of_ofac_sdntk_sanctioned",
"owner_of_regulatory_action_entity",
+ "owner_of_rus_soe",
"owner_of_sanctioned_arg_repet_jus_entity",
"owner_of_sanctioned_aus_dfat_entity",
"owner_of_sanctioned_bel_fpsf_entity",
@@ -336,7 +396,9 @@
"psa_export_controls_other",
"psa_export_controls_section_1260h_50_percent_rule",
"psa_export_controls_unverified_list_50_percent_rule",
+ "psa_export_to_blr_soe",
"psa_export_to_chinese_soe",
+ "psa_export_to_rus_soe",
"psa_export_to_sanctioned",
"psa_export_to_sanctioned_other",
"psa_export_to_soe",
@@ -426,6 +488,44 @@
"psa_imports_eudr_shipment_soya",
"psa_imports_eudr_shipment_wood",
"psa_imports_from_bis_addresses_high_diversion_risk",
+ "psa_imports_from_jpn_meti_end_user_entity",
+ "psa_imports_from_jpn_mofa_export_ban_entity",
+ "psa_imports_from_sanctioned_arg_repet_jus_entity",
+ "psa_imports_from_sanctioned_aus_dfat_entity",
+ "psa_imports_from_sanctioned_bel_fpsf_entity",
+ "psa_imports_from_sanctioned_can_gac_entity",
+ "psa_imports_from_sanctioned_che_seco_entity",
+ "psa_imports_from_sanctioned_cze_mof_entity",
+ "psa_imports_from_sanctioned_eu_dg_fisma_ec_entity",
+ "psa_imports_from_sanctioned_eu_ec_regulation_833_2014_entity",
+ "psa_imports_from_sanctioned_eu_ec_sanctions_map_entity",
+ "psa_imports_from_sanctioned_eu_sanctions_entity",
+ "psa_imports_from_sanctioned_fra_dgt_mefids_entity",
+ "psa_imports_from_sanctioned_gbr_fcdo_entity",
+ "psa_imports_from_sanctioned_gbr_hmt_ofsi_entity",
+ "psa_imports_from_sanctioned_isr_mod_nbctf_entity",
+ "psa_imports_from_sanctioned_jpn_mof_entity",
+ "psa_imports_from_sanctioned_ltu_mi_entity",
+ "psa_imports_from_sanctioned_lva_fis_entity",
+ "psa_imports_from_sanctioned_mys_moha_entity",
+ "psa_imports_from_sanctioned_nld_mofa_entity",
+ "psa_imports_from_sanctioned_nzl_mfat_rus_entity",
+ "psa_imports_from_sanctioned_pol_mia_entity",
+ "psa_imports_from_sanctioned_sgp_agc_entity",
+ "psa_imports_from_sanctioned_ukr_nsdc_entity",
+ "psa_imports_from_sanctioned_ukr_sfms_entity",
+ "psa_imports_from_sanctioned_un_sc_entity",
+ "psa_imports_from_sanctioned_usa_ofac_non_sdn_entity",
+ "psa_imports_from_sanctioned_usa_ofac_sdn_entity",
+ "psa_imports_from_sanctioned_xxx_ebrd_entity",
+ "psa_imports_from_sanctioned_xxx_iabd_entity",
+ "psa_imports_from_usa_aeca_debarred_entity",
+ "psa_imports_from_usa_bis_denied_persons_entity",
+ "psa_imports_from_usa_bis_entity",
+ "psa_imports_from_usa_bis_meu_entity",
+ "psa_imports_from_usa_bis_unverified_entity",
+ "psa_imports_from_usa_isn_entity",
+ "psa_imports_from_usa_section_1260h_entity",
"psa_imports_ilab_child_labor",
"psa_imports_ilab_forced_labor",
"psa_imports_ndaa_889_telecom_equipment",
@@ -442,6 +542,7 @@
"psa_ofac_sdn_mex_dto_sanctioned_adjacent",
"psa_owned_by_aspi_forced_labor_entity",
"psa_owned_by_bis_meu_entity",
+ "psa_owned_by_blr_soe",
"psa_owned_by_chinese_soe",
"psa_owned_by_cmic_entity",
"psa_owned_by_entity_in_export_controls",
@@ -456,6 +557,8 @@
"psa_owned_by_ofac_sdn_mex_dto_sanctioned",
"psa_owned_by_ofac_sdnt_sanctioned",
"psa_owned_by_ofac_sdntk_sanctioned",
+ "psa_owned_by_regulatory_action_entity",
+ "psa_owned_by_rus_soe",
"psa_owned_by_sanctioned_arg_repet_jus_entity",
"psa_owned_by_sanctioned_aus_dfat_entity",
"psa_owned_by_sanctioned_bel_fpsf_entity",
@@ -500,6 +603,7 @@
"psa_owned_by_wro_entity",
"psa_owned_by_xinjiang_entity",
"psa_owner_of_aspi_forced_labor_entity",
+ "psa_owner_of_blr_soe",
"psa_owner_of_chinese_soe",
"psa_owner_of_export_controls_entity",
"psa_owner_of_export_controls_other_entity",
@@ -514,6 +618,7 @@
"psa_owner_of_ofac_sdnt_sanctioned",
"psa_owner_of_ofac_sdntk_sanctioned",
"psa_owner_of_regulatory_action_entity",
+ "psa_owner_of_rus_soe",
"psa_owner_of_sanctioned_arg_repet_jus_entity",
"psa_owner_of_sanctioned_aus_dfat_entity",
"psa_owner_of_sanctioned_bel_fpsf_entity",
@@ -592,6 +697,8 @@
"psa_sheffield_hallam_university_intermediary_entity",
"psa_sheffield_hallam_university_useful_resources",
"psa_state_owned",
+ "psa_state_owned_blr",
+ "psa_state_owned_rus",
"psa_state_owned_ven",
"psa_uk_50_percent_rule",
"psa_uk_minority_ownership",
@@ -608,12 +715,33 @@
"psa_wro_entity",
"regulatory_action",
"reputational_risk_bribery_and_corruption",
+ "reputational_risk_bribery_and_corruption_breaking",
+ "reputational_risk_bribery_and_corruption_historic",
+ "reputational_risk_bribery_and_corruption_recent",
"reputational_risk_cybercrime",
+ "reputational_risk_cybercrime_breaking",
+ "reputational_risk_cybercrime_historic",
+ "reputational_risk_cybercrime_recent",
"reputational_risk_financial_crime",
+ "reputational_risk_financial_crime_breaking",
+ "reputational_risk_financial_crime_historic",
+ "reputational_risk_financial_crime_recent",
"reputational_risk_forced_labor",
+ "reputational_risk_forced_labor_breaking",
+ "reputational_risk_forced_labor_historic",
+ "reputational_risk_forced_labor_recent",
"reputational_risk_organized_crime",
+ "reputational_risk_organized_crime_breaking",
+ "reputational_risk_organized_crime_historic",
+ "reputational_risk_organized_crime_recent",
"reputational_risk_other",
+ "reputational_risk_other_breaking",
+ "reputational_risk_other_historic",
+ "reputational_risk_other_recent",
"reputational_risk_terrorism",
+ "reputational_risk_terrorism_breaking",
+ "reputational_risk_terrorism_historic",
+ "reputational_risk_terrorism_recent",
"sanctioned",
"sanctioned_adjacent",
"sanctioned_arg_repet_jus",
@@ -654,8 +782,11 @@
"sheffield_hallam_university_useful_resources",
"soe_adjacent",
"state_owned",
+ "state_owned_blr",
+ "state_owned_rus",
"state_owned_ven",
"subsidiary_of_ndaa_889_covered_entities",
+ "tcsp_keyword_risk",
"uk_50_percent_rule",
"uk_minority_ownership",
"uk_sanctioned",
diff --git a/src/sayari/generated_types/types/risk_category.py b/src/sayari/generated_types/types/risk_category.py
index 136ead2d..423e8835 100644
--- a/src/sayari/generated_types/types/risk_category.py
+++ b/src/sayari/generated_types/types/risk_category.py
@@ -12,6 +12,7 @@
"regulatory_action",
"sanctions",
"sanctions_and_export_control_lists",
+ "shell_company_risk",
],
typing.Any,
]
diff --git a/src/sayari/generated_types/types/risk_event_category.py b/src/sayari/generated_types/types/risk_event_category.py
new file mode 100644
index 00000000..96dc3f9e
--- /dev/null
+++ b/src/sayari/generated_types/types/risk_event_category.py
@@ -0,0 +1,23 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+RiskEventCategory = typing.Union[
+ typing.Literal[
+ "bribery_and_corruption",
+ "cybercrime",
+ "esg_environmental",
+ "esg_governance",
+ "esg_social",
+ "financial_crime_and_fraud",
+ "financial_regulator",
+ "law_enforcement",
+ "modern_slavery",
+ "organized_crime",
+ "other_alleged_offenses",
+ "regulatory_enforcement_lists",
+ "reputational_risk_exposure",
+ "terrorism",
+ ],
+ typing.Any,
+]
diff --git a/src/sayari/generated_types/types/risk_event_data.py b/src/sayari/generated_types/types/risk_event_data.py
new file mode 100644
index 00000000..c0765d8b
--- /dev/null
+++ b/src/sayari/generated_types/types/risk_event_data.py
@@ -0,0 +1,20 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from .attribute_data import AttributeData
+from .risk_event_properties import RiskEventProperties
+from ...core.pydantic_utilities import IS_PYDANTIC_V2
+import typing
+import pydantic
+
+
+class RiskEventData(AttributeData):
+ properties: RiskEventProperties
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/sayari/generated_types/types/risk_event_info.py b/src/sayari/generated_types/types/risk_event_info.py
new file mode 100644
index 00000000..2311ad56
--- /dev/null
+++ b/src/sayari/generated_types/types/risk_event_info.py
@@ -0,0 +1,26 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ...base_types.types.paginated_response import PaginatedResponse
+import typing
+from .risk_event_data import RiskEventData
+from ...core.pydantic_utilities import IS_PYDANTIC_V2
+import pydantic
+
+
+class RiskEventInfo(PaginatedResponse):
+ """
+ An attribute used to capture risk (e.g., ESG controversies, reputational risk,regulatory, legal, and enforcement) events associated with an entity. This attribute is designed to handle structured event timelines, adverse media, and enforcement records from various sources.
+ """
+
+ data: typing.List[RiskEventData]
+ next: typing.Optional[typing.Optional[typing.Any]] = None
+ offset: typing.Optional[int] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/sayari/generated_types/types/risk_event_properties.py b/src/sayari/generated_types/types/risk_event_properties.py
new file mode 100644
index 00000000..5faf051c
--- /dev/null
+++ b/src/sayari/generated_types/types/risk_event_properties.py
@@ -0,0 +1,105 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ...core.pydantic_utilities import UniversalBaseModel
+from .risk_event_category import RiskEventCategory
+import pydantic
+import typing
+from .currency import Currency
+from .esg_event_intensity import EsgEventIntensity
+from ...core.pydantic_utilities import IS_PYDANTIC_V2
+
+
+class RiskEventProperties(UniversalBaseModel):
+ category: RiskEventCategory = pydantic.Field()
+ """
+ The high-level classification of the risk event (e.g., Organized Crime, Law Enforcement, ESG - Governance)
+ """
+
+ credibility: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ An indicator of the reliability of the source reporting on a specific event. It can take the values 'Low', 'Medium', or 'High'. The higher the value, the more credible the source substantiating the event is considered to be.
+ """
+
+ currency: typing.Optional[Currency] = pydantic.Field(default=None)
+ """
+ The ISO 4217 currency code
+ """
+
+ date: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ as-of date of attribute
+ """
+
+ dismissal_and_clearance: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Captures positive resolutions such as acquittals, dropped charges, overturned sentences, and removal from enforcement lists
+ """
+
+ esg_event_intensity: typing.Optional[EsgEventIntensity] = pydantic.Field(default=None)
+ """
+ A categorization of the impact of a specific Environmental, Social, and Governance (ESG) event on a company ranging from Low (minimal impact) to High (maximum impact).
+ """
+
+ event_stage: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Captures active movement in a legal, criminal, or regulatory investigation lifecycle (e.g., Investigation, Arrest, Released)
+ """
+
+ event_type: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Catch-all for general list tags, notices, and unstructured risk exposure where a specific procedural stage or penalty is not defined (e.g., Reputational Risk Exposure Event Type, Notice of Hearing)
+ """
+
+ extra: typing.Optional[typing.Dict[str, typing.Optional[typing.Any]]] = pydantic.Field(default=None)
+ """
+ extra information of attribute
+ """
+
+ from_date: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ start date of attribute
+ """
+
+ monetary_value: typing.Optional[float] = pydantic.Field(default=None)
+ """
+ The numerical financial amount associated with the event, such as a regulatory fine or penalty
+ """
+
+ penalty_and_restriction: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Captures tangible punitive actions, financial sanctions, operational restrictions, and guilty sentences (e.g., Fine, Debarment, Conviction)
+ """
+
+ source_url: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The URL linking to the original document, article, press release, or evidence substantiating the risk event
+ """
+
+ subcategory: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The specific sub-classification, issue, or issuing agency associated with the event (e.g., Traffic and Distribution of Narcotics, Police - West Midlands Police - News - United Kingdom, Workplace Diversity & Inclusion)
+ """
+
+ summary: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ A descriptive narrative summarizing the details of the risk event
+ """
+
+ title: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ The headline or title of the supporting evidence for the risk event
+ """
+
+ to_date: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ end date of attribute
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/sayari/generated_types/types/tag.py b/src/sayari/generated_types/types/tag.py
index 428a03f2..a0e7aa4d 100644
--- a/src/sayari/generated_types/types/tag.py
+++ b/src/sayari/generated_types/types/tag.py
@@ -7,10 +7,15 @@
"aspi_uyghur_forced_labor_report_entity",
"bis_boycott_requester_list",
"esg_score",
+ "esg_score_high",
+ "esg_score_low",
+ "esg_score_medium",
+ "esg_score_very_high",
"export_controls",
"export_controls_bis_entity",
"financial_risk_score",
"forced_labor_xinjiang_contractors",
+ "forced_labor_xinjiang_uflpa",
"former_soe",
"formerly_sanctioned",
"law_enforcement_action",
@@ -19,6 +24,7 @@
"reputational_risk_bribery_and_corruption",
"reputational_risk_cybercrime",
"reputational_risk_financial_crime",
+ "reputational_risk_forced_labor",
"reputational_risk_modern_slavery",
"reputational_risk_organized_crime",
"reputational_risk_other",
@@ -27,6 +33,7 @@
"sheffield_hallam_university_forced_labor_entity",
"state_owned",
"uflpa_entity",
+ "usa_bis",
"wro_entity",
],
typing.Any,
diff --git a/src/sayari/generated_types/types/unit.py b/src/sayari/generated_types/types/unit.py
index 231a70ea..2209a844 100644
--- a/src/sayari/generated_types/types/unit.py
+++ b/src/sayari/generated_types/types/unit.py
@@ -2,4 +2,19 @@
import typing
-Unit = typing.Union[typing.Literal["kilogram", "metre", "metres_squared", "unit"], typing.Any]
+Unit = typing.Union[
+ typing.Literal[
+ "gram",
+ "kilogram",
+ "long_ton",
+ "measurement_ton",
+ "metre",
+ "metres_squared",
+ "metric_ton",
+ "ounce",
+ "pound",
+ "short_ton",
+ "unit",
+ ],
+ typing.Any,
+]
diff --git a/src/sayari/generated_types/types/weak_identifier_type.py b/src/sayari/generated_types/types/weak_identifier_type.py
index f5b9dd81..13b0832b 100644
--- a/src/sayari/generated_types/types/weak_identifier_type.py
+++ b/src/sayari/generated_types/types/weak_identifier_type.py
@@ -17,8 +17,11 @@
"bih_mbs_number",
"bill_of_lading",
"bmu_registration_number",
+ "bol_shipment_declaration_number",
"bra_partial_cpf",
"brazilian_oab",
+ "bwa_shipment_number",
+ "cage",
"can_procurement_id",
"can_reference_number",
"ccs_ship_class_number",
@@ -27,6 +30,7 @@
"chn_cninfo_legal_person_id",
"chn_contract_number",
"chn_customs_registration_code",
+ "chn_partial_resident_id_number",
"chn_project_number",
"civ_aeo_code",
"cmr_shipment_declaration_number",
@@ -41,6 +45,7 @@
"cze_file_number",
"deu_registernummer",
"dma_corporate_registry_entity_num",
+ "esp_internal_employee_number",
"gbr_bankruptcy_case_num",
"gbr_charity_no",
"gbr_declaration_number",
@@ -48,6 +53,8 @@
"geo_state_registration_number",
"gha_shipment_declaration_number",
"habw_id",
+ "hkg_partial_identity_card",
+ "hkg_stock_code",
"hnd_tegucigalpa_notary",
"hun_opten_id",
"igm_number",
@@ -93,7 +100,9 @@
"mwi_shipment_reg_no",
"mx_fme",
"mx_partial_rfc_person",
+ "mys_declaration_number",
"mys_partial_national_identity_number",
+ "mys_trade_shipment_id",
"nam_shipment_assessment_no",
"nam_shipment_reg_no",
"nga_drivers",
@@ -171,10 +180,14 @@
"usa_mo_entity_id",
"usa_nc_corp_no",
"usa_nm_license_id",
+ "usa_prime_award_fain",
+ "usa_prime_award_piid",
"usa_rcra_info_id",
"usa_rmp_id",
+ "usa_sam_uei_number",
"usa_sdwis_id",
"usa_sems_id",
+ "usa_subaward_number",
"usa_tri_id",
"usa_tsca_id",
"uzb_customs_registration_number",
diff --git a/src/sayari/metadata/client.py b/src/sayari/metadata/client.py
index 42ab877a..47d61f07 100644
--- a/src/sayari/metadata/client.py
+++ b/src/sayari/metadata/client.py
@@ -24,7 +24,7 @@ def __init__(self, *, client_wrapper: SyncClientWrapper):
def metadata(self, *, request_options: typing.Optional[RequestOptions] = None) -> MetadataResponse:
"""
- Get metadta about the api, both its versions, which releases are present, and the identity of the authenticated user.
+ Get metadata about the api, both its versions, which releases are present, and the identity of the authenticated user.
Parameters
----------
@@ -112,7 +112,7 @@ def __init__(self, *, client_wrapper: AsyncClientWrapper):
async def metadata(self, *, request_options: typing.Optional[RequestOptions] = None) -> MetadataResponse:
"""
- Get metadta about the api, both its versions, which releases are present, and the identity of the authenticated user.
+ Get metadata about the api, both its versions, which releases are present, and the identity of the authenticated user.
Parameters
----------
diff --git a/src/sayari/project_entity/__init__.py b/src/sayari/project_entity/__init__.py
index 74f0784c..5d6f604a 100644
--- a/src/sayari/project_entity/__init__.py
+++ b/src/sayari/project_entity/__init__.py
@@ -45,6 +45,7 @@
ProjectRiskChangesResponse,
ProjectRiskChangesResponseData,
ProjectRiskFactor,
+ ResolutionAttrSchema,
ResolutionAttributes,
ResolutionProfile,
RiskCategoriesSummary,
@@ -115,6 +116,7 @@
"ProjectRiskChangesResponse",
"ProjectRiskChangesResponseData",
"ProjectRiskFactor",
+ "ResolutionAttrSchema",
"ResolutionAttributes",
"ResolutionProfile",
"RiskCategoriesSummary",
diff --git a/src/sayari/project_entity/client.py b/src/sayari/project_entity/client.py
index 668880ab..9533b67c 100644
--- a/src/sayari/project_entity/client.py
+++ b/src/sayari/project_entity/client.py
@@ -80,7 +80,10 @@ def create_project_entity(
Examples
--------
from sayari import Sayari
- from sayari.project_entity import CreateResolvedProjectEntityRequest
+ from sayari.project_entity import (
+ CreateResolvedProjectEntityRequest,
+ ResolutionAttrSchema,
+ )
client = Sayari(
client_id="YOUR_CLIENT_ID",
@@ -89,11 +92,14 @@ def create_project_entity(
client.project_entity.create_project_entity(
project_id="YVB88Y",
request=CreateResolvedProjectEntityRequest(
- name=["VTB Bank"],
- country=["RUS"],
- address=["Moscow"],
- identifier=["253400V1H6ART1UQ0N98"],
+ limit=10,
profile="corporate",
+ attributes=ResolutionAttrSchema(
+ name=["VTB Bank"],
+ country=["RUS"],
+ address=["Moscow"],
+ identifier=["253400V1H6ART1UQ0N98"],
+ ),
),
)
"""
@@ -933,7 +939,7 @@ def project_entity_exists(
Examples
--------
from sayari import Sayari
- from sayari.project_entity import ResolutionAttributes
+ from sayari.project_entity import ResolutionAttributes, ResolutionAttrSchema
client = Sayari(
client_id="YOUR_CLIENT_ID",
@@ -942,8 +948,10 @@ def project_entity_exists(
client.project_entity.project_entity_exists(
project_id="YVB88Y",
request=ResolutionAttributes(
- name=["Example Company"],
- country=["USA"],
+ attributes=ResolutionAttrSchema(
+ name=["Example Company"],
+ country=["USA"],
+ ),
),
)
"""
@@ -1056,7 +1064,7 @@ def save_project_entity(
Examples
--------
from sayari import Sayari
- from sayari.project_entity import ResolutionAttributes, SaveProjectEntityBody
+ from sayari.project_entity import ResolutionAttrSchema, SaveProjectEntityBody
client = Sayari(
client_id="YOUR_CLIENT_ID",
@@ -1066,7 +1074,7 @@ def save_project_entity(
project_id="YVB88Y",
request=SaveProjectEntityBody(
entity_ids=["entity_id_1", "entity_id_2"],
- attributes=ResolutionAttributes(
+ attributes=ResolutionAttrSchema(
name=["Example Company"],
country=["USA"],
),
@@ -2262,7 +2270,10 @@ async def create_project_entity(
import asyncio
from sayari import AsyncSayari
- from sayari.project_entity import CreateResolvedProjectEntityRequest
+ from sayari.project_entity import (
+ CreateResolvedProjectEntityRequest,
+ ResolutionAttrSchema,
+ )
client = AsyncSayari(
client_id="YOUR_CLIENT_ID",
@@ -2274,11 +2285,14 @@ async def main() -> None:
await client.project_entity.create_project_entity(
project_id="YVB88Y",
request=CreateResolvedProjectEntityRequest(
- name=["VTB Bank"],
- country=["RUS"],
- address=["Moscow"],
- identifier=["253400V1H6ART1UQ0N98"],
+ limit=10,
profile="corporate",
+ attributes=ResolutionAttrSchema(
+ name=["VTB Bank"],
+ country=["RUS"],
+ address=["Moscow"],
+ identifier=["253400V1H6ART1UQ0N98"],
+ ),
),
)
@@ -3171,7 +3185,7 @@ async def project_entity_exists(
import asyncio
from sayari import AsyncSayari
- from sayari.project_entity import ResolutionAttributes
+ from sayari.project_entity import ResolutionAttributes, ResolutionAttrSchema
client = AsyncSayari(
client_id="YOUR_CLIENT_ID",
@@ -3183,8 +3197,10 @@ async def main() -> None:
await client.project_entity.project_entity_exists(
project_id="YVB88Y",
request=ResolutionAttributes(
- name=["Example Company"],
- country=["USA"],
+ attributes=ResolutionAttrSchema(
+ name=["Example Company"],
+ country=["USA"],
+ ),
),
)
@@ -3302,7 +3318,7 @@ async def save_project_entity(
import asyncio
from sayari import AsyncSayari
- from sayari.project_entity import ResolutionAttributes, SaveProjectEntityBody
+ from sayari.project_entity import ResolutionAttrSchema, SaveProjectEntityBody
client = AsyncSayari(
client_id="YOUR_CLIENT_ID",
@@ -3315,7 +3331,7 @@ async def main() -> None:
project_id="YVB88Y",
request=SaveProjectEntityBody(
entity_ids=["entity_id_1", "entity_id_2"],
- attributes=ResolutionAttributes(
+ attributes=ResolutionAttrSchema(
name=["Example Company"],
country=["USA"],
),
diff --git a/src/sayari/project_entity/types/__init__.py b/src/sayari/project_entity/types/__init__.py
index 8e1bf22c..4c584bd4 100644
--- a/src/sayari/project_entity/types/__init__.py
+++ b/src/sayari/project_entity/types/__init__.py
@@ -44,6 +44,7 @@
from .project_risk_changes_response import ProjectRiskChangesResponse
from .project_risk_changes_response_data import ProjectRiskChangesResponseData
from .project_risk_factor import ProjectRiskFactor
+from .resolution_attr_schema import ResolutionAttrSchema
from .resolution_attributes import ResolutionAttributes
from .resolution_profile import ResolutionProfile
from .risk_categories_summary import RiskCategoriesSummary
@@ -113,6 +114,7 @@
"ProjectRiskChangesResponse",
"ProjectRiskChangesResponseData",
"ProjectRiskFactor",
+ "ResolutionAttrSchema",
"ResolutionAttributes",
"ResolutionProfile",
"RiskCategoriesSummary",
diff --git a/src/sayari/project_entity/types/create_resolved_project_entity_request.py b/src/sayari/project_entity/types/create_resolved_project_entity_request.py
index e0860fb6..223c559a 100644
--- a/src/sayari/project_entity/types/create_resolved_project_entity_request.py
+++ b/src/sayari/project_entity/types/create_resolved_project_entity_request.py
@@ -1,10 +1,8 @@
# This file was auto-generated by Fern from our API Definition.
from ...core.pydantic_utilities import UniversalBaseModel
+from .resolution_attr_schema import ResolutionAttrSchema
import typing
-from .string_or_number import StringOrNumber
-from ...generated_types.types.country import Country
-from ...generated_types.types.entities import Entities
from .resolution_profile import ResolutionProfile
import pydantic
from ...core.pydantic_utilities import IS_PYDANTIC_V2
@@ -14,30 +12,29 @@ class CreateResolvedProjectEntityRequest(UniversalBaseModel):
"""
Examples
--------
- from sayari.project_entity import CreateResolvedProjectEntityRequest
+ from sayari.project_entity import (
+ CreateResolvedProjectEntityRequest,
+ ResolutionAttrSchema,
+ )
CreateResolvedProjectEntityRequest(
- name=["VTB Bank"],
- country=["RUS"],
- address=["Moscow"],
- identifier=["253400V1H6ART1UQ0N98"],
+ limit=10,
profile="corporate",
+ attributes=ResolutionAttrSchema(
+ name=["VTB Bank"],
+ country=["RUS"],
+ address=["Moscow"],
+ identifier=["253400V1H6ART1UQ0N98"],
+ ),
)
"""
- identifier: typing.Optional[typing.List[StringOrNumber]] = None
- name: typing.Optional[typing.List[str]] = None
- country: typing.Optional[typing.List[Country]] = None
- address: typing.Optional[typing.List[str]] = None
- date_of_birth: typing.Optional[typing.List[str]] = None
- contact: typing.Optional[typing.List[StringOrNumber]] = None
- type: typing.Optional[typing.List[Entities]] = None
- city: typing.Optional[typing.List[str]] = None
- state: typing.Optional[typing.List[str]] = None
+ attributes: ResolutionAttrSchema
+ limit: typing.Optional[int] = None
profile: typing.Optional[ResolutionProfile] = None
enable_llm_clean: typing.Optional[bool] = pydantic.Field(default=None)
"""
- Whether to enable LLM-based data cleaning to remove noise and standardize entity attributes. Defaults to true if not supplied. Set to false to disable LLM cleaning.
+ Whether to enable LLM-based data cleaning to remove noise and standardize entity attributes. Defaults to false if not supplied. Set to true to enable LLM cleaning.
"""
if IS_PYDANTIC_V2:
diff --git a/src/sayari/project_entity/types/project_entities_response.py b/src/sayari/project_entity/types/project_entities_response.py
index aee894eb..ea7bc892 100644
--- a/src/sayari/project_entity/types/project_entities_response.py
+++ b/src/sayari/project_entity/types/project_entities_response.py
@@ -512,8 +512,8 @@ class ProjectEntitiesResponse(UniversalBaseModel):
limit: int
data: typing.List[ProjectEntityResponse]
size: QualifiedCount
- next_token: typing.Optional[str] = None
- prev_token: typing.Optional[str] = None
+ next: typing.Optional[str] = None
+ prev: typing.Optional[str] = None
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
diff --git a/src/sayari/project_entity/types/resolution_attr_schema.py b/src/sayari/project_entity/types/resolution_attr_schema.py
new file mode 100644
index 00000000..af540b95
--- /dev/null
+++ b/src/sayari/project_entity/types/resolution_attr_schema.py
@@ -0,0 +1,34 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ...core.pydantic_utilities import UniversalBaseModel
+import typing
+from .string_or_number import StringOrNumber
+import typing_extensions
+from ...base_types.types.custom_field_value import CustomFieldValue
+from ...core.serialization import FieldMetadata
+from ...core.pydantic_utilities import IS_PYDANTIC_V2
+import pydantic
+
+
+class ResolutionAttrSchema(UniversalBaseModel):
+ identifier: typing.Optional[typing.List[StringOrNumber]] = None
+ name: typing.Optional[typing.List[str]] = None
+ country: typing.Optional[typing.List[str]] = None
+ address: typing.Optional[typing.List[str]] = None
+ date_of_birth: typing.Optional[typing.List[str]] = None
+ contact: typing.Optional[typing.List[StringOrNumber]] = None
+ type: typing.Optional[typing.List[str]] = None
+ city: typing.Optional[typing.List[str]] = None
+ state: typing.Optional[typing.List[str]] = None
+ custom_field_name: typing_extensions.Annotated[
+ typing.Optional[CustomFieldValue], FieldMetadata(alias="custom_{field name}")
+ ] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/sayari/project_entity/types/resolution_attributes.py b/src/sayari/project_entity/types/resolution_attributes.py
index d1a13030..bb5e9925 100644
--- a/src/sayari/project_entity/types/resolution_attributes.py
+++ b/src/sayari/project_entity/types/resolution_attributes.py
@@ -1,28 +1,14 @@
# This file was auto-generated by Fern from our API Definition.
from ...core.pydantic_utilities import UniversalBaseModel
-import typing
-from .string_or_number import StringOrNumber
-import typing_extensions
-from ...base_types.types.custom_field_value import CustomFieldValue
-from ...core.serialization import FieldMetadata
+from .resolution_attr_schema import ResolutionAttrSchema
from ...core.pydantic_utilities import IS_PYDANTIC_V2
+import typing
import pydantic
class ResolutionAttributes(UniversalBaseModel):
- identifier: typing.Optional[typing.List[StringOrNumber]] = None
- name: typing.Optional[typing.List[str]] = None
- country: typing.Optional[typing.List[str]] = None
- address: typing.Optional[typing.List[str]] = None
- date_of_birth: typing.Optional[typing.List[str]] = None
- contact: typing.Optional[typing.List[StringOrNumber]] = None
- type: typing.Optional[typing.List[str]] = None
- city: typing.Optional[typing.List[str]] = None
- state: typing.Optional[typing.List[str]] = None
- custom_field_name: typing_extensions.Annotated[
- typing.Optional[CustomFieldValue], FieldMetadata(alias="custom_{field name}")
- ] = None
+ attributes: ResolutionAttrSchema
if IS_PYDANTIC_V2:
model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
diff --git a/src/sayari/project_entity/types/save_project_entity_body.py b/src/sayari/project_entity/types/save_project_entity_body.py
index d7381209..cb41d44e 100644
--- a/src/sayari/project_entity/types/save_project_entity_body.py
+++ b/src/sayari/project_entity/types/save_project_entity_body.py
@@ -2,7 +2,7 @@
from ...core.pydantic_utilities import UniversalBaseModel
import typing
-from .resolution_attributes import ResolutionAttributes
+from .resolution_attr_schema import ResolutionAttrSchema
from .resolution_profile import ResolutionProfile
from ...core.pydantic_utilities import IS_PYDANTIC_V2
import pydantic
@@ -10,7 +10,7 @@
class SaveProjectEntityBody(UniversalBaseModel):
entity_ids: typing.List[str]
- attributes: ResolutionAttributes
+ attributes: ResolutionAttrSchema
profile: ResolutionProfile
if IS_PYDANTIC_V2:
diff --git a/src/sayari/project_entity_supply_chain_snapshots/types/project_entity_supply_chain_snapshot_by_id_response.py b/src/sayari/project_entity_supply_chain_snapshots/types/project_entity_supply_chain_snapshot_by_id_response.py
index 15edb5de..4e58c58e 100644
--- a/src/sayari/project_entity_supply_chain_snapshots/types/project_entity_supply_chain_snapshot_by_id_response.py
+++ b/src/sayari/project_entity_supply_chain_snapshots/types/project_entity_supply_chain_snapshot_by_id_response.py
@@ -69,8 +69,8 @@ class ProjectEntitySupplyChainSnapshotByIdResponse(UniversalBaseModel):
departure_countries=["AFG"],
arrival_countries=["AFG", "AGO"],
hs_code="0303",
- min_date="51969-08-29T00:00:00+00:00",
- max_date="52971-09-25T00:00:00+00:00",
+ min_date="2024-05-03T00:00:00+00:00",
+ max_date="2024-05-06T00:00:00+00:00",
),
SupplyChainEdge(
id="6GaxYn",
@@ -79,8 +79,8 @@ class ProjectEntitySupplyChainSnapshotByIdResponse(UniversalBaseModel):
departure_countries=["AFG"],
arrival_countries=["AFG", "AGO"],
hs_code="0304",
- min_date="51969-08-29T00:00:00+00:00",
- max_date="52971-09-25T00:00:00+00:00",
+ min_date="2024-05-03T00:00:00+00:00",
+ max_date="2024-05-06T00:00:00+00:00",
),
SupplyChainEdge(
id="V03eYM",
@@ -89,8 +89,8 @@ class ProjectEntitySupplyChainSnapshotByIdResponse(UniversalBaseModel):
departure_countries=["USA", "CHN"],
arrival_countries=["GBR", "NLD"],
hs_code="0303",
- min_date="51969-08-29T00:00:00+00:00",
- max_date="52971-09-25T00:00:00+00:00",
+ min_date="2024-05-03T00:00:00+00:00",
+ max_date="2024-05-06T00:00:00+00:00",
),
],
),
diff --git a/src/sayari/resolution/client.py b/src/sayari/resolution/client.py
index 5c8b6acf..52a8a391 100644
--- a/src/sayari/resolution/client.py
+++ b/src/sayari/resolution/client.py
@@ -127,7 +127,7 @@ def resolution(
Bypasses the post-processing setps and re-ranking. Useful for debugging. By default set to false, set to true to enable.
enable_llm_clean : typing.Optional[bool]
- Whether to enable LLM-based data cleaning to remove noise and standardize entity attributes. Defaults to true if not supplied. Set to false to disable LLM cleaning.
+ Whether to enable LLM-based data cleaning to remove noise and standardize entity attributes. Defaults to false if not supplied. Set to true to enable LLM cleaning.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
@@ -739,7 +739,7 @@ async def resolution(
Bypasses the post-processing setps and re-ranking. Useful for debugging. By default set to false, set to true to enable.
enable_llm_clean : typing.Optional[bool]
- Whether to enable LLM-based data cleaning to remove noise and standardize entity attributes. Defaults to true if not supplied. Set to false to disable LLM cleaning.
+ Whether to enable LLM-based data cleaning to remove noise and standardize entity attributes. Defaults to false if not supplied. Set to true to enable LLM cleaning.
request_options : typing.Optional[RequestOptions]
Request-specific configuration.
diff --git a/src/sayari/screen/__init__.py b/src/sayari/screen/__init__.py
new file mode 100644
index 00000000..6c73e300
--- /dev/null
+++ b/src/sayari/screen/__init__.py
@@ -0,0 +1,27 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from .types import (
+ ScreenResponse,
+ ScreenResponseAttribute,
+ ScreenResponseAttributeValue,
+ ScreenResponseItem,
+ ScreenResponseMatch,
+ ScreenResponseRequest,
+ WatchlistAttributeValue,
+ WatchlistEntityMatch,
+ WatchlistKeyValue,
+ WatchlistRiskIntelligenceValue,
+)
+
+__all__ = [
+ "ScreenResponse",
+ "ScreenResponseAttribute",
+ "ScreenResponseAttributeValue",
+ "ScreenResponseItem",
+ "ScreenResponseMatch",
+ "ScreenResponseRequest",
+ "WatchlistAttributeValue",
+ "WatchlistEntityMatch",
+ "WatchlistKeyValue",
+ "WatchlistRiskIntelligenceValue",
+]
diff --git a/src/sayari/screen/client.py b/src/sayari/screen/client.py
new file mode 100644
index 00000000..b10fbd93
--- /dev/null
+++ b/src/sayari/screen/client.py
@@ -0,0 +1,367 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ..core.client_wrapper import SyncClientWrapper
+import typing
+from ..core.request_options import RequestOptions
+from .types.screen_response import ScreenResponse
+from ..core.jsonable_encoder import jsonable_encoder
+from ..core.pydantic_utilities import parse_obj_as
+from ..shared_errors.errors.bad_request import BadRequest
+from ..shared_errors.types.bad_request_response import BadRequestResponse
+from ..shared_errors.errors.unauthorized import Unauthorized
+from ..shared_errors.types.unauthorized_response import UnauthorizedResponse
+from ..shared_errors.errors.forbidden import Forbidden
+from ..shared_errors.types.forbidden_response import ForbiddenResponse
+from ..shared_errors.errors.not_found import NotFound
+from ..shared_errors.types.not_found_response import NotFoundResponse
+from ..shared_errors.errors.unprocessable_content import UnprocessableContent
+from ..shared_errors.types.unprocessable_content_response import UnprocessableContentResponse
+from ..shared_errors.errors.method_not_allowed import MethodNotAllowed
+from ..shared_errors.types.method_not_allowed_response import MethodNotAllowedResponse
+from ..shared_errors.errors.not_acceptable import NotAcceptable
+from ..shared_errors.types.not_acceptable_response import NotAcceptableResponse
+from ..shared_errors.errors.rate_limit_exceeded import RateLimitExceeded
+from ..shared_errors.types.rate_limit_response import RateLimitResponse
+from ..shared_errors.errors.internal_server_error import InternalServerError
+from ..shared_errors.types.internal_server_error_response import InternalServerErrorResponse
+from json.decoder import JSONDecodeError
+from ..core.api_error import ApiError
+from ..core.client_wrapper import AsyncClientWrapper
+
+
+class ScreenClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ def screen(
+ self,
+ project_id: str,
+ project_entity_id: str,
+ *,
+ type: typing.Optional[str] = None,
+ release_name: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> ScreenResponse:
+ """
+ Screen a project entity against watchlist records to identify potential matches. Requires the `screened_risk` role.
+
+ Parameters
+ ----------
+ project_id : str
+ Project identifier.
+
+ project_entity_id : str
+ Project entity identifier.
+
+ type : typing.Optional[str]
+ Comma-separated list of watchlist record types to filter by.
+
+ release_name : typing.Optional[str]
+ Watchlist release name to filter by.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ScreenResponse
+
+ Examples
+ --------
+ from sayari import Sayari
+
+ client = Sayari(
+ client_id="YOUR_CLIENT_ID",
+ client_secret="YOUR_CLIENT_SECRET",
+ )
+ client.screen.screen(
+ project_id="YVB88Y",
+ project_entity_id="YVodz6",
+ type="company",
+ )
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ f"v1/projects/{jsonable_encoder(project_id)}/entities/{jsonable_encoder(project_entity_id)}/screen",
+ method="GET",
+ params={
+ "type": type,
+ "release_name": release_name,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ ScreenResponse,
+ parse_obj_as(
+ type_=ScreenResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ if _response.status_code == 400:
+ raise BadRequest(
+ typing.cast(
+ BadRequestResponse,
+ parse_obj_as(
+ type_=BadRequestResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 401:
+ raise Unauthorized(
+ typing.cast(
+ UnauthorizedResponse,
+ parse_obj_as(
+ type_=UnauthorizedResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 403:
+ raise Forbidden(
+ typing.cast(
+ ForbiddenResponse,
+ parse_obj_as(
+ type_=ForbiddenResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 404:
+ raise NotFound(
+ typing.cast(
+ NotFoundResponse,
+ parse_obj_as(
+ type_=NotFoundResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 422:
+ raise UnprocessableContent(
+ typing.cast(
+ UnprocessableContentResponse,
+ parse_obj_as(
+ type_=UnprocessableContentResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 405:
+ raise MethodNotAllowed(
+ typing.cast(
+ MethodNotAllowedResponse,
+ parse_obj_as(
+ type_=MethodNotAllowedResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 406:
+ raise NotAcceptable(
+ typing.cast(
+ NotAcceptableResponse,
+ parse_obj_as(
+ type_=NotAcceptableResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 429:
+ raise RateLimitExceeded(
+ typing.cast(
+ RateLimitResponse,
+ parse_obj_as(
+ type_=RateLimitResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ typing.cast(
+ InternalServerErrorResponse,
+ parse_obj_as(
+ type_=InternalServerErrorResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+
+class AsyncScreenClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ async def screen(
+ self,
+ project_id: str,
+ project_entity_id: str,
+ *,
+ type: typing.Optional[str] = None,
+ release_name: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> ScreenResponse:
+ """
+ Screen a project entity against watchlist records to identify potential matches. Requires the `screened_risk` role.
+
+ Parameters
+ ----------
+ project_id : str
+ Project identifier.
+
+ project_entity_id : str
+ Project entity identifier.
+
+ type : typing.Optional[str]
+ Comma-separated list of watchlist record types to filter by.
+
+ release_name : typing.Optional[str]
+ Watchlist release name to filter by.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ScreenResponse
+
+ Examples
+ --------
+ import asyncio
+
+ from sayari import AsyncSayari
+
+ client = AsyncSayari(
+ client_id="YOUR_CLIENT_ID",
+ client_secret="YOUR_CLIENT_SECRET",
+ )
+
+
+ async def main() -> None:
+ await client.screen.screen(
+ project_id="YVB88Y",
+ project_entity_id="YVodz6",
+ type="company",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ f"v1/projects/{jsonable_encoder(project_id)}/entities/{jsonable_encoder(project_entity_id)}/screen",
+ method="GET",
+ params={
+ "type": type,
+ "release_name": release_name,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ ScreenResponse,
+ parse_obj_as(
+ type_=ScreenResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ if _response.status_code == 400:
+ raise BadRequest(
+ typing.cast(
+ BadRequestResponse,
+ parse_obj_as(
+ type_=BadRequestResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 401:
+ raise Unauthorized(
+ typing.cast(
+ UnauthorizedResponse,
+ parse_obj_as(
+ type_=UnauthorizedResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 403:
+ raise Forbidden(
+ typing.cast(
+ ForbiddenResponse,
+ parse_obj_as(
+ type_=ForbiddenResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 404:
+ raise NotFound(
+ typing.cast(
+ NotFoundResponse,
+ parse_obj_as(
+ type_=NotFoundResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 422:
+ raise UnprocessableContent(
+ typing.cast(
+ UnprocessableContentResponse,
+ parse_obj_as(
+ type_=UnprocessableContentResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 405:
+ raise MethodNotAllowed(
+ typing.cast(
+ MethodNotAllowedResponse,
+ parse_obj_as(
+ type_=MethodNotAllowedResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 406:
+ raise NotAcceptable(
+ typing.cast(
+ NotAcceptableResponse,
+ parse_obj_as(
+ type_=NotAcceptableResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 429:
+ raise RateLimitExceeded(
+ typing.cast(
+ RateLimitResponse,
+ parse_obj_as(
+ type_=RateLimitResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ typing.cast(
+ InternalServerErrorResponse,
+ parse_obj_as(
+ type_=InternalServerErrorResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
diff --git a/src/sayari/screen/types/__init__.py b/src/sayari/screen/types/__init__.py
new file mode 100644
index 00000000..744826bf
--- /dev/null
+++ b/src/sayari/screen/types/__init__.py
@@ -0,0 +1,25 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from .screen_response import ScreenResponse
+from .screen_response_attribute import ScreenResponseAttribute
+from .screen_response_attribute_value import ScreenResponseAttributeValue
+from .screen_response_item import ScreenResponseItem
+from .screen_response_match import ScreenResponseMatch
+from .screen_response_request import ScreenResponseRequest
+from .watchlist_attribute_value import WatchlistAttributeValue
+from .watchlist_entity_match import WatchlistEntityMatch
+from .watchlist_key_value import WatchlistKeyValue
+from .watchlist_risk_intelligence_value import WatchlistRiskIntelligenceValue
+
+__all__ = [
+ "ScreenResponse",
+ "ScreenResponseAttribute",
+ "ScreenResponseAttributeValue",
+ "ScreenResponseItem",
+ "ScreenResponseMatch",
+ "ScreenResponseRequest",
+ "WatchlistAttributeValue",
+ "WatchlistEntityMatch",
+ "WatchlistKeyValue",
+ "WatchlistRiskIntelligenceValue",
+]
diff --git a/src/sayari/screen/types/screen_response.py b/src/sayari/screen/types/screen_response.py
new file mode 100644
index 00000000..2adc7bcb
--- /dev/null
+++ b/src/sayari/screen/types/screen_response.py
@@ -0,0 +1,345 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ...core.pydantic_utilities import UniversalBaseModel
+from .screen_response_request import ScreenResponseRequest
+import typing
+from .screen_response_attribute import ScreenResponseAttribute
+from .screen_response_item import ScreenResponseItem
+from ...core.pydantic_utilities import IS_PYDANTIC_V2
+import pydantic
+
+
+class ScreenResponse(UniversalBaseModel):
+ """
+ Examples
+ --------
+ from sayari.screen import (
+ ScreenResponse,
+ ScreenResponseAttribute,
+ ScreenResponseAttributeValue,
+ ScreenResponseItem,
+ ScreenResponseMatch,
+ ScreenResponseRequest,
+ WatchlistEntityMatch,
+ WatchlistKeyValue,
+ WatchlistRiskIntelligenceValue,
+ )
+
+ ScreenResponse(
+ request=ScreenResponseRequest(
+ project_id="YVB88Y",
+ project_entity_id="YVodz6",
+ ),
+ project_entity_attributes={
+ "name": ScreenResponseAttribute(
+ match_resolution=True,
+ values=[
+ ScreenResponseAttributeValue(
+ value="AEROCARIBBEAN AIRLINES",
+ )
+ ],
+ )
+ },
+ data=[
+ ScreenResponseItem(
+ reference_id="ofac-sdn-48846",
+ org_id="ofac",
+ type="company",
+ release_name="2024-01-01",
+ name_matches=[
+ ScreenResponseMatch(
+ name="AEROCARIBBEAN AIRLINES",
+ similarity_score=0.4,
+ confidence_score=0.5,
+ explanation="High name similarity with matching organization type",
+ )
+ ],
+ entity_match=WatchlistEntityMatch(
+ entity_reference_id="ofac-sdn-48846",
+ type="company",
+ name=[
+ {
+ "value": "AEROCARIBBEAN AIRLINES",
+ "context": "primary",
+ "date": None,
+ "extra": None,
+ "to_date": None,
+ "language": None,
+ "from_date": None,
+ "translated": None,
+ "transliterated": None,
+ }
+ ],
+ translated_name=[
+ {
+ "value": "AerolΓneas AeroCaribbean",
+ "context": None,
+ "date": None,
+ "extra": None,
+ "to_date": None,
+ "language": "es",
+ "from_date": None,
+ "translated": None,
+ "transliterated": None,
+ }
+ ],
+ address=[
+ {
+ "value": "Calle 23 No. 64, Havana, Cuba",
+ "city": "Havana",
+ "state": None,
+ "country": "CU",
+ "postcode": "10400",
+ "road": None,
+ "house": "Calle 23 No. 64",
+ "house_number": None,
+ "type": None,
+ "unit": None,
+ "x": None,
+ "y": None,
+ "near": None,
+ "level": None,
+ "building": None,
+ "suburb": None,
+ "island": None,
+ "po_box": None,
+ "entrance": None,
+ "staircase": None,
+ "category": None,
+ "world_region": None,
+ "city_district": None,
+ "metro_station": None,
+ "country_region": None,
+ "state_district": None,
+ "precision_code": None,
+ "date": None,
+ "to_date": None,
+ "from_date": None,
+ "language": None,
+ "translated": None,
+ "transliterated": None,
+ "extra": [
+ {
+ "key": "Country Field Added By",
+ "value": "libpostal",
+ }
+ ],
+ }
+ ],
+ country=[
+ {
+ "value": "CU",
+ "context": "domicile",
+ "state": None,
+ "date": None,
+ "to_date": None,
+ "from_date": None,
+ "extra": None,
+ }
+ ],
+ identifier=[
+ {
+ "value": "48846",
+ "type": "SDN ID",
+ "date": None,
+ "to_date": None,
+ "from_date": None,
+ "extra": None,
+ },
+ {
+ "value": "CU-1234567",
+ "type": "registration_number",
+ "date": None,
+ "to_date": None,
+ "from_date": None,
+ "extra": None,
+ },
+ ],
+ weak_identifier=[
+ {
+ "value": "AEROCARIBBEAN",
+ "type": "common_name",
+ "date": None,
+ "to_date": None,
+ "from_date": None,
+ "extra": None,
+ }
+ ],
+ contact=[
+ {
+ "value": "+53 7 835-0216",
+ "type": "phone",
+ "date": None,
+ "to_date": None,
+ "from_date": None,
+ "extra": None,
+ },
+ {
+ "value": "info@aerocaribbean.cu",
+ "type": "email",
+ "date": None,
+ "to_date": None,
+ "from_date": None,
+ "extra": None,
+ },
+ ],
+ company_type=[
+ {
+ "value": "State-owned enterprise",
+ "date": None,
+ "to_date": None,
+ "from_date": None,
+ "extra": None,
+ }
+ ],
+ business_purpose=[
+ {
+ "value": "Air transportation",
+ "date": None,
+ "to_date": None,
+ "from_date": None,
+ "extra": None,
+ }
+ ],
+ status=[
+ {
+ "value": "active",
+ "date": "2020-01-01",
+ "to_date": None,
+ "from_date": None,
+ "extra": None,
+ }
+ ],
+ shares=[
+ {
+ "value": "100",
+ "unit": "%",
+ "type": "government_owned",
+ "date": None,
+ "to_date": None,
+ "from_date": None,
+ "extra": None,
+ }
+ ],
+ position=[
+ {
+ "value": "Minister of Transportation",
+ "type": "oversight",
+ "date": None,
+ "to_date": None,
+ "from_date": None,
+ "extra": None,
+ }
+ ],
+ finances=[
+ {
+ "value": "1500000",
+ "currency": "USD",
+ "type": "share_capital",
+ "date": None,
+ "to_date": None,
+ "from_date": None,
+ "extra": None,
+ }
+ ],
+ financials=[
+ {
+ "value": "12000000",
+ "currency": "USD",
+ "type": "annual_revenue",
+ "year": "2019",
+ "date": None,
+ "to_date": None,
+ "from_date": None,
+ "extra": None,
+ }
+ ],
+ monetary_value=[
+ {
+ "value": "2500000",
+ "currency": "USD",
+ "type": "FOB",
+ "date": None,
+ "to_date": None,
+ "from_date": None,
+ "extra": None,
+ }
+ ],
+ measurement=[
+ {
+ "value": "750",
+ "unit": "employees",
+ "type": "headcount",
+ "date": None,
+ "to_date": None,
+ "from_date": None,
+ "extra": None,
+ }
+ ],
+ generic=[
+ {
+ "value": "CUBA",
+ "type": "program",
+ "date": None,
+ "to_date": None,
+ "from_date": None,
+ "extra": None,
+ }
+ ],
+ additional_information=[
+ {
+ "value": "Designated pursuant to Executive Order 13224",
+ "type": "Designation Basis",
+ "date": None,
+ "to_date": None,
+ "from_date": None,
+ "extra": None,
+ }
+ ],
+ risk_intelligence=[
+ WatchlistRiskIntelligenceValue(
+ list_="OFAC Specially Designated Nationals (SDN) List",
+ type="sanctioned",
+ program="CUBA",
+ authority="OFAC",
+ from_date="2002-01-01",
+ extra=[
+ WatchlistKeyValue(
+ key="License Policy",
+ value="Presumption of denial.",
+ )
+ ],
+ )
+ ],
+ risk_factors=["sanctioned"],
+ risk_event=[
+ {
+ "category": "Law Enforcement",
+ "subcategory": "Sanctions",
+ "event_type": "SDN Designation",
+ "title": "OFAC SDN Designation β CUBA Sanctions Program",
+ "source_url": "https://sanctionssearch.ofac.treas.gov/Details.aspx?id=48846",
+ "credibility": "Official",
+ "event_stage": "Active",
+ "penalty_and_restriction": "Asset freeze; prohibit US persons from transacting",
+ "dismissal_and_clearance": None,
+ }
+ ],
+ ),
+ )
+ ],
+ )
+ """
+
+ request: ScreenResponseRequest
+ project_entity_attributes: typing.Dict[str, ScreenResponseAttribute]
+ data: typing.List[ScreenResponseItem]
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/sayari/screen/types/screen_response_attribute.py b/src/sayari/screen/types/screen_response_attribute.py
new file mode 100644
index 00000000..ab59b9d1
--- /dev/null
+++ b/src/sayari/screen/types/screen_response_attribute.py
@@ -0,0 +1,21 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ...core.pydantic_utilities import UniversalBaseModel
+import typing
+from .screen_response_attribute_value import ScreenResponseAttributeValue
+from ...core.pydantic_utilities import IS_PYDANTIC_V2
+import pydantic
+
+
+class ScreenResponseAttribute(UniversalBaseModel):
+ match_resolution: bool
+ values: typing.List[ScreenResponseAttributeValue]
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/sayari/screen/types/screen_response_attribute_value.py b/src/sayari/screen/types/screen_response_attribute_value.py
new file mode 100644
index 00000000..6749058d
--- /dev/null
+++ b/src/sayari/screen/types/screen_response_attribute_value.py
@@ -0,0 +1,19 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ...core.pydantic_utilities import UniversalBaseModel
+from ...core.pydantic_utilities import IS_PYDANTIC_V2
+import typing
+import pydantic
+
+
+class ScreenResponseAttributeValue(UniversalBaseModel):
+ value: str
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/sayari/screen/types/screen_response_item.py b/src/sayari/screen/types/screen_response_item.py
new file mode 100644
index 00000000..c1530f18
--- /dev/null
+++ b/src/sayari/screen/types/screen_response_item.py
@@ -0,0 +1,30 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ...core.pydantic_utilities import UniversalBaseModel
+import typing
+from .screen_response_match import ScreenResponseMatch
+from .watchlist_entity_match import WatchlistEntityMatch
+import pydantic
+from ...core.pydantic_utilities import IS_PYDANTIC_V2
+
+
+class ScreenResponseItem(UniversalBaseModel):
+ reference_id: str
+ org_id: str
+ type: typing.Optional[str] = None
+ release_name: str
+ name_matches: typing.List[ScreenResponseMatch]
+ entity_match: typing.Optional[WatchlistEntityMatch] = None
+ risk_factor_keys: typing.Optional[typing.List[str]] = pydantic.Field(default=None)
+ """
+ Risk factor granular key mapped from Risk Intelligence
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/sayari/screen/types/screen_response_match.py b/src/sayari/screen/types/screen_response_match.py
new file mode 100644
index 00000000..32a563e2
--- /dev/null
+++ b/src/sayari/screen/types/screen_response_match.py
@@ -0,0 +1,22 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ...core.pydantic_utilities import UniversalBaseModel
+import typing
+from ...core.pydantic_utilities import IS_PYDANTIC_V2
+import pydantic
+
+
+class ScreenResponseMatch(UniversalBaseModel):
+ name: str
+ similarity_score: float
+ confidence_score: typing.Optional[float] = None
+ explanation: typing.Optional[str] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/sayari/screen/types/screen_response_request.py b/src/sayari/screen/types/screen_response_request.py
new file mode 100644
index 00000000..a520da3e
--- /dev/null
+++ b/src/sayari/screen/types/screen_response_request.py
@@ -0,0 +1,23 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ...core.pydantic_utilities import UniversalBaseModel
+import typing
+from ...core.pydantic_utilities import IS_PYDANTIC_V2
+import pydantic
+
+
+class ScreenResponseRequest(UniversalBaseModel):
+ project_id: str
+ project_entity_id: str
+ org_id: typing.Optional[str] = None
+ type: typing.Optional[typing.List[str]] = None
+ release_name: typing.Optional[str] = None
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/sayari/screen/types/watchlist_attribute_value.py b/src/sayari/screen/types/watchlist_attribute_value.py
new file mode 100644
index 00000000..aee9c767
--- /dev/null
+++ b/src/sayari/screen/types/watchlist_attribute_value.py
@@ -0,0 +1,5 @@
+# This file was auto-generated by Fern from our API Definition.
+
+import typing
+
+WatchlistAttributeValue = typing.Dict[str, typing.Optional[typing.Any]]
diff --git a/src/sayari/screen/types/watchlist_entity_match.py b/src/sayari/screen/types/watchlist_entity_match.py
new file mode 100644
index 00000000..b1f477a4
--- /dev/null
+++ b/src/sayari/screen/types/watchlist_entity_match.py
@@ -0,0 +1,153 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ...core.pydantic_utilities import UniversalBaseModel
+import pydantic
+import typing
+from .watchlist_attribute_value import WatchlistAttributeValue
+from .watchlist_risk_intelligence_value import WatchlistRiskIntelligenceValue
+from ...core.pydantic_utilities import IS_PYDANTIC_V2
+
+
+class WatchlistEntityMatch(UniversalBaseModel):
+ """
+ The watchlist entity associated with a screening match, as stored at ingestion time. All attribute fields follow the Sayari ontology: each is an array of attribute records (WatchlistAttributeValue). All known attribute fields are always present in the response β fields with no data are returned as null rather than omitted. Empty arrays may also be returned for attributes with no values.
+ """
+
+ entity_reference_id: str = pydantic.Field()
+ """
+ Unique identifier for the watchlist entity.
+ """
+
+ type: str = pydantic.Field()
+ """
+ Entity type (e.g. "company", "person", "vessel").
+ """
+
+ additional_information: typing.Optional[typing.List[WatchlistAttributeValue]] = pydantic.Field(default=None)
+ """
+ Miscellaneous information not covered by other attribute types. Records typically contain "value" and optional "type" and "extra" fields.
+ """
+
+ address: typing.Optional[typing.List[WatchlistAttributeValue]] = pydantic.Field(default=None)
+ """
+ Physical location descriptions parsed via the Libpostal ontology. Each record contains "value" (full address string) plus structured sub-fields: "city", "state", "country", "postcode", "road", "house", "house_number", "unit", "x", "y", "near", "level", "building", "suburb", "island", "po_box", "entrance", "staircase", "category", "world_region", "city_district", "metro_station", "country_region", "state_district", "precision_code", "date", "from_date", "to_date", "language", "translated", "transliterated", and "extra" (array of WatchlistKeyValue with source attribution).
+ """
+
+ business_purpose: typing.Optional[typing.List[WatchlistAttributeValue]] = pydantic.Field(default=None)
+ """
+ Text or code (NAICS, NACE, ISIC, etc.) describing what the entity is legally permitted to do or produce.
+ """
+
+ company_type: typing.Optional[typing.List[WatchlistAttributeValue]] = pydantic.Field(default=None)
+ """
+ Legal entity type in a given jurisdiction (e.g. "LLC", "Sociedad Anonima").
+ """
+
+ contact: typing.Optional[typing.List[WatchlistAttributeValue]] = pydantic.Field(default=None)
+ """
+ Contact information such as phone numbers, email addresses, or URLs.
+ """
+
+ country: typing.Optional[typing.List[WatchlistAttributeValue]] = pydantic.Field(default=None)
+ """
+ Country affiliation through residence, nationality, registration, etc.
+ """
+
+ date_of_birth: typing.Optional[typing.List[WatchlistAttributeValue]] = pydantic.Field(default=None)
+ """
+ Birth date of a person. Records typically contain a "value" field with the date string.
+ """
+
+ finances: typing.Optional[typing.List[WatchlistAttributeValue]] = pydantic.Field(default=None)
+ """
+ Financial figures such as share capital (deprecated β use financials).
+ """
+
+ financials: typing.Optional[typing.List[WatchlistAttributeValue]] = pydantic.Field(default=None)
+ """
+ Financial information at a point in time (e.g. revenue, assets).
+ """
+
+ gender: typing.Optional[typing.List[WatchlistAttributeValue]] = pydantic.Field(default=None)
+ """
+ Gender of a person.
+ """
+
+ generic: typing.Optional[typing.List[WatchlistAttributeValue]] = pydantic.Field(default=None)
+ """
+ Placeholder attribute for data that does not fit any other attribute type.
+ """
+
+ identifier: typing.Optional[typing.List[WatchlistAttributeValue]] = pydantic.Field(default=None)
+ """
+ ID numbers that uniquely identify an entity when value and type are both considered (e.g. registration number, tax ID).
+ """
+
+ measurement: typing.Optional[typing.List[WatchlistAttributeValue]] = pydantic.Field(default=None)
+ """
+ Numerical measurement of an entity dimension using a standard unit.
+ """
+
+ monetary_value: typing.Optional[typing.List[WatchlistAttributeValue]] = pydantic.Field(default=None)
+ """
+ Financial value of an asset (e.g. FOB, CIF values).
+ """
+
+ name: typing.Optional[typing.List[WatchlistAttributeValue]] = pydantic.Field(default=None)
+ """
+ Entity name records. Each record contains at minimum a "value" field with the name string.
+ """
+
+ person_status: typing.Optional[typing.List[WatchlistAttributeValue]] = pydantic.Field(default=None)
+ """
+ Key life events for a person, usually temporal.
+ """
+
+ position: typing.Optional[typing.List[WatchlistAttributeValue]] = pydantic.Field(default=None)
+ """
+ Title or designation associated with a relationship (e.g. "Secretary of the Board").
+ """
+
+ risk_intelligence: typing.Optional[typing.List[WatchlistRiskIntelligenceValue]] = pydantic.Field(default=None)
+ """
+ Risk or sanctions program data. Records contain structured fields (list, type, program, authority, from_date, to_date, score, reason, extra) β there is no "value" field on these records.
+ """
+
+ risk_factors: typing.Optional[typing.List[str]] = pydantic.Field(default=None)
+ """
+ Risk factor umbrella values mapped from Risk Intelligence
+ """
+
+ shares: typing.Optional[typing.List[WatchlistAttributeValue]] = pydantic.Field(default=None)
+ """
+ Shareholding information.
+ """
+
+ status: typing.Optional[typing.List[WatchlistAttributeValue]] = pydantic.Field(default=None)
+ """
+ Status of the entity (e.g. active, dissolved).
+ """
+
+ translated_name: typing.Optional[typing.List[WatchlistAttributeValue]] = pydantic.Field(default=None)
+ """
+ Translated or transliterated name records.
+ """
+
+ weak_identifier: typing.Optional[typing.List[WatchlistAttributeValue]] = pydantic.Field(default=None)
+ """
+ Identifiers that are not unique on their own and require additional context to disambiguate.
+ """
+
+ risk_event: typing.Optional[typing.List[WatchlistAttributeValue]] = pydantic.Field(default=None)
+ """
+ Risk events associated with the entity β ESG controversies, enforcement actions, adverse media, etc. Records may contain fields such as "category", "subcategory", "event_type", "title", "source_url", "credibility", "event_stage", "penalty_and_restriction", and "dismissal_and_clearance".
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/sayari/screen/types/watchlist_key_value.py b/src/sayari/screen/types/watchlist_key_value.py
new file mode 100644
index 00000000..2dbb7b58
--- /dev/null
+++ b/src/sayari/screen/types/watchlist_key_value.py
@@ -0,0 +1,24 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ...core.pydantic_utilities import UniversalBaseModel
+from ...core.pydantic_utilities import IS_PYDANTIC_V2
+import typing
+import pydantic
+
+
+class WatchlistKeyValue(UniversalBaseModel):
+ """
+ Key-value pair used in the extra field of attribute records.
+ """
+
+ key: str
+ value: str
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/sayari/screen/types/watchlist_risk_intelligence_value.py b/src/sayari/screen/types/watchlist_risk_intelligence_value.py
new file mode 100644
index 00000000..70621240
--- /dev/null
+++ b/src/sayari/screen/types/watchlist_risk_intelligence_value.py
@@ -0,0 +1,74 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ...core.pydantic_utilities import UniversalBaseModel
+import typing_extensions
+import typing
+from ...core.serialization import FieldMetadata
+import pydantic
+from .watchlist_key_value import WatchlistKeyValue
+from ...core.pydantic_utilities import IS_PYDANTIC_V2
+
+
+class WatchlistRiskIntelligenceValue(UniversalBaseModel):
+ """
+ A single risk intelligence record. Unlike other attribute records, this type does NOT contain a "value" field. Risk label information is in the "list" and "program" fields.
+ """
+
+ list_: typing_extensions.Annotated[typing.Optional[str], FieldMetadata(alias="list")] = pydantic.Field(default=None)
+ """
+ Name of the sanctions or risk list (e.g. "OFAC Specially Designated Nationals (SDN) List").
+ """
+
+ type: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Risk category (e.g. "sanctions", "export_controls", "pep").
+ """
+
+ score: typing.Optional[float] = pydantic.Field(default=None)
+ """
+ Risk score, if provided by the source list.
+ """
+
+ reason: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Reason for designation or listing.
+ """
+
+ program: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Sanctions program or sub-program name (e.g. "CUBA", "IRAN").
+ """
+
+ authority: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Issuing authority (e.g. "OFAC", "Department of the Commerce - International Trade Administration").
+ """
+
+ from_date: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Date the listing took effect (ISO 8601 date string).
+ """
+
+ to_date: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Date the listing was removed, if applicable.
+ """
+
+ date: typing.Optional[str] = pydantic.Field(default=None)
+ """
+ Generic date field for sources that do not distinguish from/to dates.
+ """
+
+ extra: typing.Optional[typing.List[WatchlistKeyValue]] = pydantic.Field(default=None)
+ """
+ Supplemental metadata as key-value pairs (e.g. license requirements, federal register notices).
+ """
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
diff --git a/src/sayari/screen_by_name/__init__.py b/src/sayari/screen_by_name/__init__.py
new file mode 100644
index 00000000..f3ea2659
--- /dev/null
+++ b/src/sayari/screen_by_name/__init__.py
@@ -0,0 +1,2 @@
+# This file was auto-generated by Fern from our API Definition.
+
diff --git a/src/sayari/screen_by_name/client.py b/src/sayari/screen_by_name/client.py
new file mode 100644
index 00000000..1c1d362b
--- /dev/null
+++ b/src/sayari/screen_by_name/client.py
@@ -0,0 +1,336 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ..core.client_wrapper import SyncClientWrapper
+import typing
+from ..core.request_options import RequestOptions
+from ..screen.types.screen_response import ScreenResponse
+from ..core.pydantic_utilities import parse_obj_as
+from ..shared_errors.errors.bad_request import BadRequest
+from ..shared_errors.types.bad_request_response import BadRequestResponse
+from ..shared_errors.errors.unauthorized import Unauthorized
+from ..shared_errors.types.unauthorized_response import UnauthorizedResponse
+from ..shared_errors.errors.forbidden import Forbidden
+from ..shared_errors.types.forbidden_response import ForbiddenResponse
+from ..shared_errors.errors.unprocessable_content import UnprocessableContent
+from ..shared_errors.types.unprocessable_content_response import UnprocessableContentResponse
+from ..shared_errors.errors.method_not_allowed import MethodNotAllowed
+from ..shared_errors.types.method_not_allowed_response import MethodNotAllowedResponse
+from ..shared_errors.errors.not_acceptable import NotAcceptable
+from ..shared_errors.types.not_acceptable_response import NotAcceptableResponse
+from ..shared_errors.errors.rate_limit_exceeded import RateLimitExceeded
+from ..shared_errors.types.rate_limit_response import RateLimitResponse
+from ..shared_errors.errors.internal_server_error import InternalServerError
+from ..shared_errors.types.internal_server_error_response import InternalServerErrorResponse
+from json.decoder import JSONDecodeError
+from ..core.api_error import ApiError
+from ..core.client_wrapper import AsyncClientWrapper
+
+
+class ScreenByNameClient:
+ def __init__(self, *, client_wrapper: SyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ def screen_by_name(
+ self,
+ *,
+ name: str,
+ type: typing.Optional[str] = None,
+ release_name: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> ScreenResponse:
+ """
+ Screen a name against watchlist records to identify potential matches. Requires the `screened_risk` role.
+
+ Parameters
+ ----------
+ name : str
+ Name to screen against watchlist records.
+
+ type : typing.Optional[str]
+ Comma-separated list of watchlist record types to filter by.
+
+ release_name : typing.Optional[str]
+ Watchlist release name to filter by.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ScreenResponse
+
+ Examples
+ --------
+ from sayari import Sayari
+
+ client = Sayari(
+ client_id="YOUR_CLIENT_ID",
+ client_secret="YOUR_CLIENT_SECRET",
+ )
+ client.screen_by_name.screen_by_name(
+ name="AEROCARIBBEAN AIRLINES",
+ type="company",
+ )
+ """
+ _response = self._client_wrapper.httpx_client.request(
+ "v1/screen",
+ method="GET",
+ params={
+ "name": name,
+ "type": type,
+ "release_name": release_name,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ ScreenResponse,
+ parse_obj_as(
+ type_=ScreenResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ if _response.status_code == 400:
+ raise BadRequest(
+ typing.cast(
+ BadRequestResponse,
+ parse_obj_as(
+ type_=BadRequestResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 401:
+ raise Unauthorized(
+ typing.cast(
+ UnauthorizedResponse,
+ parse_obj_as(
+ type_=UnauthorizedResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 403:
+ raise Forbidden(
+ typing.cast(
+ ForbiddenResponse,
+ parse_obj_as(
+ type_=ForbiddenResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 422:
+ raise UnprocessableContent(
+ typing.cast(
+ UnprocessableContentResponse,
+ parse_obj_as(
+ type_=UnprocessableContentResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 405:
+ raise MethodNotAllowed(
+ typing.cast(
+ MethodNotAllowedResponse,
+ parse_obj_as(
+ type_=MethodNotAllowedResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 406:
+ raise NotAcceptable(
+ typing.cast(
+ NotAcceptableResponse,
+ parse_obj_as(
+ type_=NotAcceptableResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 429:
+ raise RateLimitExceeded(
+ typing.cast(
+ RateLimitResponse,
+ parse_obj_as(
+ type_=RateLimitResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ typing.cast(
+ InternalServerErrorResponse,
+ parse_obj_as(
+ type_=InternalServerErrorResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
+
+
+class AsyncScreenByNameClient:
+ def __init__(self, *, client_wrapper: AsyncClientWrapper):
+ self._client_wrapper = client_wrapper
+
+ async def screen_by_name(
+ self,
+ *,
+ name: str,
+ type: typing.Optional[str] = None,
+ release_name: typing.Optional[str] = None,
+ request_options: typing.Optional[RequestOptions] = None,
+ ) -> ScreenResponse:
+ """
+ Screen a name against watchlist records to identify potential matches. Requires the `screened_risk` role.
+
+ Parameters
+ ----------
+ name : str
+ Name to screen against watchlist records.
+
+ type : typing.Optional[str]
+ Comma-separated list of watchlist record types to filter by.
+
+ release_name : typing.Optional[str]
+ Watchlist release name to filter by.
+
+ request_options : typing.Optional[RequestOptions]
+ Request-specific configuration.
+
+ Returns
+ -------
+ ScreenResponse
+
+ Examples
+ --------
+ import asyncio
+
+ from sayari import AsyncSayari
+
+ client = AsyncSayari(
+ client_id="YOUR_CLIENT_ID",
+ client_secret="YOUR_CLIENT_SECRET",
+ )
+
+
+ async def main() -> None:
+ await client.screen_by_name.screen_by_name(
+ name="AEROCARIBBEAN AIRLINES",
+ type="company",
+ )
+
+
+ asyncio.run(main())
+ """
+ _response = await self._client_wrapper.httpx_client.request(
+ "v1/screen",
+ method="GET",
+ params={
+ "name": name,
+ "type": type,
+ "release_name": release_name,
+ },
+ request_options=request_options,
+ )
+ try:
+ if 200 <= _response.status_code < 300:
+ return typing.cast(
+ ScreenResponse,
+ parse_obj_as(
+ type_=ScreenResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ if _response.status_code == 400:
+ raise BadRequest(
+ typing.cast(
+ BadRequestResponse,
+ parse_obj_as(
+ type_=BadRequestResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 401:
+ raise Unauthorized(
+ typing.cast(
+ UnauthorizedResponse,
+ parse_obj_as(
+ type_=UnauthorizedResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 403:
+ raise Forbidden(
+ typing.cast(
+ ForbiddenResponse,
+ parse_obj_as(
+ type_=ForbiddenResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 422:
+ raise UnprocessableContent(
+ typing.cast(
+ UnprocessableContentResponse,
+ parse_obj_as(
+ type_=UnprocessableContentResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 405:
+ raise MethodNotAllowed(
+ typing.cast(
+ MethodNotAllowedResponse,
+ parse_obj_as(
+ type_=MethodNotAllowedResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 406:
+ raise NotAcceptable(
+ typing.cast(
+ NotAcceptableResponse,
+ parse_obj_as(
+ type_=NotAcceptableResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 429:
+ raise RateLimitExceeded(
+ typing.cast(
+ RateLimitResponse,
+ parse_obj_as(
+ type_=RateLimitResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ if _response.status_code == 500:
+ raise InternalServerError(
+ typing.cast(
+ InternalServerErrorResponse,
+ parse_obj_as(
+ type_=InternalServerErrorResponse, # type: ignore
+ object_=_response.json(),
+ ),
+ )
+ )
+ _response_json = _response.json()
+ except JSONDecodeError:
+ raise ApiError(status_code=_response.status_code, body=_response.text)
+ raise ApiError(status_code=_response.status_code, body=_response_json)
diff --git a/src/sayari/shared_errors/__init__.py b/src/sayari/shared_errors/__init__.py
index ca889f62..648f3da8 100644
--- a/src/sayari/shared_errors/__init__.py
+++ b/src/sayari/shared_errors/__init__.py
@@ -4,6 +4,7 @@
BadGatewayResponse,
BadRequestResponse,
ConnectionErrorResponse,
+ ForbiddenResponse,
InternalServerErrorResponse,
MethodNotAllowedResponse,
NotAcceptableResponse,
@@ -16,6 +17,7 @@
BadGateway,
BadRequest,
ConnectionError,
+ Forbidden,
InternalServerError,
MethodNotAllowed,
NotAcceptable,
@@ -32,6 +34,8 @@
"BadRequestResponse",
"ConnectionError",
"ConnectionErrorResponse",
+ "Forbidden",
+ "ForbiddenResponse",
"InternalServerError",
"InternalServerErrorResponse",
"MethodNotAllowed",
diff --git a/src/sayari/shared_errors/errors/__init__.py b/src/sayari/shared_errors/errors/__init__.py
index fd0c66cb..96327aa7 100644
--- a/src/sayari/shared_errors/errors/__init__.py
+++ b/src/sayari/shared_errors/errors/__init__.py
@@ -3,6 +3,7 @@
from .bad_gateway import BadGateway
from .bad_request import BadRequest
from .connection_error import ConnectionError
+from .forbidden import Forbidden
from .internal_server_error import InternalServerError
from .method_not_allowed import MethodNotAllowed
from .not_acceptable import NotAcceptable
@@ -15,6 +16,7 @@
"BadGateway",
"BadRequest",
"ConnectionError",
+ "Forbidden",
"InternalServerError",
"MethodNotAllowed",
"NotAcceptable",
diff --git a/src/sayari/shared_errors/errors/forbidden.py b/src/sayari/shared_errors/errors/forbidden.py
new file mode 100644
index 00000000..709e2b99
--- /dev/null
+++ b/src/sayari/shared_errors/errors/forbidden.py
@@ -0,0 +1,9 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ...core.api_error import ApiError
+from ..types.forbidden_response import ForbiddenResponse
+
+
+class Forbidden(ApiError):
+ def __init__(self, body: ForbiddenResponse):
+ super().__init__(status_code=403, body=body)
diff --git a/src/sayari/shared_errors/types/__init__.py b/src/sayari/shared_errors/types/__init__.py
index c0934f97..88c51807 100644
--- a/src/sayari/shared_errors/types/__init__.py
+++ b/src/sayari/shared_errors/types/__init__.py
@@ -3,6 +3,7 @@
from .bad_gateway_response import BadGatewayResponse
from .bad_request_response import BadRequestResponse
from .connection_error_response import ConnectionErrorResponse
+from .forbidden_response import ForbiddenResponse
from .internal_server_error_response import InternalServerErrorResponse
from .method_not_allowed_response import MethodNotAllowedResponse
from .not_acceptable_response import NotAcceptableResponse
@@ -15,6 +16,7 @@
"BadGatewayResponse",
"BadRequestResponse",
"ConnectionErrorResponse",
+ "ForbiddenResponse",
"InternalServerErrorResponse",
"MethodNotAllowedResponse",
"NotAcceptableResponse",
diff --git a/src/sayari/shared_errors/types/forbidden_response.py b/src/sayari/shared_errors/types/forbidden_response.py
new file mode 100644
index 00000000..bb90b948
--- /dev/null
+++ b/src/sayari/shared_errors/types/forbidden_response.py
@@ -0,0 +1,25 @@
+# This file was auto-generated by Fern from our API Definition.
+
+from ...core.pydantic_utilities import UniversalBaseModel
+import typing
+from ...core.pydantic_utilities import IS_PYDANTIC_V2
+import pydantic
+
+
+class ForbiddenResponse(UniversalBaseModel):
+ """
+ User does not have the required role to access this resource.
+ """
+
+ status: int
+ message: typing.List[str]
+ success: bool
+
+ if IS_PYDANTIC_V2:
+ model_config: typing.ClassVar[pydantic.ConfigDict] = pydantic.ConfigDict(extra="allow", frozen=True) # type: ignore # Pydantic v2
+ else:
+
+ class Config:
+ frozen = True
+ smart_union = True
+ extra = pydantic.Extra.allow
From 3ad06d4b83ba92b000d97af0471c571aff486a45 Mon Sep 17 00:00:00 2001
From: "fern-api[bot]" <115122769+fern-api[bot]@users.noreply.github.com>
Date: Thu, 1 Oct 2026 16:21:50 +0000
Subject: [PATCH 2/2] [fern-replay] advance lockfile
---
.fern/replay.lock | 8 +++++++-
1 file changed, 7 insertions(+), 1 deletion(-)
diff --git a/.fern/replay.lock b/.fern/replay.lock
index 7f00e888..aca5164f 100644
--- a/.fern/replay.lock
+++ b/.fern/replay.lock
@@ -6,5 +6,11 @@ generations:
timestamp: 2026-10-01T16:21:46.695Z
cli_version: unknown
generator_versions: {}
-current_generation: 15a726d62e8fe792e6ef72ffe6ecdc4375d0e6c4
+ - commit_sha: a7b46dc9dbff0f2a8083a3e7ba0ddeca8e14e993
+ tree_hash: 110256d58f47c5c1fd26b1d09fa075d0167066d3
+ timestamp: 2026-10-01T16:21:47.232Z
+ cli_version: 0.66.25
+ generator_versions:
+ fernapi/fern-python-sdk: 4.3.18
+current_generation: a7b46dc9dbff0f2a8083a3e7ba0ddeca8e14e993
patches: []