diff --git a/.speakeasy/gen.lock b/.speakeasy/gen.lock
index fa7f411d..27d776f5 100644
--- a/.speakeasy/gen.lock
+++ b/.speakeasy/gen.lock
@@ -1,19 +1,19 @@
lockVersion: 2.0.0
id: c48cf606-fb42-4a45-9c23-8f0555307828
management:
- docChecksum: e57df319c7e9d4d6b1220f745af8aacd
+ docChecksum: a06c6ca0e6a2702dc5961d1fe352effd
docVersion: 1.0.0
speakeasyVersion: 1.787.0
generationVersion: 2.914.0
- releaseVersion: 1.1.19
- configChecksum: 24829920a2633e943ff596045c400ea5
+ releaseVersion: 1.1.20
+ configChecksum: b90e24294499df16fce0f0318e81d5b5
repoURL: https://github.com/OpenRouterTeam/python-sdk.git
installationURL: https://github.com/OpenRouterTeam/python-sdk.git
published: true
persistentEdits:
- generation_id: 2c61b687-79d3-4063-aaf5-7909ccbf31a3
- pristine_commit_hash: f28b02a40adab635845384852965e0cf2f1d5159
- pristine_tree_hash: c37fafe899dcc3ae24c84ed5baf89f5182b87b5e
+ generation_id: d95362c8-539d-469e-8ec3-61350209cdd2
+ pristine_commit_hash: 38e60620bf6e9859508e7fb78da53aef3019b646
+ pristine_tree_hash: de05b8232a25e6961245f9f490f5756b338b527d
features:
python:
acceptHeaders: 3.0.0
@@ -1520,6 +1520,18 @@ trackedFiles:
id: ed0298bf47bf
last_write_checksum: sha1:01fc963af14788ca0453a09fe4f7a60e4420244a
pristine_git_object: c31f263d23205ebfa16eb7e4ae5f33a11fb19764
+ docs/components/createscimgroupmappingrequest.mdx:
+ id: 652e24fba424
+ last_write_checksum: sha1:cc05315f9faccdaf7a2acf77f4eb1099a355dc18
+ pristine_git_object: 5ad1269cb225d00b37bf0b0e83461bf338d351a5
+ docs/components/createscimgroupmappingrequestrole.mdx:
+ id: 64eac132ca80
+ last_write_checksum: sha1:6b13026c589b184b01bee2b01555684c5ad5b424
+ pristine_git_object: f49282c436684f6846640e89c6bbfe52b3cba3b0
+ docs/components/createscimgroupmappingresponse.mdx:
+ id: 1343f81fb7f9
+ last_write_checksum: sha1:405c1e9143c6d51cebda7e415fb3b981da5e6c83
+ pristine_git_object: 9ac0db3fbdb1995b37cbe28015dc24425af0660e
docs/components/createworkspacerequest.mdx:
id: ea85d6684017
last_write_checksum: sha1:3fd0555fe82dbdff103995079630e6bcb7503795
@@ -1644,6 +1656,10 @@ trackedFiles:
id: 0f606ad36822
last_write_checksum: sha1:99269cd4a1958da8aa09cb828709ca8a734541ff
pristine_git_object: 4d572b68887b463586c64afbe73498fe70b7f8d3
+ docs/components/deletescimgroupmappingresponse.mdx:
+ id: 3cd77320d674
+ last_write_checksum: sha1:b9812c5692d64fed0e49cde56531b83f57605bdc
+ pristine_git_object: 1ed4e164aa134141d79ad5122bac2c3a17f49799
docs/components/deleteworkspacebudgetresponse.mdx:
id: 438cab4d21cf
last_write_checksum: sha1:ee3e008f82c76693cb018712a921bcbf32bd28fd
@@ -2144,6 +2160,10 @@ trackedFiles:
id: ec319a1ab019
last_write_checksum: sha1:e3378700484df1b9d94e39e1dc1c1bb92490f3cd
pristine_git_object: 6c3040281b154c953a524bed1bc45f1c6a8c4a40
+ docs/components/getscimgroupmappingresponse.mdx:
+ id: 59edec5c97d1
+ last_write_checksum: sha1:e60a199f393362e0182d4b5aa6218294e6c1af48
+ pristine_git_object: 3031bf1129e51ad652a31b7142154b49fcc4560f
docs/components/getworkspaceresponse.mdx:
id: c8d0c4683019
last_write_checksum: sha1:5d10c3c4510cdc869a740deee62c31e9d2b02cc9
@@ -2680,6 +2700,14 @@ trackedFiles:
id: a6eb4fad37a7
last_write_checksum: sha1:b6e1c0dacac17485fceedc43c19f73684c950149
pristine_git_object: 768df799d61dcc27510f108d123d4182e8f9eba3
+ docs/components/listscimgroupmappingsresponse.mdx:
+ id: 7ac1b5a82a51
+ last_write_checksum: sha1:421ce0c03370b2307f26cadafe5cc0d6429f6a2b
+ pristine_git_object: 14dff7d7d87ac91ff929b6b65dc1a23c1bd9feaf
+ docs/components/listscimgroupsresponse.mdx:
+ id: b7b20d46cf95
+ last_write_checksum: sha1:fbdf5e1ed9651ac69b03e6b07d2f061480c15f0d
+ pristine_git_object: 6c0e6c816c9cc4a625f1d341773ede7888ea5a4d
docs/components/listworkspacebudgetsresponse.mdx:
id: be60b3aa222d
last_write_checksum: sha1:69367bef2e3cfa9073fa41794a9af4a3344f16ee
@@ -4548,6 +4576,18 @@ trackedFiles:
id: 652b4ec56a02
last_write_checksum: sha1:689f48837abf4c42c787a7a531e751d32d1e3c67
pristine_git_object: 14a9f713694cfd61d45b800a23294d906482bca5
+ docs/components/scimgroup.mdx:
+ id: bc553f57b8ab
+ last_write_checksum: sha1:9b9eefe3a298e57f01b751ffa8127d58306361fc
+ pristine_git_object: 98a3dfc33a4a396d72a562022c9cb3f2f4804b4f
+ docs/components/scimgroupmapping.mdx:
+ id: 26b9ee81ad86
+ last_write_checksum: sha1:468f593496c4a7e0d3f88228f0fba57413828e3b
+ pristine_git_object: a1ee91fada7ed5ef87de2f70d8147e648468c546
+ docs/components/scimgroupmappingrole.mdx:
+ id: 0306b7b3cf78
+ last_write_checksum: sha1:93f2d7d1dc60a2b1635202d83ae9f00cc314e2e6
+ pristine_git_object: 94331ee57f8ebf2b21903d5ebda22e0faf23044a
docs/components/searchcontextsizeenum.mdx:
id: b6b9a99acb5f
last_write_checksum: sha1:177016c42a56a7a8dcd40caa7e9105ca7a6ea1cc
@@ -5272,6 +5312,18 @@ trackedFiles:
id: be9661c3676e
last_write_checksum: sha1:c8fde493ab2c8285b0a800795e6106f2dbf3a63f
pristine_git_object: c7aba4370fef4f13a7640e16f1a5404bc640f78c
+ docs/components/updatescimgroupmappingrequest.mdx:
+ id: 4318f4ed22f5
+ last_write_checksum: sha1:80947ab2421cee078a515582fc49381bfc2641a7
+ pristine_git_object: 8206d91829e104893ca4a2004f091241fbb357f8
+ docs/components/updatescimgroupmappingrequestrole.mdx:
+ id: b41b96afd421
+ last_write_checksum: sha1:0c939415a0735e827b1e5b178f57e36a716fce25
+ pristine_git_object: 6f5f0062f163d23390cd625a82169be311e8956d
+ docs/components/updatescimgroupmappingresponse.mdx:
+ id: 6d2a71282cce
+ last_write_checksum: sha1:9f7c28e520631ac5b986fff0057ec961b5e59027
+ pristine_git_object: 651230ce14044f67b3930628c9b0a4feaab3f7e6
docs/components/updateworkspacerequest.mdx:
id: 9870d016bf28
last_write_checksum: sha1:b798c6d985770a44b3db121bb2aa6cd983ad5387
@@ -5860,6 +5912,14 @@ trackedFiles:
id: 405549d19438
last_write_checksum: sha1:a2ef51d1e93fe47903803316e036fe579ff69903
pristine_git_object: a51a1e375e5ec80ff76a1e585477dd2f6ac43621
+ docs/operations/createscimgroupmappingglobals.mdx:
+ id: 2888cafe124a
+ last_write_checksum: sha1:fa796c3c5ef48a275169e68eaba4ec4b6ed82827
+ pristine_git_object: ee1187f7f1f4a6cd250b79e96faf0ff9fe78e430
+ docs/operations/createscimgroupmappingrequest.mdx:
+ id: 0cf573a9a3b4
+ last_write_checksum: sha1:19276108c153ccd0d96cb8330f559085ed6c43c9
+ pristine_git_object: c5b268ab42e01e5056deaf0d432858cfa147a362
docs/operations/createvideosglobals.mdx:
id: 84de29ff23d6
last_write_checksum: sha1:b0e6bc84afd5b4bcdb3f491c64b3f5c15e74d187
@@ -5924,6 +5984,14 @@ trackedFiles:
id: 86192950ff34
last_write_checksum: sha1:c39ee4ad159c25a9bb988a1b0b32eab4ea45f58f
pristine_git_object: 6dee392d1c4bbd32eda1cfac08e8daa1e3ad139e
+ docs/operations/deletescimgroupmappingglobals.mdx:
+ id: 97ed538b3737
+ last_write_checksum: sha1:91c7cbdd9cf6ec660575814c49ab65e2c099cea2
+ pristine_git_object: 098b906f69605c4e4f014e0c9977c2e9e09a40d4
+ docs/operations/deletescimgroupmappingrequest.mdx:
+ id: 429d1931c37a
+ last_write_checksum: sha1:02a4aebe7722d11c44caaff6e203a03b21518c20
+ pristine_git_object: 44e2e267a0a99200a02d71e4d87be41bf689224e
docs/operations/deleteworkspacebudgetglobals.mdx:
id: c1b4f6dabfee
last_write_checksum: sha1:f2e30630f5ff69ba236f790def147e41e145ddd7
@@ -6196,6 +6264,14 @@ trackedFiles:
id: a83322d91eea
last_write_checksum: sha1:fd05c4e755a6ba4f6b41bb37856169ad1b14d927
pristine_git_object: 04784a9f4a05fa7d473b532d4e881a6d45a64a10
+ docs/operations/getscimgroupmappingglobals.mdx:
+ id: 77bec8664122
+ last_write_checksum: sha1:f3e3e81004c1baef10f69af21f945f2ead97c9b5
+ pristine_git_object: 6d93a7f2595fdfaf64135ecd658993b0d5d2d165
+ docs/operations/getscimgroupmappingrequest.mdx:
+ id: d5f5f6747522
+ last_write_checksum: sha1:f86eff956c41225004a47350e31bfb0842f6b968
+ pristine_git_object: 65e59b601a99b58683e4af1f7302a21c9ac3ce04
docs/operations/gettaskclassificationsglobals.mdx:
id: 14d0010b40f8
last_write_checksum: sha1:6c967e8855540035a6f70fa895ceea0c9caf1cdd
@@ -6252,6 +6328,14 @@ trackedFiles:
id: fa09ca81a05c
last_write_checksum: sha1:6126fc355e98574f157b9b485ac850a0ec6f2a5e
pristine_git_object: 2394952123e253a775bb81426d6ee2d49911e97b
+ docs/operations/keepmembers.mdx:
+ id: 2794baf69c28
+ last_write_checksum: sha1:aaeb714170a62787f1821383b6136d1753f14722
+ pristine_git_object: 8f46e9fffa111f629447d88073a1bc71f5d74ec2
+ docs/operations/keepmembersenum.mdx:
+ id: 6ee61c9ccd20
+ last_write_checksum: sha1:29e22c0b38d77f4920d0f8e3704cb3ed0ce01ace
+ pristine_git_object: 50c5569bdc0a0a0cf8ed9c7a88120ebac5505022
docs/operations/languagetype.mdx:
id: fe52912b0ea7
last_write_checksum: sha1:85897c7620d5c3725f610a496f4ceb485b9f5063
@@ -6512,6 +6596,30 @@ trackedFiles:
id: 0fbda0f81ae8
last_write_checksum: sha1:ba97d1d6ae126c3e7a0e28d800705847377d2e86
pristine_git_object: ffadcfc3029043df64d38ed75fe5047adcc9f7cc
+ docs/operations/listscimgroupmappingsglobals.mdx:
+ id: 895d22ec37c3
+ last_write_checksum: sha1:d80db938928ed189c2a2757ea5d188bb1179307c
+ pristine_git_object: 579e2aceabe49ccb863b60a9e8d591d732246af3
+ docs/operations/listscimgroupmappingsrequest.mdx:
+ id: 6ef42d4cff72
+ last_write_checksum: sha1:5c39ffeb497320341d049cd6a6e64492901af996
+ pristine_git_object: e30aea7a59c2f378c66198111d348c085c491aa3
+ docs/operations/listscimgroupmappingsresponse.mdx:
+ id: 82fd03794ec7
+ last_write_checksum: sha1:066a306244125516ec9dbf46d22d52703450cb12
+ pristine_git_object: f426e5f4541cee6cd5d881d4d000108d43c22884
+ docs/operations/listscimgroupsglobals.mdx:
+ id: 4bba8d8ae8ec
+ last_write_checksum: sha1:ffeab5c225586e53ed8739894bf380120c9e51d3
+ pristine_git_object: 5294ada2ed869243414124ab5c76e8a2b35f4512
+ docs/operations/listscimgroupsrequest.mdx:
+ id: df7ed9b0f3b3
+ last_write_checksum: sha1:26602f5d6904cdfe0d9bda06cf51f30eba59bb8d
+ pristine_git_object: 559e6e18a2281c2d63c6a7fdfa58658daa89cdd9
+ docs/operations/listscimgroupsresponse.mdx:
+ id: b763a3eaa70b
+ last_write_checksum: sha1:2421768f7c35319a79083c02017056bd40f21c4e
+ pristine_git_object: 80f9a41f5527839636e8a51814d420a22a28a82f
docs/operations/listvideoscontentglobals.mdx:
id: 3332db3cd666
last_write_checksum: sha1:a5c1c54148c4f70454639dc474aad4fe32b82149
@@ -6748,6 +6856,14 @@ trackedFiles:
id: d83497c7a77d
last_write_checksum: sha1:de57252c9ee61e445b637c961ffb2a5e16a8b6f7
pristine_git_object: 16926383142c262c3c0f352bb40319fa48082fcd
+ docs/operations/updatescimgroupmappingglobals.mdx:
+ id: 01643bdf3b7d
+ last_write_checksum: sha1:5865e4a382c162a7f92ec7dc8a08516570bd9c56
+ pristine_git_object: a8893db669581bed50c7cda7516a6a3beef5eb46
+ docs/operations/updatescimgroupmappingrequest.mdx:
+ id: b74e0f64f34e
+ last_write_checksum: sha1:f63374fe6448d689438a3ca4fd3409cedcf7e269
+ pristine_git_object: a2785d52426647fcd31cfc58f3dbafd0aabd6125
docs/operations/updateworkspaceglobals.mdx:
id: 053b3b5bb1eb
last_write_checksum: sha1:975e76f8c53dc170a42ecf80d01474518dda8944
@@ -6904,6 +7020,10 @@ trackedFiles:
id: abab319e080e
last_write_checksum: sha1:bdf477b88af63011ec6cc460d17f36fe0aeada68
pristine_git_object: 356232d47db82bebc0de98789226f8246dce647e
+ docs/sdks/scim/README.mdx:
+ id: fd6d8a91a053
+ last_write_checksum: sha1:383e2108f6270137e54c1c993f655e32bd7283d6
+ pristine_git_object: 89918692e893f665f65a870440659a63ab821693
docs/sdks/stt/README.mdx:
id: 190b0dc9a5d1
last_write_checksum: sha1:0280bf119668798bf78f662fd41364b573c7fe53
@@ -6926,8 +7046,8 @@ trackedFiles:
pristine_git_object: 3e38f1a929f7d6b1d6de74604aa87e3d8f010544
pyproject.toml:
id: 5d07e7d72637
- last_write_checksum: sha1:48d1af8c208f573c9befba911026b232b1f08f64
- pristine_git_object: df1602a8e3d940ab5bdcd5bee9e8dd263e483b3f
+ last_write_checksum: sha1:a178037a3aff766a6bdca4b992281081588985c4
+ pristine_git_object: 70475e9206d203172f21a7d9d37167b3ce7f06a5
scripts/prepare_readme.py:
id: e0c5957a6035
last_write_checksum: sha1:77f44b60b98bc126557ec27391f91dfba764bb54
@@ -6954,8 +7074,8 @@ trackedFiles:
pristine_git_object: 86713cfea633e09d33b3d4e65281071fe20e6137
src/openrouter/_version.py:
id: d8d15ad6c586
- last_write_checksum: sha1:b7030862bce62a83c3cb651ab27fc68475cdbb96
- pristine_git_object: 7eb9b4cf2a3d58602f51334bfbc1a0627e4f9404
+ last_write_checksum: sha1:56acaf4f3fb1c458cd5a17949976e024ce63c994
+ pristine_git_object: 473195b0473d2c49e64aed63d2c078aba716a050
src/openrouter/analytics.py:
id: cb406b5aaabb
last_write_checksum: sha1:9e709b71dd0611056dc0cec6150b578defe32841
@@ -6998,8 +7118,8 @@ trackedFiles:
pristine_git_object: ad3d247954547814054c01989a2dff3d12b3e4e1
src/openrouter/components/__init__.py:
id: 81754e97b3f4
- last_write_checksum: sha1:17849cbb4c4b44eddfe56dd30ccac9d6eadd0225
- pristine_git_object: 22427f8f7738d7aeb326f86cd3b4c17565f69703
+ last_write_checksum: sha1:b86e37067f135b24f13d24f19bb32ff5b74dd49f
+ pristine_git_object: 624a1748169e863ff2a308ef0c720b32880a0266
src/openrouter/components/aabenchmarkentry.py:
id: e2e0f0b48c82
last_write_checksum: sha1:fab4d9a24d2cea937bb749d46c5f83941e99d65c
@@ -7676,6 +7796,14 @@ trackedFiles:
id: 4b6609465770
last_write_checksum: sha1:169981e2df08762f8cc251f2dccc9c0848a16902
pristine_git_object: ffdb3753adda06f3d93b505ab17657337c66067c
+ src/openrouter/components/createscimgroupmappingrequest.py:
+ id: 57d83beb2d2d
+ last_write_checksum: sha1:152e425925cc126310cee52fb6a98f6187a09261
+ pristine_git_object: f451191bdf0741577c7b7a028345cbf88b82e4a6
+ src/openrouter/components/createscimgroupmappingresponse.py:
+ id: f8798c422360
+ last_write_checksum: sha1:fe554fba7ee3924661b789491b1cc31e4517119d
+ pristine_git_object: 7fde9784d1da97bbd4a70b5a64d72ea8ffa7fe64
src/openrouter/components/createworkspacerequest.py:
id: 3785d9b207c2
last_write_checksum: sha1:26d39e88354ea17dc3a9c0156ddc8769dbae33a4
@@ -7736,6 +7864,10 @@ trackedFiles:
id: daf99e240820
last_write_checksum: sha1:485d3e763c2edd7ccd69926e2ea872eb6d031fdc
pristine_git_object: 28a54ebbcd00a3b64b50c6f221b4e1e7856797a8
+ src/openrouter/components/deletescimgroupmappingresponse.py:
+ id: aef026b5e627
+ last_write_checksum: sha1:ccf8a4261d6c889d320fcce82bd8f73ae13cb07f
+ pristine_git_object: 08a2289ff162c8758168d8da8414dd2f0ec3cc6e
src/openrouter/components/deleteworkspacebudgetresponse.py:
id: f9b733ad07c1
last_write_checksum: sha1:9bbbb1e27113d3ccebf7adf47b6554acf6139cb2
@@ -7940,6 +8072,10 @@ trackedFiles:
id: 2175d9fa777c
last_write_checksum: sha1:200d7a21b0da01ee15de359057da7259e0d367bd
pristine_git_object: 122b9e8c5e75dcb27a5d6fa7a7f5c0c794241970
+ src/openrouter/components/getscimgroupmappingresponse.py:
+ id: f6dd9e0daa9e
+ last_write_checksum: sha1:0b1ba09ad5da624c4fdbd1bff5d8919e55133cb9
+ pristine_git_object: cfca9a058673bf7db640c2cec6d8dfc4f87837bd
src/openrouter/components/getworkspaceresponse.py:
id: d993d0c4c3da
last_write_checksum: sha1:918535730d1c352bcc8fd2342e1c4cea89bc357f
@@ -8160,6 +8296,14 @@ trackedFiles:
id: c99fabaf956a
last_write_checksum: sha1:de6c8f9f4b6ef6ef16d62918a1dd16e0ec619c88
pristine_git_object: d75ab3b91f58885e0d43d10d399f3f67a87349e8
+ src/openrouter/components/listscimgroupmappingsresponse.py:
+ id: 7170aaa087e9
+ last_write_checksum: sha1:4cf71a1acd3e413f920c8ac02bd3e8f497b8a124
+ pristine_git_object: 546ec322c98cd8d4904002cc09d3a5b9bc57dd40
+ src/openrouter/components/listscimgroupsresponse.py:
+ id: 7c20d71efb80
+ last_write_checksum: sha1:1a8318984c6789d39fcfb26950003decd43e8671
+ pristine_git_object: 8eedc46ae432ebaf1dcf40a15a918456c801f836
src/openrouter/components/listworkspacebudgetsresponse.py:
id: 64fa8723acb0
last_write_checksum: sha1:7a1c0108d9d1f53c17f339c40b012e9472089fb8
@@ -8896,6 +9040,14 @@ trackedFiles:
id: 553fefb9814c
last_write_checksum: sha1:5db57f3fb6368777e8c2713eba613830d4f647fb
pristine_git_object: 2f0e24f4e60f92151982237f1b2e871fbbf03278
+ src/openrouter/components/scimgroup.py:
+ id: 2c6efb2db9c3
+ last_write_checksum: sha1:b9309eab6d218c56eed1fc32a452e3ac5e89e2a2
+ pristine_git_object: 4086c587a17812c5d90455b4a0bda35e5752367e
+ src/openrouter/components/scimgroupmapping.py:
+ id: c4d7a895a0bc
+ last_write_checksum: sha1:426befccd88107766691cff08a93741c6f388471
+ pristine_git_object: b2e0acc56568f3c0ff542ec141c761ad62ddad80
src/openrouter/components/searchcontextsizeenum.py:
id: c246413c0bd7
last_write_checksum: sha1:863a664a9f17def86180b0407c8233c263acfae7
@@ -9180,6 +9332,14 @@ trackedFiles:
id: 187c51d2b3a4
last_write_checksum: sha1:cadc62b37feddb4281e471d15627a9a1bef32cb1
pristine_git_object: 95abc42170d9ebeadee791d15c2bbc643720f1dc
+ src/openrouter/components/updatescimgroupmappingrequest.py:
+ id: e014a151bfdd
+ last_write_checksum: sha1:cc62d7f12e168cbe7899f9d96144a480c32159e1
+ pristine_git_object: a95a4e18b7f9004cd777d93d55f9f705fb35056e
+ src/openrouter/components/updatescimgroupmappingresponse.py:
+ id: 9af86345cb8d
+ last_write_checksum: sha1:8d4b084302952a541df662012eb0d2f0f144a2d0
+ pristine_git_object: 2f110211bb0a6889bb6455a7a3901e0be260b170
src/openrouter/components/updateworkspacerequest.py:
id: 78d86b3b0a63
last_write_checksum: sha1:ff25d835cf026e5401004b26067c778c9e85fe38
@@ -9454,8 +9614,8 @@ trackedFiles:
pristine_git_object: 0f62389a8410522fe76eed82c64227903a8605c5
src/openrouter/operations/__init__.py:
id: 9afcea1e7161
- last_write_checksum: sha1:6c6afd7330b690e2bd2bae3ffd586a1d28456319
- pristine_git_object: 1044a7cfabd59c96334c9119c647622d3947e9f3
+ last_write_checksum: sha1:79b687677ed95380c7548ec6ed3e3efa0a32f386
+ pristine_git_object: 71aa5c14ab18f683fe648f8a08e8190d6dc894d2
src/openrouter/operations/bulkaddworkspacemembers.py:
id: e0ed56117619
last_write_checksum: sha1:5c44eb0d40fdece3ac084615f6c6082be4cf1d5a
@@ -9540,6 +9700,10 @@ trackedFiles:
id: afb834172b62
last_write_checksum: sha1:3cfb72d6b7dc9c55dc3955b53b0a7326a11f4688
pristine_git_object: a0925b14a4c830b168dd050798329cf364122091
+ src/openrouter/operations/createscimgroupmapping.py:
+ id: 48a7da108d46
+ last_write_checksum: sha1:7d510d57cce56c508847565be44dfe0f2d2812e3
+ pristine_git_object: 5e9dc6fb071c8087c7edbd766dded2fc19e00c9f
src/openrouter/operations/createvideos.py:
id: d52f6a4a3fe4
last_write_checksum: sha1:dbcf7068a23f48a5d4cfd9c8150206731a40cc9b
@@ -9568,6 +9732,10 @@ trackedFiles:
id: efcdc4e7e19d
last_write_checksum: sha1:975fb2edbcb96c6e890d1ed6ce2101ae261600d8
pristine_git_object: 92560ae6d7ad4399f3f1f8a2bf9347ac5f0d7283
+ src/openrouter/operations/deletescimgroupmapping.py:
+ id: 5006e36e243e
+ last_write_checksum: sha1:e3842ba18645e0c26de1810acce50da3b90e2cfc
+ pristine_git_object: fec5503fa15f0f9588686f364f2066bf55f3ea80
src/openrouter/operations/deleteworkspace.py:
id: f92017ce65e8
last_write_checksum: sha1:4ed5d02547fd400d801117e13ae108f6256fc591
@@ -9648,6 +9816,10 @@ trackedFiles:
id: 61dd0325de08
last_write_checksum: sha1:352d2aeaebf68140c78343f31cc8ba344dc3d9ae
pristine_git_object: fb9267c75f1e40b75ad22f313c3c1028f026f657
+ src/openrouter/operations/getscimgroupmapping.py:
+ id: e1222ef7697e
+ last_write_checksum: sha1:e1d1933f745296958538ae7c4bdc8ead53944492
+ pristine_git_object: d930ef5a4202b0ec9a88329927f7ea6373a7971f
src/openrouter/operations/gettaskclassifications.py:
id: ba6156d68acf
last_write_checksum: sha1:c569572d21aa766ac542d5c535208e8b1caae503
@@ -9748,6 +9920,14 @@ trackedFiles:
id: cf6e2db15118
last_write_checksum: sha1:decee82d2b55738162cc47f02f56c592d53f9ee9
pristine_git_object: 80bcd4b8e5d9e5f92ab4375175d6ee3a826a2e94
+ src/openrouter/operations/listscimgroupmappings.py:
+ id: 67a3b97ff2bc
+ last_write_checksum: sha1:5acad915dd8fcaa9bc7dd4e087635023ae5a4ebf
+ pristine_git_object: a913e2774bfb2a74def1a707076fad6cb49b6496
+ src/openrouter/operations/listscimgroups.py:
+ id: 9f32309bb157
+ last_write_checksum: sha1:530b9e465c38b29c313a2c3a4bc596055825fd81
+ pristine_git_object: 8d3d678ade3ba25aa65c4ff0bc3cb0783d87106a
src/openrouter/operations/listvideoscontent.py:
id: c27f9deb98f8
last_write_checksum: sha1:7eadc5d4d5f52469c09740d08f56970fafb407f2
@@ -9796,6 +9976,10 @@ trackedFiles:
id: 18e06708d1b4
last_write_checksum: sha1:d490e19e8698ed5193df9d06673f975cb3a1410f
pristine_git_object: e2819c904941d06f664a29312d9515150412ac44
+ src/openrouter/operations/updatescimgroupmapping.py:
+ id: 5887929f6dff
+ last_write_checksum: sha1:c989609f3c53c3e455f0ad77595a1ce07a21b6e9
+ pristine_git_object: 2cceda1e615ee9e5f8d3d2aedf23f4d49b5110ed
src/openrouter/operations/updateworkspace.py:
id: 2e9960985cbc
last_write_checksum: sha1:0b74790d6673ca8bb8c203d97c5a6ce8128a16df
@@ -9832,10 +10016,14 @@ trackedFiles:
id: f2108fb635e1
last_write_checksum: sha1:30ccc0290b363a2cd9292a3cbcaadcdcd08e80a8
pristine_git_object: 0376b684fe0a28516ea79f0d036668163fc9ed4d
+ src/openrouter/scim.py:
+ id: 351afd6b616e
+ last_write_checksum: sha1:a20b8969f347f771fdcd6c8ea396ce3cd74ddc45
+ pristine_git_object: f6ad93a8202863708520f9fdb7043eeb4f1f1fc6
src/openrouter/sdk.py:
id: ee9846c4c9c5
- last_write_checksum: sha1:cfd9ed072cc69753aeb8142c70a6b54d5be69514
- pristine_git_object: 9fdcc2fce0bff737021a66cb2c2548473036a973
+ last_write_checksum: sha1:a93d3271a6996e95f800f8c70eb26c81012d05bc
+ pristine_git_object: 3846f88706ca912096cfc40a460f6a0bb431c546
src/openrouter/sdkconfiguration.py:
id: 55773bb98d7c
last_write_checksum: sha1:c01826125c31a8b8bc99d9d679782c8758fae001
@@ -11536,4 +11724,109 @@ examples:
application/json: {"error": {"code": 429, "message": "Rate limit exceeded"}}
"500":
application/json: {"error": {"code": 500, "message": "Internal Server Error"}}
+ listScimGroupMappings:
+ speakeasy-default-list-scim-group-mappings:
+ parameters:
+ query:
+ offset: 0
+ limit: 50
+ responses:
+ "200":
+ application/json: {"data": [{"created_at": "2025-08-24T10:30:00.000Z", "id": "770e8400-e29b-41d4-a716-446655440000", "organization_id": "org_123456", "role": "member", "scim_group_id": "550e8400-e29b-41d4-a716-446655440000", "updated_at": "2025-08-24T10:30:00.000Z", "workspace_id": "660e8400-e29b-41d4-a716-446655440000"}], "total_count": 320360}
+ "401":
+ application/json: {"error": {"code": 401, "message": "Missing Authentication header"}}
+ "404":
+ application/json: {"error": {"code": 404, "message": "Resource not found"}}
+ "500":
+ application/json: {"error": {"code": 500, "message": "Internal Server Error"}}
+ createScimGroupMapping:
+ speakeasy-default-create-scim-group-mapping:
+ requestBody:
+ application/json: {"role": "admin", "scim_group_id": "ecdda85d-40dc-4ed7-9955-2bf12128e7da", "workspace_id": "d5a84a53-ce30-4057-ab5e-bd7b45553567"}
+ responses:
+ "201":
+ application/json: {"data": {"created_at": "2025-08-24T10:30:00.000Z", "id": "770e8400-e29b-41d4-a716-446655440000", "organization_id": "org_123456", "role": "member", "scim_group_id": "550e8400-e29b-41d4-a716-446655440000", "updated_at": "2025-08-24T10:30:00.000Z", "workspace_id": "660e8400-e29b-41d4-a716-446655440000"}}
+ "400":
+ application/json: {"error": {"code": 400, "message": "Invalid request parameters"}}
+ "401":
+ application/json: {"error": {"code": 401, "message": "Missing Authentication header"}}
+ "404":
+ application/json: {"error": {"code": 404, "message": "Resource not found"}}
+ "409":
+ application/json: {"error": {"code": 409, "message": "Resource conflict. Please try again later."}}
+ "500":
+ application/json: {"error": {"code": 500, "message": "Internal Server Error"}}
+ deleteScimGroupMapping:
+ speakeasy-default-delete-scim-group-mapping:
+ parameters:
+ path:
+ id: "ef7219ae-c495-43b3-b46b-52bf82772570"
+ query:
+ keep_members: false
+ responses:
+ "200":
+ application/json: {"deleted": true}
+ "400":
+ application/json: {"error": {"code": 400, "message": "Invalid request parameters"}}
+ "401":
+ application/json: {"error": {"code": 401, "message": "Missing Authentication header"}}
+ "404":
+ application/json: {"error": {"code": 404, "message": "Resource not found"}}
+ "500":
+ application/json: {"error": {"code": 500, "message": "Internal Server Error"}}
+ getScimGroupMapping:
+ speakeasy-default-get-scim-group-mapping:
+ parameters:
+ path:
+ id: "aca4d64d-fff7-419d-a8ae-3ec5ab8a0c1e"
+ responses:
+ "200":
+ application/json: {"data": {"created_at": "2025-08-24T10:30:00.000Z", "id": "770e8400-e29b-41d4-a716-446655440000", "organization_id": "org_123456", "role": "member", "scim_group_id": "550e8400-e29b-41d4-a716-446655440000", "updated_at": "2025-08-24T10:30:00.000Z", "workspace_id": "660e8400-e29b-41d4-a716-446655440000"}}
+ "401":
+ application/json: {"error": {"code": 401, "message": "Missing Authentication header"}}
+ "404":
+ application/json: {"error": {"code": 404, "message": "Resource not found"}}
+ "500":
+ application/json: {"error": {"code": 500, "message": "Internal Server Error"}}
+ updateScimGroupMapping:
+ speakeasy-default-update-scim-group-mapping:
+ parameters:
+ path:
+ id: "361a9698-8c34-4cbb-b0be-f6fd47094a30"
+ requestBody:
+ application/json: {"role": "member"}
+ responses:
+ "200":
+ application/json: {"data": {"created_at": "2025-08-24T10:30:00.000Z", "id": "770e8400-e29b-41d4-a716-446655440000", "organization_id": "org_123456", "role": "member", "scim_group_id": "550e8400-e29b-41d4-a716-446655440000", "updated_at": "2025-08-24T10:30:00.000Z", "workspace_id": "660e8400-e29b-41d4-a716-446655440000"}}
+ "400":
+ application/json: {"error": {"code": 400, "message": "Invalid request parameters"}}
+ "401":
+ application/json: {"error": {"code": 401, "message": "Missing Authentication header"}}
+ "404":
+ application/json: {"error": {"code": 404, "message": "Resource not found"}}
+ "500":
+ application/json: {"error": {"code": 500, "message": "Internal Server Error"}}
+ listScimGroups:
+ speakeasy-default-list-scim-groups:
+ parameters:
+ query:
+ offset: 0
+ limit: 50
+ responses:
+ "200":
+ application/json: {"data": [{"created_at": "2025-08-24T10:30:00.000Z", "display_name": "Engineering", "external_id": "group-external-id", "id": "550e8400-e29b-41d4-a716-446655440000", "organization_id": "org_123456", "updated_at": "2025-08-24T10:30:00.000Z"}], "total_count": 926673}
+ "401":
+ application/json: {"error": {"code": 401, "message": "Missing Authentication header"}}
+ "404":
+ application/json: {"error": {"code": 404, "message": "Resource not found"}}
+ "500":
+ application/json: {"error": {"code": 500, "message": "Internal Server Error"}}
examplesVersion: 1.0.2
+releaseNotes: |
+ ## Python SDK Changes:
+ * `open_router.scim.list_mappings()`: **Added**
+ * `open_router.scim.create()`: **Added**
+ * `open_router.scim.delete()`: **Added**
+ * `open_router.scim.read()`: **Added**
+ * `open_router.scim.update()`: **Added**
+ * `open_router.scim.list_groups()`: **Added**
diff --git a/.speakeasy/gen.yaml b/.speakeasy/gen.yaml
index d53d9a1a..b0676647 100644
--- a/.speakeasy/gen.yaml
+++ b/.speakeasy/gen.yaml
@@ -36,7 +36,7 @@ generation:
documentation: mintlify
preApplyUnionDiscriminators: true
python:
- version: 1.1.19
+ version: 1.1.20
additionalDependencies:
dev: {}
main: {}
diff --git a/.speakeasy/out.openapi.yaml b/.speakeasy/out.openapi.yaml
index 7bfb6e6d..7d4dbf70 100644
--- a/.speakeasy/out.openapi.yaml
+++ b/.speakeasy/out.openapi.yaml
@@ -7306,6 +7306,32 @@ components:
required:
- 'data'
type: 'object'
+ CreateScimGroupMappingRequest:
+ properties:
+ role:
+ enum:
+ - 'admin'
+ - 'member'
+ type: 'string'
+ x-speakeasy-unknown-values: allow
+ scim_group_id:
+ format: 'uuid'
+ type: 'string'
+ workspace_id:
+ format: 'uuid'
+ type: 'string'
+ required:
+ - 'scim_group_id'
+ - 'workspace_id'
+ - 'role'
+ type: 'object'
+ CreateScimGroupMappingResponse:
+ properties:
+ data:
+ $ref: '#/components/schemas/ScimGroupMapping'
+ required:
+ - 'data'
+ type: 'object'
CreateWorkspaceRequest:
example:
default_image_model: 'openai/dall-e-3'
@@ -7726,6 +7752,14 @@ components:
required:
- 'deleted'
type: 'object'
+ DeleteScimGroupMappingResponse:
+ properties:
+ deleted:
+ const: true
+ type: 'boolean'
+ required:
+ - 'deleted'
+ type: 'object'
DeleteWorkspaceBudgetResponse:
example:
deleted: true
@@ -9580,6 +9614,13 @@ components:
required:
- 'data'
type: 'object'
+ GetScimGroupMappingResponse:
+ properties:
+ data:
+ $ref: '#/components/schemas/ScimGroupMapping'
+ required:
+ - 'data'
+ type: 'object'
GetWorkspaceResponse:
example:
data:
@@ -11683,6 +11724,30 @@ components:
- 'data'
- 'total_count'
type: 'object'
+ ListScimGroupMappingsResponse:
+ properties:
+ data:
+ items:
+ $ref: '#/components/schemas/ScimGroupMapping'
+ type: 'array'
+ total_count:
+ type: 'integer'
+ required:
+ - 'data'
+ - 'total_count'
+ type: 'object'
+ ListScimGroupsResponse:
+ properties:
+ data:
+ items:
+ $ref: '#/components/schemas/ScimGroup'
+ type: 'array'
+ total_count:
+ type: 'integer'
+ required:
+ - 'data'
+ - 'total_count'
+ type: 'object'
ListWorkspaceBudgetsResponse:
example:
data:
@@ -21531,6 +21596,78 @@ components:
description: 'How long (in seconds) the container stays warm after its last command before sleeping, freeing its capacity slot. Idle-based: each command renews the timer. Defaults to 900 (15 minutes); capped at 2592000 (30 days).'
example: 900
type: 'integer'
+ ScimGroup:
+ example:
+ created_at: '2025-08-24T10:30:00.000Z'
+ display_name: 'Engineering'
+ external_id: 'group-external-id'
+ id: '550e8400-e29b-41d4-a716-446655440000'
+ organization_id: 'org_123456'
+ updated_at: '2025-08-24T10:30:00.000Z'
+ properties:
+ created_at:
+ type: 'string'
+ display_name:
+ type: 'string'
+ external_id:
+ type:
+ - 'string'
+ - 'null'
+ id:
+ format: 'uuid'
+ type: 'string'
+ organization_id:
+ type: 'string'
+ updated_at:
+ type: 'string'
+ required:
+ - 'id'
+ - 'organization_id'
+ - 'external_id'
+ - 'display_name'
+ - 'created_at'
+ - 'updated_at'
+ type: 'object'
+ ScimGroupMapping:
+ example:
+ created_at: '2025-08-24T10:30:00.000Z'
+ id: '770e8400-e29b-41d4-a716-446655440000'
+ organization_id: 'org_123456'
+ role: 'member'
+ scim_group_id: '550e8400-e29b-41d4-a716-446655440000'
+ updated_at: '2025-08-24T10:30:00.000Z'
+ workspace_id: '660e8400-e29b-41d4-a716-446655440000'
+ properties:
+ created_at:
+ type: 'string'
+ id:
+ format: 'uuid'
+ type: 'string'
+ organization_id:
+ type: 'string'
+ role:
+ enum:
+ - 'admin'
+ - 'member'
+ type: 'string'
+ x-speakeasy-unknown-values: allow
+ scim_group_id:
+ format: 'uuid'
+ type: 'string'
+ updated_at:
+ type: 'string'
+ workspace_id:
+ format: 'uuid'
+ type: 'string'
+ required:
+ - 'id'
+ - 'organization_id'
+ - 'scim_group_id'
+ - 'workspace_id'
+ - 'role'
+ - 'created_at'
+ - 'updated_at'
+ type: 'object'
SearchContextSizeEnum:
description: 'Size of the search context for web search tools'
enum:
@@ -23851,6 +23988,24 @@ components:
required:
- 'data'
type: 'object'
+ UpdateScimGroupMappingRequest:
+ properties:
+ role:
+ enum:
+ - 'admin'
+ - 'member'
+ type: 'string'
+ x-speakeasy-unknown-values: allow
+ required:
+ - 'role'
+ type: 'object'
+ UpdateScimGroupMappingResponse:
+ properties:
+ data:
+ $ref: '#/components/schemas/ScimGroupMapping'
+ required:
+ - 'data'
+ type: 'object'
UpdateWorkspaceRequest:
example:
name: 'Updated Workspace'
@@ -35894,6 +36049,444 @@ paths:
- $ref: "#/components/parameters/AppIdentifier"
- $ref: "#/components/parameters/AppDisplayName"
- $ref: "#/components/parameters/AppCategories"
+ /scim/group-mappings:
+ get:
+ description: 'List SCIM group-to-workspace mappings for the organization. [Management key](/docs/guides/overview/auth/management-api-keys) required.'
+ operationId: 'listScimGroupMappings'
+ parameters:
+ - description: 'Number of records to skip for pagination'
+ in: 'query'
+ name: 'offset'
+ required: false
+ schema:
+ default: 0
+ description: 'Number of records to skip for pagination'
+ example: 0
+ minimum: 0
+ type:
+ - 'integer'
+ - 'null'
+ nullable: false
+ - description: 'Maximum number of records to return (max 100)'
+ in: 'query'
+ name: 'limit'
+ required: false
+ schema:
+ default: 50
+ description: 'Maximum number of records to return (max 100)'
+ example: 50
+ maximum: 100
+ minimum: 1
+ type: 'integer'
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ListScimGroupMappingsResponse'
+ description: 'List of SCIM group mappings'
+ '401':
+ content:
+ application/json:
+ example:
+ error:
+ code: 401
+ message: 'Missing Authentication header'
+ schema:
+ $ref: '#/components/schemas/UnauthorizedResponse'
+ description: 'Unauthorized - Authentication required or invalid credentials'
+ '404':
+ content:
+ application/json:
+ example:
+ error:
+ code: 404
+ message: 'Resource not found'
+ schema:
+ $ref: '#/components/schemas/NotFoundResponse'
+ description: 'Not Found - Resource does not exist'
+ '500':
+ content:
+ application/json:
+ example:
+ error:
+ code: 500
+ message: 'Internal Server Error'
+ schema:
+ $ref: '#/components/schemas/InternalServerResponse'
+ description: 'Internal Server Error - Unexpected server error'
+ summary: 'List SCIM group mappings'
+ tags:
+ - 'SCIM'
+ x-speakeasy-name-override: 'listMappings'
+ x-speakeasy-pagination:
+ inputs:
+ - in: 'parameters'
+ name: 'offset'
+ type: 'offset'
+ - in: 'parameters'
+ name: 'limit'
+ type: 'limit'
+ outputs:
+ results: '$.data'
+ type: 'offsetLimit'
+ post:
+ description: 'Create a SCIM group-to-workspace role mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required.'
+ operationId: 'createScimGroupMapping'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/CreateScimGroupMappingRequest'
+ required: true
+ responses:
+ '201':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/CreateScimGroupMappingResponse'
+ description: 'SCIM group mapping created'
+ '400':
+ content:
+ application/json:
+ example:
+ error:
+ code: 400
+ message: 'Invalid request parameters'
+ schema:
+ $ref: '#/components/schemas/BadRequestResponse'
+ description: 'Bad Request - Invalid request parameters or malformed input'
+ '401':
+ content:
+ application/json:
+ example:
+ error:
+ code: 401
+ message: 'Missing Authentication header'
+ schema:
+ $ref: '#/components/schemas/UnauthorizedResponse'
+ description: 'Unauthorized - Authentication required or invalid credentials'
+ '404':
+ content:
+ application/json:
+ example:
+ error:
+ code: 404
+ message: 'Resource not found'
+ schema:
+ $ref: '#/components/schemas/NotFoundResponse'
+ description: 'Not Found - Resource does not exist'
+ '409':
+ content:
+ application/json:
+ example:
+ error:
+ code: 409
+ message: 'Resource conflict. Please try again later.'
+ schema:
+ $ref: '#/components/schemas/ConflictResponse'
+ description: 'Conflict - Resource conflict or concurrent modification'
+ '500':
+ content:
+ application/json:
+ example:
+ error:
+ code: 500
+ message: 'Internal Server Error'
+ schema:
+ $ref: '#/components/schemas/InternalServerResponse'
+ description: 'Internal Server Error - Unexpected server error'
+ summary: 'Create a SCIM group mapping'
+ tags:
+ - 'SCIM'
+ x-speakeasy-name-override: 'create'
+ parameters:
+ - $ref: "#/components/parameters/AppIdentifier"
+ - $ref: "#/components/parameters/AppDisplayName"
+ - $ref: "#/components/parameters/AppCategories"
+ /scim/group-mappings/{id}:
+ delete:
+ description: 'Delete a SCIM group-to-workspace mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required.'
+ operationId: 'deleteScimGroupMapping'
+ parameters:
+ - in: 'path'
+ name: 'id'
+ required: true
+ schema:
+ format: 'uuid'
+ type: 'string'
+ - description: 'Required. Whether to keep workspace members after deleting the mapping. `false` **removes** the members this mapping granted access to; `true` deletes the mapping while leaving membership intact as manually-managed. There is deliberately no default — omitting it returns `400` so the destructive path cannot be reached by accident. Mirrors the dashboard, whose `DeleteMappingSchema.keepMembers` is likewise required.'
+ in: 'query'
+ name: 'keep_members'
+ required: true
+ schema:
+ anyOf:
+ - enum:
+ - 'true'
+ - 'false'
+ type: 'string'
+ x-speakeasy-unknown-values: allow
+ - type: 'boolean'
+ description: 'Required. Whether to keep workspace members after deleting the mapping. `false` **removes** the members this mapping granted access to; `true` deletes the mapping while leaving membership intact as manually-managed. There is deliberately no default — omitting it returns `400` so the destructive path cannot be reached by accident. Mirrors the dashboard, whose `DeleteMappingSchema.keepMembers` is likewise required.'
+ example: false
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/DeleteScimGroupMappingResponse'
+ description: 'SCIM group mapping deleted'
+ '400':
+ content:
+ application/json:
+ example:
+ error:
+ code: 400
+ message: 'Invalid request parameters'
+ schema:
+ $ref: '#/components/schemas/BadRequestResponse'
+ description: 'Bad Request - Invalid request parameters or malformed input'
+ '401':
+ content:
+ application/json:
+ example:
+ error:
+ code: 401
+ message: 'Missing Authentication header'
+ schema:
+ $ref: '#/components/schemas/UnauthorizedResponse'
+ description: 'Unauthorized - Authentication required or invalid credentials'
+ '404':
+ content:
+ application/json:
+ example:
+ error:
+ code: 404
+ message: 'Resource not found'
+ schema:
+ $ref: '#/components/schemas/NotFoundResponse'
+ description: 'Not Found - Resource does not exist'
+ '500':
+ content:
+ application/json:
+ example:
+ error:
+ code: 500
+ message: 'Internal Server Error'
+ schema:
+ $ref: '#/components/schemas/InternalServerResponse'
+ description: 'Internal Server Error - Unexpected server error'
+ summary: 'Delete a SCIM group mapping'
+ tags:
+ - 'SCIM'
+ x-speakeasy-name-override: 'delete'
+ get:
+ description: 'Get a SCIM group-to-workspace mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required.'
+ operationId: 'getScimGroupMapping'
+ parameters:
+ - in: 'path'
+ name: 'id'
+ required: true
+ schema:
+ format: 'uuid'
+ type: 'string'
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/GetScimGroupMappingResponse'
+ description: 'SCIM group mapping'
+ '401':
+ content:
+ application/json:
+ example:
+ error:
+ code: 401
+ message: 'Missing Authentication header'
+ schema:
+ $ref: '#/components/schemas/UnauthorizedResponse'
+ description: 'Unauthorized - Authentication required or invalid credentials'
+ '404':
+ content:
+ application/json:
+ example:
+ error:
+ code: 404
+ message: 'Resource not found'
+ schema:
+ $ref: '#/components/schemas/NotFoundResponse'
+ description: 'Not Found - Resource does not exist'
+ '500':
+ content:
+ application/json:
+ example:
+ error:
+ code: 500
+ message: 'Internal Server Error'
+ schema:
+ $ref: '#/components/schemas/InternalServerResponse'
+ description: 'Internal Server Error - Unexpected server error'
+ summary: 'Get a SCIM group mapping'
+ tags:
+ - 'SCIM'
+ x-speakeasy-name-override: 'read'
+ patch:
+ description: 'Update a SCIM group mapping role. [Management key](/docs/guides/overview/auth/management-api-keys) required.'
+ operationId: 'updateScimGroupMapping'
+ parameters:
+ - in: 'path'
+ name: 'id'
+ required: true
+ schema:
+ format: 'uuid'
+ type: 'string'
+ requestBody:
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/UpdateScimGroupMappingRequest'
+ required: true
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/UpdateScimGroupMappingResponse'
+ description: 'SCIM group mapping updated'
+ '400':
+ content:
+ application/json:
+ example:
+ error:
+ code: 400
+ message: 'Invalid request parameters'
+ schema:
+ $ref: '#/components/schemas/BadRequestResponse'
+ description: 'Bad Request - Invalid request parameters or malformed input'
+ '401':
+ content:
+ application/json:
+ example:
+ error:
+ code: 401
+ message: 'Missing Authentication header'
+ schema:
+ $ref: '#/components/schemas/UnauthorizedResponse'
+ description: 'Unauthorized - Authentication required or invalid credentials'
+ '404':
+ content:
+ application/json:
+ example:
+ error:
+ code: 404
+ message: 'Resource not found'
+ schema:
+ $ref: '#/components/schemas/NotFoundResponse'
+ description: 'Not Found - Resource does not exist'
+ '500':
+ content:
+ application/json:
+ example:
+ error:
+ code: 500
+ message: 'Internal Server Error'
+ schema:
+ $ref: '#/components/schemas/InternalServerResponse'
+ description: 'Internal Server Error - Unexpected server error'
+ summary: 'Update a SCIM group mapping'
+ tags:
+ - 'SCIM'
+ x-speakeasy-name-override: 'update'
+ parameters:
+ - $ref: "#/components/parameters/AppIdentifier"
+ - $ref: "#/components/parameters/AppDisplayName"
+ - $ref: "#/components/parameters/AppCategories"
+ /scim/groups:
+ get:
+ description: 'List SCIM groups for the organization. [Management key](/docs/guides/overview/auth/management-api-keys) required.'
+ operationId: 'listScimGroups'
+ parameters:
+ - description: 'Number of records to skip for pagination'
+ in: 'query'
+ name: 'offset'
+ required: false
+ schema:
+ default: 0
+ description: 'Number of records to skip for pagination'
+ example: 0
+ minimum: 0
+ type:
+ - 'integer'
+ - 'null'
+ nullable: false
+ - description: 'Maximum number of records to return (max 100)'
+ in: 'query'
+ name: 'limit'
+ required: false
+ schema:
+ default: 50
+ description: 'Maximum number of records to return (max 100)'
+ example: 50
+ maximum: 100
+ minimum: 1
+ type: 'integer'
+ responses:
+ '200':
+ content:
+ application/json:
+ schema:
+ $ref: '#/components/schemas/ListScimGroupsResponse'
+ description: 'List of SCIM groups'
+ '401':
+ content:
+ application/json:
+ example:
+ error:
+ code: 401
+ message: 'Missing Authentication header'
+ schema:
+ $ref: '#/components/schemas/UnauthorizedResponse'
+ description: 'Unauthorized - Authentication required or invalid credentials'
+ '404':
+ content:
+ application/json:
+ example:
+ error:
+ code: 404
+ message: 'Resource not found'
+ schema:
+ $ref: '#/components/schemas/NotFoundResponse'
+ description: 'Not Found - Resource does not exist'
+ '500':
+ content:
+ application/json:
+ example:
+ error:
+ code: 500
+ message: 'Internal Server Error'
+ schema:
+ $ref: '#/components/schemas/InternalServerResponse'
+ description: 'Internal Server Error - Unexpected server error'
+ summary: 'List SCIM groups'
+ tags:
+ - 'SCIM'
+ x-speakeasy-name-override: 'listGroups'
+ x-speakeasy-pagination:
+ inputs:
+ - in: 'parameters'
+ name: 'offset'
+ type: 'offset'
+ - in: 'parameters'
+ name: 'limit'
+ type: 'limit'
+ outputs:
+ results: '$.data'
+ type: 'offsetLimit'
+ parameters:
+ - $ref: "#/components/parameters/AppIdentifier"
+ - $ref: "#/components/parameters/AppDisplayName"
+ - $ref: "#/components/parameters/AppCategories"
/videos:
post:
description: 'Submits a video generation request and returns a polling URL to check status'
@@ -37221,6 +37814,8 @@ tags:
name: 'Rerank'
- description: 'OpenAI-compatible Responses API endpoints'
name: 'Responses'
+ - description: 'SCIM endpoints'
+ name: 'SCIM'
- description: 'Speech-to-text endpoints'
name: 'STT'
x-displayName: 'Transcriptions'
diff --git a/.speakeasy/workflow.lock b/.speakeasy/workflow.lock
index c3603395..3873448f 100644
--- a/.speakeasy/workflow.lock
+++ b/.speakeasy/workflow.lock
@@ -2,8 +2,8 @@ speakeasyVersion: 1.787.0
sources:
OpenRouter API:
sourceNamespace: open-router-chat-completions-api
- sourceRevisionDigest: sha256:7a31fb4618f31111fe92f1ca6b3aef017cc70ca839661b3db3db39bae93e04dc
- sourceBlobDigest: sha256:86a165f8f0d523293c7524d3a3cd0b77c8762126573dbeeb8b7f9d30bd55c618
+ sourceRevisionDigest: sha256:4899932a9aa11fcd1f8472116fa746ef59056f8a33f6cc08df53031e37887e32
+ sourceBlobDigest: sha256:50d61f318fdf1f026d41fd26976aef9ac7ca2e462650cbd7cca260e17611d61d
tags:
- latest
- 1.0.0
@@ -11,10 +11,10 @@ targets:
open-router:
source: OpenRouter API
sourceNamespace: open-router-chat-completions-api
- sourceRevisionDigest: sha256:7a31fb4618f31111fe92f1ca6b3aef017cc70ca839661b3db3db39bae93e04dc
- sourceBlobDigest: sha256:86a165f8f0d523293c7524d3a3cd0b77c8762126573dbeeb8b7f9d30bd55c618
+ sourceRevisionDigest: sha256:4899932a9aa11fcd1f8472116fa746ef59056f8a33f6cc08df53031e37887e32
+ sourceBlobDigest: sha256:50d61f318fdf1f026d41fd26976aef9ac7ca2e462650cbd7cca260e17611d61d
codeSamplesNamespace: open-router-python-code-samples
- codeSamplesRevisionDigest: sha256:2b61e0bdf6df067c6e72f6ec6864dc089642c0655a579fda9b3bd06596fe1f50
+ codeSamplesRevisionDigest: sha256:369a78b648f89a6e7740d32e6cc537cee534609caebc2fad23dd50dab7dc05a3
workflow:
workflowVersion: 1.0.0
speakeasyVersion: 1.787.0
diff --git a/RELEASES.md b/RELEASES.md
index c5a5c1fa..3e836fb8 100644
--- a/RELEASES.md
+++ b/RELEASES.md
@@ -979,4 +979,14 @@ Based on:
### Generated
- [python v1.1.18] .
### Releases
-- [PyPI v1.1.18] https://pypi.org/project/openrouter/1.1.18 - .
\ No newline at end of file
+- [PyPI v1.1.18] https://pypi.org/project/openrouter/1.1.18 - .
+
+## 2026-07-30 19:23:28
+### Changes
+Based on:
+- OpenAPI Doc
+- Speakeasy CLI 1.787.0 (2.914.0) https://github.com/speakeasy-api/speakeasy
+### Generated
+- [python v1.1.20] .
+### Releases
+- [PyPI v1.1.20] https://pypi.org/project/openrouter/1.1.20 - .
\ No newline at end of file
diff --git a/docs/components/createscimgroupmappingrequest.mdx b/docs/components/createscimgroupmappingrequest.mdx
new file mode 100644
index 00000000..5ad1269c
--- /dev/null
+++ b/docs/components/createscimgroupmappingrequest.mdx
@@ -0,0 +1,11 @@
+---
+title: "CreateScimGroupMappingRequest"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
+| `role` | [components.CreateScimGroupMappingRequestRole](../components/createscimgroupmappingrequestrole.mdx) | :heavy_check_mark: | N/A |
+| `scim_group_id` | *str* | :heavy_check_mark: | N/A |
+| `workspace_id` | *str* | :heavy_check_mark: | N/A |
\ No newline at end of file
diff --git a/docs/components/createscimgroupmappingrequestrole.mdx b/docs/components/createscimgroupmappingrequestrole.mdx
new file mode 100644
index 00000000..f49282c4
--- /dev/null
+++ b/docs/components/createscimgroupmappingrequestrole.mdx
@@ -0,0 +1,20 @@
+---
+title: "CreateScimGroupMappingRequestRole"
+---
+
+## Example Usage
+
+```python
+from openrouter.components import CreateScimGroupMappingRequestRole
+
+# Open enum: unrecognized values are captured as UnrecognizedStr
+value: CreateScimGroupMappingRequestRole = "admin"
+```
+
+
+## Values
+
+This is an open enum. Unrecognized values will not fail type checks.
+
+- `"admin"`
+- `"member"`
diff --git a/docs/components/createscimgroupmappingresponse.mdx b/docs/components/createscimgroupmappingresponse.mdx
new file mode 100644
index 00000000..9ac0db3f
--- /dev/null
+++ b/docs/components/createscimgroupmappingresponse.mdx
@@ -0,0 +1,9 @@
+---
+title: "CreateScimGroupMappingResponse"
+---
+
+## Fields
+
+| Field | Type | Required | Description | Example |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data` | [components.ScimGroupMapping](../components/scimgroupmapping.mdx) | :heavy_check_mark: | N/A | \{
"created_at": "2025-08-24T10:30:00.000Z",
"id": "770e8400-e29b-41d4-a716-446655440000",
"organization_id": "org_123456",
"role": "member",
"scim_group_id": "550e8400-e29b-41d4-a716-446655440000",
"updated_at": "2025-08-24T10:30:00.000Z",
"workspace_id": "660e8400-e29b-41d4-a716-446655440000"
} |
\ No newline at end of file
diff --git a/docs/components/deletescimgroupmappingresponse.mdx b/docs/components/deletescimgroupmappingresponse.mdx
new file mode 100644
index 00000000..1ed4e164
--- /dev/null
+++ b/docs/components/deletescimgroupmappingresponse.mdx
@@ -0,0 +1,9 @@
+---
+title: "DeleteScimGroupMappingResponse"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| ------------------ | ------------------ | ------------------ | ------------------ |
+| `deleted` | *Literal[True]* | :heavy_check_mark: | N/A |
\ No newline at end of file
diff --git a/docs/components/getscimgroupmappingresponse.mdx b/docs/components/getscimgroupmappingresponse.mdx
new file mode 100644
index 00000000..3031bf11
--- /dev/null
+++ b/docs/components/getscimgroupmappingresponse.mdx
@@ -0,0 +1,9 @@
+---
+title: "GetScimGroupMappingResponse"
+---
+
+## Fields
+
+| Field | Type | Required | Description | Example |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data` | [components.ScimGroupMapping](../components/scimgroupmapping.mdx) | :heavy_check_mark: | N/A | \{
"created_at": "2025-08-24T10:30:00.000Z",
"id": "770e8400-e29b-41d4-a716-446655440000",
"organization_id": "org_123456",
"role": "member",
"scim_group_id": "550e8400-e29b-41d4-a716-446655440000",
"updated_at": "2025-08-24T10:30:00.000Z",
"workspace_id": "660e8400-e29b-41d4-a716-446655440000"
} |
\ No newline at end of file
diff --git a/docs/components/listscimgroupmappingsresponse.mdx b/docs/components/listscimgroupmappingsresponse.mdx
new file mode 100644
index 00000000..14dff7d7
--- /dev/null
+++ b/docs/components/listscimgroupmappingsresponse.mdx
@@ -0,0 +1,10 @@
+---
+title: "ListScimGroupMappingsResponse"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- | ---------------------------------------------------------------------- |
+| `data` | List[[components.ScimGroupMapping](../components/scimgroupmapping.mdx)] | :heavy_check_mark: | N/A |
+| `total_count` | *int* | :heavy_check_mark: | N/A |
\ No newline at end of file
diff --git a/docs/components/listscimgroupsresponse.mdx b/docs/components/listscimgroupsresponse.mdx
new file mode 100644
index 00000000..6c0e6c81
--- /dev/null
+++ b/docs/components/listscimgroupsresponse.mdx
@@ -0,0 +1,10 @@
+---
+title: "ListScimGroupsResponse"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| -------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------- | -------------------------------------------------------- |
+| `data` | List[[components.ScimGroup](../components/scimgroup.mdx)] | :heavy_check_mark: | N/A |
+| `total_count` | *int* | :heavy_check_mark: | N/A |
\ No newline at end of file
diff --git a/docs/components/scimgroup.mdx b/docs/components/scimgroup.mdx
new file mode 100644
index 00000000..98a3dfc3
--- /dev/null
+++ b/docs/components/scimgroup.mdx
@@ -0,0 +1,14 @@
+---
+title: "ScimGroup"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| ------------------ | ------------------ | ------------------ | ------------------ |
+| `created_at` | *str* | :heavy_check_mark: | N/A |
+| `display_name` | *str* | :heavy_check_mark: | N/A |
+| `external_id` | *Nullable[str]* | :heavy_check_mark: | N/A |
+| `id` | *str* | :heavy_check_mark: | N/A |
+| `organization_id` | *str* | :heavy_check_mark: | N/A |
+| `updated_at` | *str* | :heavy_check_mark: | N/A |
\ No newline at end of file
diff --git a/docs/components/scimgroupmapping.mdx b/docs/components/scimgroupmapping.mdx
new file mode 100644
index 00000000..a1ee91fa
--- /dev/null
+++ b/docs/components/scimgroupmapping.mdx
@@ -0,0 +1,15 @@
+---
+title: "ScimGroupMapping"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ | ------------------------------------------------------------------------ |
+| `created_at` | *str* | :heavy_check_mark: | N/A |
+| `id` | *str* | :heavy_check_mark: | N/A |
+| `organization_id` | *str* | :heavy_check_mark: | N/A |
+| `role` | [components.ScimGroupMappingRole](../components/scimgroupmappingrole.mdx) | :heavy_check_mark: | N/A |
+| `scim_group_id` | *str* | :heavy_check_mark: | N/A |
+| `updated_at` | *str* | :heavy_check_mark: | N/A |
+| `workspace_id` | *str* | :heavy_check_mark: | N/A |
\ No newline at end of file
diff --git a/docs/components/scimgroupmappingrole.mdx b/docs/components/scimgroupmappingrole.mdx
new file mode 100644
index 00000000..94331ee5
--- /dev/null
+++ b/docs/components/scimgroupmappingrole.mdx
@@ -0,0 +1,20 @@
+---
+title: "ScimGroupMappingRole"
+---
+
+## Example Usage
+
+```python
+from openrouter.components import ScimGroupMappingRole
+
+# Open enum: unrecognized values are captured as UnrecognizedStr
+value: ScimGroupMappingRole = "admin"
+```
+
+
+## Values
+
+This is an open enum. Unrecognized values will not fail type checks.
+
+- `"admin"`
+- `"member"`
diff --git a/docs/components/updatescimgroupmappingrequest.mdx b/docs/components/updatescimgroupmappingrequest.mdx
new file mode 100644
index 00000000..8206d918
--- /dev/null
+++ b/docs/components/updatescimgroupmappingrequest.mdx
@@ -0,0 +1,9 @@
+---
+title: "UpdateScimGroupMappingRequest"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- |
+| `role` | [components.UpdateScimGroupMappingRequestRole](../components/updatescimgroupmappingrequestrole.mdx) | :heavy_check_mark: | N/A |
\ No newline at end of file
diff --git a/docs/components/updatescimgroupmappingrequestrole.mdx b/docs/components/updatescimgroupmappingrequestrole.mdx
new file mode 100644
index 00000000..6f5f0062
--- /dev/null
+++ b/docs/components/updatescimgroupmappingrequestrole.mdx
@@ -0,0 +1,20 @@
+---
+title: "UpdateScimGroupMappingRequestRole"
+---
+
+## Example Usage
+
+```python
+from openrouter.components import UpdateScimGroupMappingRequestRole
+
+# Open enum: unrecognized values are captured as UnrecognizedStr
+value: UpdateScimGroupMappingRequestRole = "admin"
+```
+
+
+## Values
+
+This is an open enum. Unrecognized values will not fail type checks.
+
+- `"admin"`
+- `"member"`
diff --git a/docs/components/updatescimgroupmappingresponse.mdx b/docs/components/updatescimgroupmappingresponse.mdx
new file mode 100644
index 00000000..651230ce
--- /dev/null
+++ b/docs/components/updatescimgroupmappingresponse.mdx
@@ -0,0 +1,9 @@
+---
+title: "UpdateScimGroupMappingResponse"
+---
+
+## Fields
+
+| Field | Type | Required | Description | Example |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `data` | [components.ScimGroupMapping](../components/scimgroupmapping.mdx) | :heavy_check_mark: | N/A | \{
"created_at": "2025-08-24T10:30:00.000Z",
"id": "770e8400-e29b-41d4-a716-446655440000",
"organization_id": "org_123456",
"role": "member",
"scim_group_id": "550e8400-e29b-41d4-a716-446655440000",
"updated_at": "2025-08-24T10:30:00.000Z",
"workspace_id": "660e8400-e29b-41d4-a716-446655440000"
} |
\ No newline at end of file
diff --git a/docs/docs.json b/docs/docs.json
index a9ef22cd..918adb36 100644
--- a/docs/docs.json
+++ b/docs/docs.json
@@ -34,6 +34,7 @@
"sdks/providers/README",
"sdks/rerank/README",
"sdks/responses/README",
+ "sdks/scim/README",
"sdks/stt/README",
"sdks/tts/README",
"sdks/videogeneration/README",
diff --git a/docs/operations/createscimgroupmappingglobals.mdx b/docs/operations/createscimgroupmappingglobals.mdx
new file mode 100644
index 00000000..ee1187f7
--- /dev/null
+++ b/docs/operations/createscimgroupmappingglobals.mdx
@@ -0,0 +1,11 @@
+---
+title: "CreateScimGroupMappingGlobals"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
|
+| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.
|
+| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
|
\ No newline at end of file
diff --git a/docs/operations/createscimgroupmappingrequest.mdx b/docs/operations/createscimgroupmappingrequest.mdx
new file mode 100644
index 00000000..c5b268ab
--- /dev/null
+++ b/docs/operations/createscimgroupmappingrequest.mdx
@@ -0,0 +1,12 @@
+---
+title: "CreateScimGroupMappingRequest"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
|
+| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.
|
+| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
|
+| `create_scim_group_mapping_request` | [components.CreateScimGroupMappingRequest](../components/createscimgroupmappingrequest.mdx) | :heavy_check_mark: | N/A |
\ No newline at end of file
diff --git a/docs/operations/deletescimgroupmappingglobals.mdx b/docs/operations/deletescimgroupmappingglobals.mdx
new file mode 100644
index 00000000..098b906f
--- /dev/null
+++ b/docs/operations/deletescimgroupmappingglobals.mdx
@@ -0,0 +1,11 @@
+---
+title: "DeleteScimGroupMappingGlobals"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
|
+| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.
|
+| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
|
\ No newline at end of file
diff --git a/docs/operations/deletescimgroupmappingrequest.mdx b/docs/operations/deletescimgroupmappingrequest.mdx
new file mode 100644
index 00000000..44e2e267
--- /dev/null
+++ b/docs/operations/deletescimgroupmappingrequest.mdx
@@ -0,0 +1,13 @@
+---
+title: "DeleteScimGroupMappingRequest"
+---
+
+## Fields
+
+| Field | Type | Required | Description | Example |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
| |
+| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.
| |
+| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
| |
+| `id` | *str* | :heavy_check_mark: | N/A | |
+| `keep_members` | [operations.KeepMembers](../operations/keepmembers.mdx) | :heavy_check_mark: | Required. Whether to keep workspace members after deleting the mapping. `false` **removes** the members this mapping granted access to; `true` deletes the mapping while leaving membership intact as manually-managed. There is deliberately no default — omitting it returns `400` so the destructive path cannot be reached by accident. Mirrors the dashboard, whose `DeleteMappingSchema.keepMembers` is likewise required. | false |
\ No newline at end of file
diff --git a/docs/operations/getscimgroupmappingglobals.mdx b/docs/operations/getscimgroupmappingglobals.mdx
new file mode 100644
index 00000000..6d93a7f2
--- /dev/null
+++ b/docs/operations/getscimgroupmappingglobals.mdx
@@ -0,0 +1,11 @@
+---
+title: "GetScimGroupMappingGlobals"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
|
+| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.
|
+| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
|
\ No newline at end of file
diff --git a/docs/operations/getscimgroupmappingrequest.mdx b/docs/operations/getscimgroupmappingrequest.mdx
new file mode 100644
index 00000000..65e59b60
--- /dev/null
+++ b/docs/operations/getscimgroupmappingrequest.mdx
@@ -0,0 +1,12 @@
+---
+title: "GetScimGroupMappingRequest"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
|
+| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.
|
+| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
|
+| `id` | *str* | :heavy_check_mark: | N/A |
\ No newline at end of file
diff --git a/docs/operations/keepmembers.mdx b/docs/operations/keepmembers.mdx
new file mode 100644
index 00000000..8f46e9ff
--- /dev/null
+++ b/docs/operations/keepmembers.mdx
@@ -0,0 +1,21 @@
+---
+title: "KeepMembers"
+---
+
+Required. Whether to keep workspace members after deleting the mapping. `false` **removes** the members this mapping granted access to; `true` deletes the mapping while leaving membership intact as manually-managed. There is deliberately no default — omitting it returns `400` so the destructive path cannot be reached by accident. Mirrors the dashboard, whose `DeleteMappingSchema.keepMembers` is likewise required.
+
+
+## Supported Types
+
+### `operations.KeepMembersEnum`
+
+```python
+value: operations.KeepMembersEnum = /* values here */
+```
+
+### `bool`
+
+```python
+value: bool = /* values here */
+```
+
diff --git a/docs/operations/keepmembersenum.mdx b/docs/operations/keepmembersenum.mdx
new file mode 100644
index 00000000..50c5569b
--- /dev/null
+++ b/docs/operations/keepmembersenum.mdx
@@ -0,0 +1,20 @@
+---
+title: "KeepMembersEnum"
+---
+
+## Example Usage
+
+```python
+from openrouter.operations import KeepMembersEnum
+
+# Open enum: unrecognized values are captured as UnrecognizedStr
+value: KeepMembersEnum = "true"
+```
+
+
+## Values
+
+This is an open enum. Unrecognized values will not fail type checks.
+
+- `"true"`
+- `"false"`
diff --git a/docs/operations/listscimgroupmappingsglobals.mdx b/docs/operations/listscimgroupmappingsglobals.mdx
new file mode 100644
index 00000000..579e2ace
--- /dev/null
+++ b/docs/operations/listscimgroupmappingsglobals.mdx
@@ -0,0 +1,11 @@
+---
+title: "ListScimGroupMappingsGlobals"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
|
+| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.
|
+| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
|
\ No newline at end of file
diff --git a/docs/operations/listscimgroupmappingsrequest.mdx b/docs/operations/listscimgroupmappingsrequest.mdx
new file mode 100644
index 00000000..e30aea7a
--- /dev/null
+++ b/docs/operations/listscimgroupmappingsrequest.mdx
@@ -0,0 +1,13 @@
+---
+title: "ListScimGroupMappingsRequest"
+---
+
+## Fields
+
+| Field | Type | Required | Description | Example |
+| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
| |
+| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.
| |
+| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
| |
+| `offset` | *OptionalNullable[int]* | :heavy_minus_sign: | Number of records to skip for pagination | 0 |
+| `limit` | *Optional[int]* | :heavy_minus_sign: | Maximum number of records to return (max 100) | 50 |
\ No newline at end of file
diff --git a/docs/operations/listscimgroupmappingsresponse.mdx b/docs/operations/listscimgroupmappingsresponse.mdx
new file mode 100644
index 00000000..f426e5f4
--- /dev/null
+++ b/docs/operations/listscimgroupmappingsresponse.mdx
@@ -0,0 +1,9 @@
+---
+title: "ListScimGroupMappingsResponse"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------ |
+| `result` | [components.ListScimGroupMappingsResponse](../components/listscimgroupmappingsresponse.mdx) | :heavy_check_mark: | N/A |
\ No newline at end of file
diff --git a/docs/operations/listscimgroupsglobals.mdx b/docs/operations/listscimgroupsglobals.mdx
new file mode 100644
index 00000000..5294ada2
--- /dev/null
+++ b/docs/operations/listscimgroupsglobals.mdx
@@ -0,0 +1,11 @@
+---
+title: "ListScimGroupsGlobals"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
|
+| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.
|
+| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
|
\ No newline at end of file
diff --git a/docs/operations/listscimgroupsrequest.mdx b/docs/operations/listscimgroupsrequest.mdx
new file mode 100644
index 00000000..559e6e18
--- /dev/null
+++ b/docs/operations/listscimgroupsrequest.mdx
@@ -0,0 +1,13 @@
+---
+title: "ListScimGroupsRequest"
+---
+
+## Fields
+
+| Field | Type | Required | Description | Example |
+| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
| |
+| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.
| |
+| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
| |
+| `offset` | *OptionalNullable[int]* | :heavy_minus_sign: | Number of records to skip for pagination | 0 |
+| `limit` | *Optional[int]* | :heavy_minus_sign: | Maximum number of records to return (max 100) | 50 |
\ No newline at end of file
diff --git a/docs/operations/listscimgroupsresponse.mdx b/docs/operations/listscimgroupsresponse.mdx
new file mode 100644
index 00000000..80f9a41f
--- /dev/null
+++ b/docs/operations/listscimgroupsresponse.mdx
@@ -0,0 +1,9 @@
+---
+title: "ListScimGroupsResponse"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- | ---------------------------------------------------------------------------- |
+| `result` | [components.ListScimGroupsResponse](../components/listscimgroupsresponse.mdx) | :heavy_check_mark: | N/A |
\ No newline at end of file
diff --git a/docs/operations/updatescimgroupmappingglobals.mdx b/docs/operations/updatescimgroupmappingglobals.mdx
new file mode 100644
index 00000000..a8893db6
--- /dev/null
+++ b/docs/operations/updatescimgroupmappingglobals.mdx
@@ -0,0 +1,11 @@
+---
+title: "UpdateScimGroupMappingGlobals"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
|
+| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.
|
+| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
|
\ No newline at end of file
diff --git a/docs/operations/updatescimgroupmappingrequest.mdx b/docs/operations/updatescimgroupmappingrequest.mdx
new file mode 100644
index 00000000..a2785d52
--- /dev/null
+++ b/docs/operations/updatescimgroupmappingrequest.mdx
@@ -0,0 +1,13 @@
+---
+title: "UpdateScimGroupMappingRequest"
+---
+
+## Fields
+
+| Field | Type | Required | Description |
+| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
|
+| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.
|
+| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
|
+| `id` | *str* | :heavy_check_mark: | N/A |
+| `update_scim_group_mapping_request` | [components.UpdateScimGroupMappingRequest](../components/updatescimgroupmappingrequest.mdx) | :heavy_check_mark: | N/A |
\ No newline at end of file
diff --git a/docs/sdks/scim/README.mdx b/docs/sdks/scim/README.mdx
new file mode 100644
index 00000000..89918692
--- /dev/null
+++ b/docs/sdks/scim/README.mdx
@@ -0,0 +1,319 @@
+---
+title: "Scim"
+description: "SCIM endpoints"
+---
+
+## Overview
+
+SCIM endpoints
+
+### Available Operations
+
+* [list_mappings](#list_mappings) - List SCIM group mappings
+* [create](#create) - Create a SCIM group mapping
+* [delete](#delete) - Delete a SCIM group mapping
+* [read](#read) - Get a SCIM group mapping
+* [update](#update) - Update a SCIM group mapping
+* [list_groups](#list_groups) - List SCIM groups
+
+## list_mappings
+
+List SCIM group-to-workspace mappings for the organization. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+
+### Example Usage
+
+```python
+from openrouter import OpenRouter
+import os
+
+
+with OpenRouter(
+ http_referer="",
+ x_open_router_title="",
+ x_open_router_categories="",
+ api_key=os.getenv("OPENROUTER_API_KEY", ""),
+) as open_router:
+
+ res = open_router.scim.list_mappings(offset=0, limit=50)
+
+ while res is not None:
+ # Handle items
+
+ res = res.next()
+
+```
+
+### Parameters
+
+| Parameter | Type | Required | Description | Example |
+| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
| |
+| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.
| |
+| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
| |
+| `offset` | *OptionalNullable[int]* | :heavy_minus_sign: | Number of records to skip for pagination | 0 |
+| `limit` | *Optional[int]* | :heavy_minus_sign: | Maximum number of records to return (max 100) | 50 |
+| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.mdx) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | |
+
+### Response
+
+**[operations.ListScimGroupMappingsResponse](../../operations/listscimgroupmappingsresponse.mdx)**
+
+### Errors
+
+| Error Type | Status Code | Content Type |
+| ---------------------------------- | ---------------------------------- | ---------------------------------- |
+| errors.UnauthorizedResponseError | 401 | application/json |
+| errors.NotFoundResponseError | 404 | application/json |
+| errors.InternalServerResponseError | 500 | application/json |
+| errors.OpenRouterDefaultError | 4XX, 5XX | \*/\* |
+
+## create
+
+Create a SCIM group-to-workspace role mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+
+### Example Usage
+
+```python
+from openrouter import OpenRouter
+import os
+
+
+with OpenRouter(
+ http_referer="",
+ x_open_router_title="",
+ x_open_router_categories="",
+ api_key=os.getenv("OPENROUTER_API_KEY", ""),
+) as open_router:
+
+ res = open_router.scim.create(role="admin", scim_group_id="ecdda85d-40dc-4ed7-9955-2bf12128e7da", workspace_id="d5a84a53-ce30-4057-ab5e-bd7b45553567")
+
+ # Handle response
+ print(res)
+
+```
+
+### Parameters
+
+| Parameter | Type | Required | Description |
+| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `role` | [components.CreateScimGroupMappingRequestRole](../../components/createscimgroupmappingrequestrole.mdx) | :heavy_check_mark: | N/A |
+| `scim_group_id` | *str* | :heavy_check_mark: | N/A |
+| `workspace_id` | *str* | :heavy_check_mark: | N/A |
+| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
|
+| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.
|
+| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
|
+| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.mdx) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. |
+
+### Response
+
+**[components.CreateScimGroupMappingResponse](../../components/createscimgroupmappingresponse.mdx)**
+
+### Errors
+
+| Error Type | Status Code | Content Type |
+| ---------------------------------- | ---------------------------------- | ---------------------------------- |
+| errors.BadRequestResponseError | 400 | application/json |
+| errors.UnauthorizedResponseError | 401 | application/json |
+| errors.NotFoundResponseError | 404 | application/json |
+| errors.ConflictResponseError | 409 | application/json |
+| errors.InternalServerResponseError | 500 | application/json |
+| errors.OpenRouterDefaultError | 4XX, 5XX | \*/\* |
+
+## delete
+
+Delete a SCIM group-to-workspace mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+
+### Example Usage
+
+```python
+from openrouter import OpenRouter
+import os
+
+
+with OpenRouter(
+ http_referer="",
+ x_open_router_title="",
+ x_open_router_categories="",
+ api_key=os.getenv("OPENROUTER_API_KEY", ""),
+) as open_router:
+
+ res = open_router.scim.delete(id="ef7219ae-c495-43b3-b46b-52bf82772570", keep_members=False)
+
+ # Handle response
+ print(res)
+
+```
+
+### Parameters
+
+| Parameter | Type | Required | Description | Example |
+| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `id` | *str* | :heavy_check_mark: | N/A | |
+| `keep_members` | [operations.KeepMembers](../../operations/keepmembers.mdx) | :heavy_check_mark: | Required. Whether to keep workspace members after deleting the mapping. `false` **removes** the members this mapping granted access to; `true` deletes the mapping while leaving membership intact as manually-managed. There is deliberately no default — omitting it returns `400` so the destructive path cannot be reached by accident. Mirrors the dashboard, whose `DeleteMappingSchema.keepMembers` is likewise required. | false |
+| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
| |
+| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.
| |
+| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
| |
+| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.mdx) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | |
+
+### Response
+
+**[components.DeleteScimGroupMappingResponse](../../components/deletescimgroupmappingresponse.mdx)**
+
+### Errors
+
+| Error Type | Status Code | Content Type |
+| ---------------------------------- | ---------------------------------- | ---------------------------------- |
+| errors.BadRequestResponseError | 400 | application/json |
+| errors.UnauthorizedResponseError | 401 | application/json |
+| errors.NotFoundResponseError | 404 | application/json |
+| errors.InternalServerResponseError | 500 | application/json |
+| errors.OpenRouterDefaultError | 4XX, 5XX | \*/\* |
+
+## read
+
+Get a SCIM group-to-workspace mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+
+### Example Usage
+
+```python
+from openrouter import OpenRouter
+import os
+
+
+with OpenRouter(
+ http_referer="",
+ x_open_router_title="",
+ x_open_router_categories="",
+ api_key=os.getenv("OPENROUTER_API_KEY", ""),
+) as open_router:
+
+ res = open_router.scim.read(id="aca4d64d-fff7-419d-a8ae-3ec5ab8a0c1e")
+
+ # Handle response
+ print(res)
+
+```
+
+### Parameters
+
+| Parameter | Type | Required | Description |
+| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `id` | *str* | :heavy_check_mark: | N/A |
+| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
|
+| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.
|
+| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
|
+| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.mdx) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. |
+
+### Response
+
+**[components.GetScimGroupMappingResponse](../../components/getscimgroupmappingresponse.mdx)**
+
+### Errors
+
+| Error Type | Status Code | Content Type |
+| ---------------------------------- | ---------------------------------- | ---------------------------------- |
+| errors.UnauthorizedResponseError | 401 | application/json |
+| errors.NotFoundResponseError | 404 | application/json |
+| errors.InternalServerResponseError | 500 | application/json |
+| errors.OpenRouterDefaultError | 4XX, 5XX | \*/\* |
+
+## update
+
+Update a SCIM group mapping role. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+
+### Example Usage
+
+```python
+from openrouter import OpenRouter
+import os
+
+
+with OpenRouter(
+ http_referer="",
+ x_open_router_title="",
+ x_open_router_categories="",
+ api_key=os.getenv("OPENROUTER_API_KEY", ""),
+) as open_router:
+
+ res = open_router.scim.update(id="361a9698-8c34-4cbb-b0be-f6fd47094a30", role="member")
+
+ # Handle response
+ print(res)
+
+```
+
+### Parameters
+
+| Parameter | Type | Required | Description |
+| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `id` | *str* | :heavy_check_mark: | N/A |
+| `role` | [components.UpdateScimGroupMappingRequestRole](../../components/updatescimgroupmappingrequestrole.mdx) | :heavy_check_mark: | N/A |
+| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
|
+| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.
|
+| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
|
+| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.mdx) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. |
+
+### Response
+
+**[components.UpdateScimGroupMappingResponse](../../components/updatescimgroupmappingresponse.mdx)**
+
+### Errors
+
+| Error Type | Status Code | Content Type |
+| ---------------------------------- | ---------------------------------- | ---------------------------------- |
+| errors.BadRequestResponseError | 400 | application/json |
+| errors.UnauthorizedResponseError | 401 | application/json |
+| errors.NotFoundResponseError | 404 | application/json |
+| errors.InternalServerResponseError | 500 | application/json |
+| errors.OpenRouterDefaultError | 4XX, 5XX | \*/\* |
+
+## list_groups
+
+List SCIM groups for the organization. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+
+### Example Usage
+
+```python
+from openrouter import OpenRouter
+import os
+
+
+with OpenRouter(
+ http_referer="",
+ x_open_router_title="",
+ x_open_router_categories="",
+ api_key=os.getenv("OPENROUTER_API_KEY", ""),
+) as open_router:
+
+ res = open_router.scim.list_groups(offset=0, limit=50)
+
+ while res is not None:
+ # Handle items
+
+ res = res.next()
+
+```
+
+### Parameters
+
+| Parameter | Type | Required | Description | Example |
+| ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- |
+| `http_referer` | *Optional[str]* | :heavy_minus_sign: | The app identifier should be your app's URL and is used as the primary identifier for rankings.
This is used to track API usage per application.
| |
+| `x_open_router_title` | *Optional[str]* | :heavy_minus_sign: | The app display name allows you to customize how your app appears in OpenRouter's dashboard.
| |
+| `x_open_router_categories` | *Optional[str]* | :heavy_minus_sign: | Comma-separated list of app categories (e.g. "cli-agent,cloud-agent"). Used for marketplace rankings.
| |
+| `offset` | *OptionalNullable[int]* | :heavy_minus_sign: | Number of records to skip for pagination | 0 |
+| `limit` | *Optional[int]* | :heavy_minus_sign: | Maximum number of records to return (max 100) | 50 |
+| `retries` | [Optional[utils.RetryConfig]](../../models/utils/retryconfig.mdx) | :heavy_minus_sign: | Configuration to override the default retry behavior of the client. | |
+
+### Response
+
+**[operations.ListScimGroupsResponse](../../operations/listscimgroupsresponse.mdx)**
+
+### Errors
+
+| Error Type | Status Code | Content Type |
+| ---------------------------------- | ---------------------------------- | ---------------------------------- |
+| errors.UnauthorizedResponseError | 401 | application/json |
+| errors.NotFoundResponseError | 404 | application/json |
+| errors.InternalServerResponseError | 500 | application/json |
+| errors.OpenRouterDefaultError | 4XX, 5XX | \*/\* |
\ No newline at end of file
diff --git a/pyproject.toml b/pyproject.toml
index df1602a8..70475e92 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "openrouter"
-version = "1.1.19"
+version = "1.1.20"
description = "Official Python Client SDK for OpenRouter."
authors = [{ name = "OpenRouter" },]
readme = "README-PYPI.md"
diff --git a/src/openrouter/_version.py b/src/openrouter/_version.py
index 7eb9b4cf..473195b0 100644
--- a/src/openrouter/_version.py
+++ b/src/openrouter/_version.py
@@ -3,10 +3,10 @@
import importlib.metadata
__title__: str = "openrouter"
-__version__: str = "1.1.19"
+__version__: str = "1.1.20"
__openapi_doc_version__: str = "1.0.0"
__gen_version__: str = "2.914.0"
-__user_agent__: str = "speakeasy-sdk/python 1.1.19 2.914.0 1.0.0 openrouter"
+__user_agent__: str = "speakeasy-sdk/python 1.1.20 2.914.0 1.0.0 openrouter"
try:
if __package__ is not None:
diff --git a/src/openrouter/components/__init__.py b/src/openrouter/components/__init__.py
index 22427f8f..624a1748 100644
--- a/src/openrouter/components/__init__.py
+++ b/src/openrouter/components/__init__.py
@@ -811,6 +811,15 @@
CreatePresetFromInferenceResponse,
CreatePresetFromInferenceResponseTypedDict,
)
+ from .createscimgroupmappingrequest import (
+ CreateScimGroupMappingRequest,
+ CreateScimGroupMappingRequestRole,
+ CreateScimGroupMappingRequestTypedDict,
+ )
+ from .createscimgroupmappingresponse import (
+ CreateScimGroupMappingResponse,
+ CreateScimGroupMappingResponseTypedDict,
+ )
from .createworkspacerequest import (
CreateWorkspaceRequest,
CreateWorkspaceRequestTypedDict,
@@ -895,6 +904,10 @@
DeleteObservabilityDestinationResponse,
DeleteObservabilityDestinationResponseTypedDict,
)
+ from .deletescimgroupmappingresponse import (
+ DeleteScimGroupMappingResponse,
+ DeleteScimGroupMappingResponseTypedDict,
+ )
from .deleteworkspacebudgetresponse import (
DeleteWorkspaceBudgetResponse,
DeleteWorkspaceBudgetResponseTypedDict,
@@ -1164,6 +1177,10 @@
GetPresetVersionResponse,
GetPresetVersionResponseTypedDict,
)
+ from .getscimgroupmappingresponse import (
+ GetScimGroupMappingResponse,
+ GetScimGroupMappingResponseTypedDict,
+ )
from .getworkspaceresponse import (
GetWorkspaceResponse,
GetWorkspaceResponseTypedDict,
@@ -1431,6 +1448,14 @@
ListPresetVersionsResponse,
ListPresetVersionsResponseTypedDict,
)
+ from .listscimgroupmappingsresponse import (
+ ListScimGroupMappingsResponse,
+ ListScimGroupMappingsResponseTypedDict,
+ )
+ from .listscimgroupsresponse import (
+ ListScimGroupsResponse,
+ ListScimGroupsResponseTypedDict,
+ )
from .listworkspacebudgetsresponse import (
ListWorkspaceBudgetsResponse,
ListWorkspaceBudgetsResponseTypedDict,
@@ -2553,6 +2578,12 @@
from .routerattempt import RouterAttempt, RouterAttemptTypedDict
from .routerparams import RouterParams, RouterParamsTypedDict
from .routingstrategy import RoutingStrategy
+ from .scimgroup import ScimGroup, ScimGroupTypedDict
+ from .scimgroupmapping import (
+ ScimGroupMapping,
+ ScimGroupMappingRole,
+ ScimGroupMappingTypedDict,
+ )
from .searchcontextsizeenum import SearchContextSizeEnum
from .searchmodelsservertool_openrouter import (
SearchModelsServerToolOpenRouter,
@@ -2832,6 +2863,15 @@
UpdateObservabilityDestinationResponse,
UpdateObservabilityDestinationResponseTypedDict,
)
+ from .updatescimgroupmappingrequest import (
+ UpdateScimGroupMappingRequest,
+ UpdateScimGroupMappingRequestRole,
+ UpdateScimGroupMappingRequestTypedDict,
+ )
+ from .updatescimgroupmappingresponse import (
+ UpdateScimGroupMappingResponse,
+ UpdateScimGroupMappingResponseTypedDict,
+ )
from .updateworkspacerequest import (
UpdateWorkspaceRequest,
UpdateWorkspaceRequestTypedDict,
@@ -3548,6 +3588,11 @@
"CreateObservabilityDestinationResponseTypedDict",
"CreatePresetFromInferenceResponse",
"CreatePresetFromInferenceResponseTypedDict",
+ "CreateScimGroupMappingRequest",
+ "CreateScimGroupMappingRequestRole",
+ "CreateScimGroupMappingRequestTypedDict",
+ "CreateScimGroupMappingResponse",
+ "CreateScimGroupMappingResponseTypedDict",
"CreateWorkspaceRequest",
"CreateWorkspaceRequestTypedDict",
"CreateWorkspaceResponse",
@@ -3598,6 +3643,8 @@
"DeleteGuardrailResponseTypedDict",
"DeleteObservabilityDestinationResponse",
"DeleteObservabilityDestinationResponseTypedDict",
+ "DeleteScimGroupMappingResponse",
+ "DeleteScimGroupMappingResponseTypedDict",
"DeleteWorkspaceBudgetResponse",
"DeleteWorkspaceBudgetResponseTypedDict",
"DeleteWorkspaceResponse",
@@ -3799,6 +3846,8 @@
"GetPresetResponseTypedDict",
"GetPresetVersionResponse",
"GetPresetVersionResponseTypedDict",
+ "GetScimGroupMappingResponse",
+ "GetScimGroupMappingResponseTypedDict",
"GetWorkspaceResponse",
"GetWorkspaceResponseTypedDict",
"Guardrail",
@@ -4013,6 +4062,10 @@
"ListPresetVersionsResponseTypedDict",
"ListPresetsResponse",
"ListPresetsResponseTypedDict",
+ "ListScimGroupMappingsResponse",
+ "ListScimGroupMappingsResponseTypedDict",
+ "ListScimGroupsResponse",
+ "ListScimGroupsResponseTypedDict",
"ListWorkspaceBudgetsResponse",
"ListWorkspaceBudgetsResponseTypedDict",
"ListWorkspaceMembersResponse",
@@ -4759,6 +4812,11 @@
"STTUsageTypedDict",
"STTWord",
"STTWordTypedDict",
+ "ScimGroup",
+ "ScimGroupMapping",
+ "ScimGroupMappingRole",
+ "ScimGroupMappingTypedDict",
+ "ScimGroupTypedDict",
"SearchContextSizeEnum",
"SearchModelsServerToolConfig",
"SearchModelsServerToolConfigTypedDict",
@@ -5053,6 +5111,11 @@
"UpdateObservabilityDestinationRequestTypedDict",
"UpdateObservabilityDestinationResponse",
"UpdateObservabilityDestinationResponseTypedDict",
+ "UpdateScimGroupMappingRequest",
+ "UpdateScimGroupMappingRequestRole",
+ "UpdateScimGroupMappingRequestTypedDict",
+ "UpdateScimGroupMappingResponse",
+ "UpdateScimGroupMappingResponseTypedDict",
"UpdateWorkspaceRequest",
"UpdateWorkspaceRequestTypedDict",
"UpdateWorkspaceResponse",
@@ -5701,6 +5764,11 @@
"CreateObservabilityDestinationResponseTypedDict": ".createobservabilitydestinationresponse",
"CreatePresetFromInferenceResponse": ".createpresetfrominferenceresponse",
"CreatePresetFromInferenceResponseTypedDict": ".createpresetfrominferenceresponse",
+ "CreateScimGroupMappingRequest": ".createscimgroupmappingrequest",
+ "CreateScimGroupMappingRequestRole": ".createscimgroupmappingrequest",
+ "CreateScimGroupMappingRequestTypedDict": ".createscimgroupmappingrequest",
+ "CreateScimGroupMappingResponse": ".createscimgroupmappingresponse",
+ "CreateScimGroupMappingResponseTypedDict": ".createscimgroupmappingresponse",
"CreateWorkspaceRequest": ".createworkspacerequest",
"CreateWorkspaceRequestTypedDict": ".createworkspacerequest",
"CreateWorkspaceResponse": ".createworkspaceresponse",
@@ -5761,6 +5829,8 @@
"DeleteGuardrailResponseTypedDict": ".deleteguardrailresponse",
"DeleteObservabilityDestinationResponse": ".deleteobservabilitydestinationresponse",
"DeleteObservabilityDestinationResponseTypedDict": ".deleteobservabilitydestinationresponse",
+ "DeleteScimGroupMappingResponse": ".deletescimgroupmappingresponse",
+ "DeleteScimGroupMappingResponseTypedDict": ".deletescimgroupmappingresponse",
"DeleteWorkspaceBudgetResponse": ".deleteworkspacebudgetresponse",
"DeleteWorkspaceBudgetResponseTypedDict": ".deleteworkspacebudgetresponse",
"DeleteWorkspaceResponse": ".deleteworkspaceresponse",
@@ -5967,6 +6037,8 @@
"GetPresetResponseTypedDict": ".getpresetresponse",
"GetPresetVersionResponse": ".getpresetversionresponse",
"GetPresetVersionResponseTypedDict": ".getpresetversionresponse",
+ "GetScimGroupMappingResponse": ".getscimgroupmappingresponse",
+ "GetScimGroupMappingResponseTypedDict": ".getscimgroupmappingresponse",
"GetWorkspaceResponse": ".getworkspaceresponse",
"GetWorkspaceResponseTypedDict": ".getworkspaceresponse",
"Guardrail": ".guardrail",
@@ -6173,6 +6245,10 @@
"ListPresetsResponseTypedDict": ".listpresetsresponse",
"ListPresetVersionsResponse": ".listpresetversionsresponse",
"ListPresetVersionsResponseTypedDict": ".listpresetversionsresponse",
+ "ListScimGroupMappingsResponse": ".listscimgroupmappingsresponse",
+ "ListScimGroupMappingsResponseTypedDict": ".listscimgroupmappingsresponse",
+ "ListScimGroupsResponse": ".listscimgroupsresponse",
+ "ListScimGroupsResponseTypedDict": ".listscimgroupsresponse",
"ListWorkspaceBudgetsResponse": ".listworkspacebudgetsresponse",
"ListWorkspaceBudgetsResponseTypedDict": ".listworkspacebudgetsresponse",
"ListWorkspaceMembersResponse": ".listworkspacemembersresponse",
@@ -7042,6 +7118,11 @@
"RouterParams": ".routerparams",
"RouterParamsTypedDict": ".routerparams",
"RoutingStrategy": ".routingstrategy",
+ "ScimGroup": ".scimgroup",
+ "ScimGroupTypedDict": ".scimgroup",
+ "ScimGroupMapping": ".scimgroupmapping",
+ "ScimGroupMappingRole": ".scimgroupmapping",
+ "ScimGroupMappingTypedDict": ".scimgroupmapping",
"SearchContextSizeEnum": ".searchcontextsizeenum",
"SearchModelsServerToolOpenRouter": ".searchmodelsservertool_openrouter",
"SearchModelsServerToolOpenRouterType": ".searchmodelsservertool_openrouter",
@@ -7231,6 +7312,11 @@
"UpdateObservabilityDestinationRequestTypedDict": ".updateobservabilitydestinationrequest",
"UpdateObservabilityDestinationResponse": ".updateobservabilitydestinationresponse",
"UpdateObservabilityDestinationResponseTypedDict": ".updateobservabilitydestinationresponse",
+ "UpdateScimGroupMappingRequest": ".updatescimgroupmappingrequest",
+ "UpdateScimGroupMappingRequestRole": ".updatescimgroupmappingrequest",
+ "UpdateScimGroupMappingRequestTypedDict": ".updatescimgroupmappingrequest",
+ "UpdateScimGroupMappingResponse": ".updatescimgroupmappingresponse",
+ "UpdateScimGroupMappingResponseTypedDict": ".updatescimgroupmappingresponse",
"UpdateWorkspaceRequest": ".updateworkspacerequest",
"UpdateWorkspaceRequestTypedDict": ".updateworkspacerequest",
"UpdateWorkspaceResponse": ".updateworkspaceresponse",
diff --git a/src/openrouter/components/createscimgroupmappingrequest.py b/src/openrouter/components/createscimgroupmappingrequest.py
new file mode 100644
index 00000000..f451191b
--- /dev/null
+++ b/src/openrouter/components/createscimgroupmappingrequest.py
@@ -0,0 +1,29 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from openrouter.types import BaseModel, UnrecognizedStr
+from typing import Literal, Union
+from typing_extensions import TypedDict
+
+
+CreateScimGroupMappingRequestRole = Union[
+ Literal[
+ "admin",
+ "member",
+ ],
+ UnrecognizedStr,
+]
+
+
+class CreateScimGroupMappingRequestTypedDict(TypedDict):
+ role: CreateScimGroupMappingRequestRole
+ scim_group_id: str
+ workspace_id: str
+
+
+class CreateScimGroupMappingRequest(BaseModel):
+ role: CreateScimGroupMappingRequestRole
+
+ scim_group_id: str
+
+ workspace_id: str
diff --git a/src/openrouter/components/createscimgroupmappingresponse.py b/src/openrouter/components/createscimgroupmappingresponse.py
new file mode 100644
index 00000000..7fde9784
--- /dev/null
+++ b/src/openrouter/components/createscimgroupmappingresponse.py
@@ -0,0 +1,14 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from .scimgroupmapping import ScimGroupMapping, ScimGroupMappingTypedDict
+from openrouter.types import BaseModel
+from typing_extensions import TypedDict
+
+
+class CreateScimGroupMappingResponseTypedDict(TypedDict):
+ data: ScimGroupMappingTypedDict
+
+
+class CreateScimGroupMappingResponse(BaseModel):
+ data: ScimGroupMapping
diff --git a/src/openrouter/components/deletescimgroupmappingresponse.py b/src/openrouter/components/deletescimgroupmappingresponse.py
new file mode 100644
index 00000000..08a2289f
--- /dev/null
+++ b/src/openrouter/components/deletescimgroupmappingresponse.py
@@ -0,0 +1,26 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from openrouter.types import BaseModel
+from openrouter.utils import validate_const
+import pydantic
+from pydantic.functional_validators import AfterValidator
+from typing import Literal
+from typing_extensions import Annotated, TypedDict
+
+
+class DeleteScimGroupMappingResponseTypedDict(TypedDict):
+ deleted: Literal[True]
+
+
+class DeleteScimGroupMappingResponse(BaseModel):
+ DELETED: Annotated[
+ Annotated[Literal[True], AfterValidator(validate_const(True))],
+ pydantic.Field(alias="deleted"),
+ ] = True
+
+
+try:
+ DeleteScimGroupMappingResponse.model_rebuild()
+except NameError:
+ pass
diff --git a/src/openrouter/components/getscimgroupmappingresponse.py b/src/openrouter/components/getscimgroupmappingresponse.py
new file mode 100644
index 00000000..cfca9a05
--- /dev/null
+++ b/src/openrouter/components/getscimgroupmappingresponse.py
@@ -0,0 +1,14 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from .scimgroupmapping import ScimGroupMapping, ScimGroupMappingTypedDict
+from openrouter.types import BaseModel
+from typing_extensions import TypedDict
+
+
+class GetScimGroupMappingResponseTypedDict(TypedDict):
+ data: ScimGroupMappingTypedDict
+
+
+class GetScimGroupMappingResponse(BaseModel):
+ data: ScimGroupMapping
diff --git a/src/openrouter/components/listscimgroupmappingsresponse.py b/src/openrouter/components/listscimgroupmappingsresponse.py
new file mode 100644
index 00000000..546ec322
--- /dev/null
+++ b/src/openrouter/components/listscimgroupmappingsresponse.py
@@ -0,0 +1,18 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from .scimgroupmapping import ScimGroupMapping, ScimGroupMappingTypedDict
+from openrouter.types import BaseModel
+from typing import List
+from typing_extensions import TypedDict
+
+
+class ListScimGroupMappingsResponseTypedDict(TypedDict):
+ data: List[ScimGroupMappingTypedDict]
+ total_count: int
+
+
+class ListScimGroupMappingsResponse(BaseModel):
+ data: List[ScimGroupMapping]
+
+ total_count: int
diff --git a/src/openrouter/components/listscimgroupsresponse.py b/src/openrouter/components/listscimgroupsresponse.py
new file mode 100644
index 00000000..8eedc46a
--- /dev/null
+++ b/src/openrouter/components/listscimgroupsresponse.py
@@ -0,0 +1,18 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from .scimgroup import ScimGroup, ScimGroupTypedDict
+from openrouter.types import BaseModel
+from typing import List
+from typing_extensions import TypedDict
+
+
+class ListScimGroupsResponseTypedDict(TypedDict):
+ data: List[ScimGroupTypedDict]
+ total_count: int
+
+
+class ListScimGroupsResponse(BaseModel):
+ data: List[ScimGroup]
+
+ total_count: int
diff --git a/src/openrouter/components/scimgroup.py b/src/openrouter/components/scimgroup.py
new file mode 100644
index 00000000..4086c587
--- /dev/null
+++ b/src/openrouter/components/scimgroup.py
@@ -0,0 +1,43 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from openrouter.types import BaseModel, Nullable, UNSET_SENTINEL
+from pydantic import model_serializer
+from typing_extensions import TypedDict
+
+
+class ScimGroupTypedDict(TypedDict):
+ created_at: str
+ display_name: str
+ external_id: Nullable[str]
+ id: str
+ organization_id: str
+ updated_at: str
+
+
+class ScimGroup(BaseModel):
+ created_at: str
+
+ display_name: str
+
+ external_id: Nullable[str]
+
+ id: str
+
+ organization_id: str
+
+ updated_at: str
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+
+ if val != UNSET_SENTINEL:
+ m[k] = val
+
+ return m
diff --git a/src/openrouter/components/scimgroupmapping.py b/src/openrouter/components/scimgroupmapping.py
new file mode 100644
index 00000000..b2e0acc5
--- /dev/null
+++ b/src/openrouter/components/scimgroupmapping.py
@@ -0,0 +1,41 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from openrouter.types import BaseModel, UnrecognizedStr
+from typing import Literal, Union
+from typing_extensions import TypedDict
+
+
+ScimGroupMappingRole = Union[
+ Literal[
+ "admin",
+ "member",
+ ],
+ UnrecognizedStr,
+]
+
+
+class ScimGroupMappingTypedDict(TypedDict):
+ created_at: str
+ id: str
+ organization_id: str
+ role: ScimGroupMappingRole
+ scim_group_id: str
+ updated_at: str
+ workspace_id: str
+
+
+class ScimGroupMapping(BaseModel):
+ created_at: str
+
+ id: str
+
+ organization_id: str
+
+ role: ScimGroupMappingRole
+
+ scim_group_id: str
+
+ updated_at: str
+
+ workspace_id: str
diff --git a/src/openrouter/components/updatescimgroupmappingrequest.py b/src/openrouter/components/updatescimgroupmappingrequest.py
new file mode 100644
index 00000000..a95a4e18
--- /dev/null
+++ b/src/openrouter/components/updatescimgroupmappingrequest.py
@@ -0,0 +1,23 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from openrouter.types import BaseModel, UnrecognizedStr
+from typing import Literal, Union
+from typing_extensions import TypedDict
+
+
+UpdateScimGroupMappingRequestRole = Union[
+ Literal[
+ "admin",
+ "member",
+ ],
+ UnrecognizedStr,
+]
+
+
+class UpdateScimGroupMappingRequestTypedDict(TypedDict):
+ role: UpdateScimGroupMappingRequestRole
+
+
+class UpdateScimGroupMappingRequest(BaseModel):
+ role: UpdateScimGroupMappingRequestRole
diff --git a/src/openrouter/components/updatescimgroupmappingresponse.py b/src/openrouter/components/updatescimgroupmappingresponse.py
new file mode 100644
index 00000000..2f110211
--- /dev/null
+++ b/src/openrouter/components/updatescimgroupmappingresponse.py
@@ -0,0 +1,14 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from .scimgroupmapping import ScimGroupMapping, ScimGroupMappingTypedDict
+from openrouter.types import BaseModel
+from typing_extensions import TypedDict
+
+
+class UpdateScimGroupMappingResponseTypedDict(TypedDict):
+ data: ScimGroupMappingTypedDict
+
+
+class UpdateScimGroupMappingResponse(BaseModel):
+ data: ScimGroupMapping
diff --git a/src/openrouter/operations/__init__.py b/src/openrouter/operations/__init__.py
index 1044a7cf..71aa5c14 100644
--- a/src/openrouter/operations/__init__.py
+++ b/src/openrouter/operations/__init__.py
@@ -203,6 +203,12 @@
CreateResponsesResponse,
CreateResponsesResponseTypedDict,
)
+ from .createscimgroupmapping import (
+ CreateScimGroupMappingGlobals,
+ CreateScimGroupMappingGlobalsTypedDict,
+ CreateScimGroupMappingRequest,
+ CreateScimGroupMappingRequestTypedDict,
+ )
from .createvideos import (
CreateVideosGlobals,
CreateVideosGlobalsTypedDict,
@@ -247,6 +253,15 @@
DeleteObservabilityDestinationRequest,
DeleteObservabilityDestinationRequestTypedDict,
)
+ from .deletescimgroupmapping import (
+ DeleteScimGroupMappingGlobals,
+ DeleteScimGroupMappingGlobalsTypedDict,
+ DeleteScimGroupMappingRequest,
+ DeleteScimGroupMappingRequestTypedDict,
+ KeepMembers,
+ KeepMembersEnum,
+ KeepMembersTypedDict,
+ )
from .deleteworkspace import (
DeleteWorkspaceGlobals,
DeleteWorkspaceGlobalsTypedDict,
@@ -422,6 +437,12 @@
Modality,
Period,
)
+ from .getscimgroupmapping import (
+ GetScimGroupMappingGlobals,
+ GetScimGroupMappingGlobalsTypedDict,
+ GetScimGroupMappingRequest,
+ GetScimGroupMappingRequestTypedDict,
+ )
from .gettaskclassifications import (
GetTaskClassificationsGlobals,
GetTaskClassificationsGlobalsTypedDict,
@@ -622,6 +643,22 @@
ListProvidersResponse,
ListProvidersResponseTypedDict,
)
+ from .listscimgroupmappings import (
+ ListScimGroupMappingsGlobals,
+ ListScimGroupMappingsGlobalsTypedDict,
+ ListScimGroupMappingsRequest,
+ ListScimGroupMappingsRequestTypedDict,
+ ListScimGroupMappingsResponse,
+ ListScimGroupMappingsResponseTypedDict,
+ )
+ from .listscimgroups import (
+ ListScimGroupsGlobals,
+ ListScimGroupsGlobalsTypedDict,
+ ListScimGroupsRequest,
+ ListScimGroupsRequestTypedDict,
+ ListScimGroupsResponse,
+ ListScimGroupsResponseTypedDict,
+ )
from .listvideoscontent import (
ListVideosContentGlobals,
ListVideosContentGlobalsTypedDict,
@@ -738,6 +775,12 @@
UpdateObservabilityDestinationRequest,
UpdateObservabilityDestinationRequestTypedDict,
)
+ from .updatescimgroupmapping import (
+ UpdateScimGroupMappingGlobals,
+ UpdateScimGroupMappingGlobalsTypedDict,
+ UpdateScimGroupMappingRequest,
+ UpdateScimGroupMappingRequestTypedDict,
+ )
from .updateworkspace import (
UpdateWorkspaceGlobals,
UpdateWorkspaceGlobalsTypedDict,
@@ -902,6 +945,10 @@
"CreateResponsesRequestTypedDict",
"CreateResponsesResponse",
"CreateResponsesResponseTypedDict",
+ "CreateScimGroupMappingGlobals",
+ "CreateScimGroupMappingGlobalsTypedDict",
+ "CreateScimGroupMappingRequest",
+ "CreateScimGroupMappingRequestTypedDict",
"CreateVideosGlobals",
"CreateVideosGlobalsTypedDict",
"CreateVideosRequest",
@@ -933,6 +980,10 @@
"DeleteObservabilityDestinationGlobalsTypedDict",
"DeleteObservabilityDestinationRequest",
"DeleteObservabilityDestinationRequestTypedDict",
+ "DeleteScimGroupMappingGlobals",
+ "DeleteScimGroupMappingGlobalsTypedDict",
+ "DeleteScimGroupMappingRequest",
+ "DeleteScimGroupMappingRequestTypedDict",
"DeleteWorkspaceBudgetGlobals",
"DeleteWorkspaceBudgetGlobalsTypedDict",
"DeleteWorkspaceBudgetRequest",
@@ -1059,6 +1110,10 @@
"GetRankingsDailyGlobalsTypedDict",
"GetRankingsDailyRequest",
"GetRankingsDailyRequestTypedDict",
+ "GetScimGroupMappingGlobals",
+ "GetScimGroupMappingGlobalsTypedDict",
+ "GetScimGroupMappingRequest",
+ "GetScimGroupMappingRequestTypedDict",
"GetTaskClassificationsGlobals",
"GetTaskClassificationsGlobalsTypedDict",
"GetTaskClassificationsRequest",
@@ -1085,6 +1140,9 @@
"InputTypedDict",
"InputUnion",
"InputUnionTypedDict",
+ "KeepMembers",
+ "KeepMembersEnum",
+ "KeepMembersTypedDict",
"LanguageType",
"ListBYOKKeysGlobals",
"ListBYOKKeysGlobalsTypedDict",
@@ -1214,6 +1272,18 @@
"ListRequestTypedDict",
"ListResponse",
"ListResponseTypedDict",
+ "ListScimGroupMappingsGlobals",
+ "ListScimGroupMappingsGlobalsTypedDict",
+ "ListScimGroupMappingsRequest",
+ "ListScimGroupMappingsRequestTypedDict",
+ "ListScimGroupMappingsResponse",
+ "ListScimGroupMappingsResponseTypedDict",
+ "ListScimGroupsGlobals",
+ "ListScimGroupsGlobalsTypedDict",
+ "ListScimGroupsRequest",
+ "ListScimGroupsRequestTypedDict",
+ "ListScimGroupsResponse",
+ "ListScimGroupsResponseTypedDict",
"ListVideosContentGlobals",
"ListVideosContentGlobalsTypedDict",
"ListVideosContentRequest",
@@ -1315,6 +1385,10 @@
"UpdateObservabilityDestinationGlobalsTypedDict",
"UpdateObservabilityDestinationRequest",
"UpdateObservabilityDestinationRequestTypedDict",
+ "UpdateScimGroupMappingGlobals",
+ "UpdateScimGroupMappingGlobalsTypedDict",
+ "UpdateScimGroupMappingRequest",
+ "UpdateScimGroupMappingRequestTypedDict",
"UpdateWorkspaceGlobals",
"UpdateWorkspaceGlobalsTypedDict",
"UpdateWorkspaceRequest",
@@ -1500,6 +1574,10 @@
"CreateResponsesRequestTypedDict": ".createresponses",
"CreateResponsesResponse": ".createresponses",
"CreateResponsesResponseTypedDict": ".createresponses",
+ "CreateScimGroupMappingGlobals": ".createscimgroupmapping",
+ "CreateScimGroupMappingGlobalsTypedDict": ".createscimgroupmapping",
+ "CreateScimGroupMappingRequest": ".createscimgroupmapping",
+ "CreateScimGroupMappingRequestTypedDict": ".createscimgroupmapping",
"CreateVideosGlobals": ".createvideos",
"CreateVideosGlobalsTypedDict": ".createvideos",
"CreateVideosRequest": ".createvideos",
@@ -1530,6 +1608,13 @@
"DeleteObservabilityDestinationGlobalsTypedDict": ".deleteobservabilitydestination",
"DeleteObservabilityDestinationRequest": ".deleteobservabilitydestination",
"DeleteObservabilityDestinationRequestTypedDict": ".deleteobservabilitydestination",
+ "DeleteScimGroupMappingGlobals": ".deletescimgroupmapping",
+ "DeleteScimGroupMappingGlobalsTypedDict": ".deletescimgroupmapping",
+ "DeleteScimGroupMappingRequest": ".deletescimgroupmapping",
+ "DeleteScimGroupMappingRequestTypedDict": ".deletescimgroupmapping",
+ "KeepMembers": ".deletescimgroupmapping",
+ "KeepMembersEnum": ".deletescimgroupmapping",
+ "KeepMembersTypedDict": ".deletescimgroupmapping",
"DeleteWorkspaceGlobals": ".deleteworkspace",
"DeleteWorkspaceGlobalsTypedDict": ".deleteworkspace",
"DeleteWorkspaceRequest": ".deleteworkspace",
@@ -1665,6 +1750,10 @@
"LanguageType": ".getrankingsdaily",
"Modality": ".getrankingsdaily",
"Period": ".getrankingsdaily",
+ "GetScimGroupMappingGlobals": ".getscimgroupmapping",
+ "GetScimGroupMappingGlobalsTypedDict": ".getscimgroupmapping",
+ "GetScimGroupMappingRequest": ".getscimgroupmapping",
+ "GetScimGroupMappingRequestTypedDict": ".getscimgroupmapping",
"GetTaskClassificationsGlobals": ".gettaskclassifications",
"GetTaskClassificationsGlobalsTypedDict": ".gettaskclassifications",
"GetTaskClassificationsRequest": ".gettaskclassifications",
@@ -1815,6 +1904,18 @@
"ListProvidersRequestTypedDict": ".listproviders",
"ListProvidersResponse": ".listproviders",
"ListProvidersResponseTypedDict": ".listproviders",
+ "ListScimGroupMappingsGlobals": ".listscimgroupmappings",
+ "ListScimGroupMappingsGlobalsTypedDict": ".listscimgroupmappings",
+ "ListScimGroupMappingsRequest": ".listscimgroupmappings",
+ "ListScimGroupMappingsRequestTypedDict": ".listscimgroupmappings",
+ "ListScimGroupMappingsResponse": ".listscimgroupmappings",
+ "ListScimGroupMappingsResponseTypedDict": ".listscimgroupmappings",
+ "ListScimGroupsGlobals": ".listscimgroups",
+ "ListScimGroupsGlobalsTypedDict": ".listscimgroups",
+ "ListScimGroupsRequest": ".listscimgroups",
+ "ListScimGroupsRequestTypedDict": ".listscimgroups",
+ "ListScimGroupsResponse": ".listscimgroups",
+ "ListScimGroupsResponseTypedDict": ".listscimgroups",
"ListVideosContentGlobals": ".listvideoscontent",
"ListVideosContentGlobalsTypedDict": ".listvideoscontent",
"ListVideosContentRequest": ".listvideoscontent",
@@ -1907,6 +2008,10 @@
"UpdateObservabilityDestinationGlobalsTypedDict": ".updateobservabilitydestination",
"UpdateObservabilityDestinationRequest": ".updateobservabilitydestination",
"UpdateObservabilityDestinationRequestTypedDict": ".updateobservabilitydestination",
+ "UpdateScimGroupMappingGlobals": ".updatescimgroupmapping",
+ "UpdateScimGroupMappingGlobalsTypedDict": ".updatescimgroupmapping",
+ "UpdateScimGroupMappingRequest": ".updatescimgroupmapping",
+ "UpdateScimGroupMappingRequestTypedDict": ".updatescimgroupmapping",
"UpdateWorkspaceGlobals": ".updateworkspace",
"UpdateWorkspaceGlobalsTypedDict": ".updateworkspace",
"UpdateWorkspaceRequest": ".updateworkspace",
diff --git a/src/openrouter/operations/createscimgroupmapping.py b/src/openrouter/operations/createscimgroupmapping.py
new file mode 100644
index 00000000..5e9dc6fb
--- /dev/null
+++ b/src/openrouter/operations/createscimgroupmapping.py
@@ -0,0 +1,148 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from openrouter.components import (
+ createscimgroupmappingrequest as components_createscimgroupmappingrequest,
+)
+from openrouter.types import BaseModel, UNSET_SENTINEL
+from openrouter.utils import FieldMetadata, HeaderMetadata, RequestMetadata
+import pydantic
+from pydantic import model_serializer
+from typing import Optional
+from typing_extensions import Annotated, NotRequired, TypedDict
+
+
+class CreateScimGroupMappingGlobalsTypedDict(TypedDict):
+ http_referer: NotRequired[str]
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+ x_open_router_title: NotRequired[str]
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+ x_open_router_categories: NotRequired[str]
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+
+
+class CreateScimGroupMappingGlobals(BaseModel):
+ http_referer: Annotated[
+ Optional[str],
+ pydantic.Field(alias="HTTP-Referer"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+
+ x_open_router_title: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Title"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+
+ x_open_router_categories: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Categories"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(
+ ["HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories"]
+ )
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+
+ if val != UNSET_SENTINEL:
+ if val is not None or k not in optional_fields:
+ m[k] = val
+
+ return m
+
+
+class CreateScimGroupMappingRequestTypedDict(TypedDict):
+ create_scim_group_mapping_request: (
+ components_createscimgroupmappingrequest.CreateScimGroupMappingRequestTypedDict
+ )
+ http_referer: NotRequired[str]
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+ x_open_router_title: NotRequired[str]
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+ x_open_router_categories: NotRequired[str]
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+
+
+class CreateScimGroupMappingRequest(BaseModel):
+ create_scim_group_mapping_request: Annotated[
+ components_createscimgroupmappingrequest.CreateScimGroupMappingRequest,
+ FieldMetadata(request=RequestMetadata(media_type="application/json")),
+ ]
+
+ http_referer: Annotated[
+ Optional[str],
+ pydantic.Field(alias="HTTP-Referer"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+
+ x_open_router_title: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Title"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+
+ x_open_router_categories: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Categories"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(
+ ["HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories"]
+ )
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+
+ if val != UNSET_SENTINEL:
+ if val is not None or k not in optional_fields:
+ m[k] = val
+
+ return m
diff --git a/src/openrouter/operations/deletescimgroupmapping.py b/src/openrouter/operations/deletescimgroupmapping.py
new file mode 100644
index 00000000..fec5503f
--- /dev/null
+++ b/src/openrouter/operations/deletescimgroupmapping.py
@@ -0,0 +1,173 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from openrouter.types import BaseModel, UNSET_SENTINEL, UnrecognizedStr
+from openrouter.utils import (
+ FieldMetadata,
+ HeaderMetadata,
+ PathParamMetadata,
+ QueryParamMetadata,
+)
+import pydantic
+from pydantic import model_serializer
+from typing import Literal, Optional, Union
+from typing_extensions import Annotated, NotRequired, TypeAliasType, TypedDict
+
+
+class DeleteScimGroupMappingGlobalsTypedDict(TypedDict):
+ http_referer: NotRequired[str]
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+ x_open_router_title: NotRequired[str]
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+ x_open_router_categories: NotRequired[str]
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+
+
+class DeleteScimGroupMappingGlobals(BaseModel):
+ http_referer: Annotated[
+ Optional[str],
+ pydantic.Field(alias="HTTP-Referer"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+
+ x_open_router_title: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Title"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+
+ x_open_router_categories: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Categories"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(
+ ["HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories"]
+ )
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+
+ if val != UNSET_SENTINEL:
+ if val is not None or k not in optional_fields:
+ m[k] = val
+
+ return m
+
+
+KeepMembersEnum = Union[
+ Literal[
+ "true",
+ "false",
+ ],
+ UnrecognizedStr,
+]
+
+
+KeepMembersTypedDict = TypeAliasType(
+ "KeepMembersTypedDict", Union[KeepMembersEnum, bool]
+)
+r"""Required. Whether to keep workspace members after deleting the mapping. `false` **removes** the members this mapping granted access to; `true` deletes the mapping while leaving membership intact as manually-managed. There is deliberately no default — omitting it returns `400` so the destructive path cannot be reached by accident. Mirrors the dashboard, whose `DeleteMappingSchema.keepMembers` is likewise required."""
+
+
+KeepMembers = TypeAliasType("KeepMembers", Union[KeepMembersEnum, bool])
+r"""Required. Whether to keep workspace members after deleting the mapping. `false` **removes** the members this mapping granted access to; `true` deletes the mapping while leaving membership intact as manually-managed. There is deliberately no default — omitting it returns `400` so the destructive path cannot be reached by accident. Mirrors the dashboard, whose `DeleteMappingSchema.keepMembers` is likewise required."""
+
+
+class DeleteScimGroupMappingRequestTypedDict(TypedDict):
+ id: str
+ keep_members: KeepMembersTypedDict
+ r"""Required. Whether to keep workspace members after deleting the mapping. `false` **removes** the members this mapping granted access to; `true` deletes the mapping while leaving membership intact as manually-managed. There is deliberately no default — omitting it returns `400` so the destructive path cannot be reached by accident. Mirrors the dashboard, whose `DeleteMappingSchema.keepMembers` is likewise required."""
+ http_referer: NotRequired[str]
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+ x_open_router_title: NotRequired[str]
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+ x_open_router_categories: NotRequired[str]
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+
+
+class DeleteScimGroupMappingRequest(BaseModel):
+ id: Annotated[
+ str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False))
+ ]
+
+ keep_members: Annotated[
+ KeepMembers, FieldMetadata(query=QueryParamMetadata(style="form", explode=True))
+ ]
+ r"""Required. Whether to keep workspace members after deleting the mapping. `false` **removes** the members this mapping granted access to; `true` deletes the mapping while leaving membership intact as manually-managed. There is deliberately no default — omitting it returns `400` so the destructive path cannot be reached by accident. Mirrors the dashboard, whose `DeleteMappingSchema.keepMembers` is likewise required."""
+
+ http_referer: Annotated[
+ Optional[str],
+ pydantic.Field(alias="HTTP-Referer"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+
+ x_open_router_title: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Title"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+
+ x_open_router_categories: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Categories"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(
+ ["HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories"]
+ )
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+
+ if val != UNSET_SENTINEL:
+ if val is not None or k not in optional_fields:
+ m[k] = val
+
+ return m
diff --git a/src/openrouter/operations/getscimgroupmapping.py b/src/openrouter/operations/getscimgroupmapping.py
new file mode 100644
index 00000000..d930ef5a
--- /dev/null
+++ b/src/openrouter/operations/getscimgroupmapping.py
@@ -0,0 +1,142 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from openrouter.types import BaseModel, UNSET_SENTINEL
+from openrouter.utils import FieldMetadata, HeaderMetadata, PathParamMetadata
+import pydantic
+from pydantic import model_serializer
+from typing import Optional
+from typing_extensions import Annotated, NotRequired, TypedDict
+
+
+class GetScimGroupMappingGlobalsTypedDict(TypedDict):
+ http_referer: NotRequired[str]
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+ x_open_router_title: NotRequired[str]
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+ x_open_router_categories: NotRequired[str]
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+
+
+class GetScimGroupMappingGlobals(BaseModel):
+ http_referer: Annotated[
+ Optional[str],
+ pydantic.Field(alias="HTTP-Referer"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+
+ x_open_router_title: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Title"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+
+ x_open_router_categories: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Categories"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(
+ ["HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories"]
+ )
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+
+ if val != UNSET_SENTINEL:
+ if val is not None or k not in optional_fields:
+ m[k] = val
+
+ return m
+
+
+class GetScimGroupMappingRequestTypedDict(TypedDict):
+ id: str
+ http_referer: NotRequired[str]
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+ x_open_router_title: NotRequired[str]
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+ x_open_router_categories: NotRequired[str]
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+
+
+class GetScimGroupMappingRequest(BaseModel):
+ id: Annotated[
+ str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False))
+ ]
+
+ http_referer: Annotated[
+ Optional[str],
+ pydantic.Field(alias="HTTP-Referer"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+
+ x_open_router_title: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Title"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+
+ x_open_router_categories: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Categories"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(
+ ["HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories"]
+ )
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+
+ if val != UNSET_SENTINEL:
+ if val is not None or k not in optional_fields:
+ m[k] = val
+
+ return m
diff --git a/src/openrouter/operations/listscimgroupmappings.py b/src/openrouter/operations/listscimgroupmappings.py
new file mode 100644
index 00000000..a913e277
--- /dev/null
+++ b/src/openrouter/operations/listscimgroupmappings.py
@@ -0,0 +1,186 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from openrouter.components import (
+ listscimgroupmappingsresponse as components_listscimgroupmappingsresponse,
+)
+from openrouter.types import BaseModel, Nullable, OptionalNullable, UNSET_SENTINEL
+from openrouter.utils import FieldMetadata, HeaderMetadata, QueryParamMetadata
+import pydantic
+from pydantic import model_serializer
+from typing import Awaitable, Callable, Optional, Union
+from typing_extensions import Annotated, NotRequired, TypedDict
+
+
+class ListScimGroupMappingsGlobalsTypedDict(TypedDict):
+ http_referer: NotRequired[str]
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+ x_open_router_title: NotRequired[str]
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+ x_open_router_categories: NotRequired[str]
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+
+
+class ListScimGroupMappingsGlobals(BaseModel):
+ http_referer: Annotated[
+ Optional[str],
+ pydantic.Field(alias="HTTP-Referer"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+
+ x_open_router_title: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Title"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+
+ x_open_router_categories: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Categories"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(
+ ["HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories"]
+ )
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+
+ if val != UNSET_SENTINEL:
+ if val is not None or k not in optional_fields:
+ m[k] = val
+
+ return m
+
+
+class ListScimGroupMappingsRequestTypedDict(TypedDict):
+ http_referer: NotRequired[str]
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+ x_open_router_title: NotRequired[str]
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+ x_open_router_categories: NotRequired[str]
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+ offset: NotRequired[Nullable[int]]
+ r"""Number of records to skip for pagination"""
+ limit: NotRequired[int]
+ r"""Maximum number of records to return (max 100)"""
+
+
+class ListScimGroupMappingsRequest(BaseModel):
+ http_referer: Annotated[
+ Optional[str],
+ pydantic.Field(alias="HTTP-Referer"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+
+ x_open_router_title: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Title"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+
+ x_open_router_categories: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Categories"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+
+ offset: Annotated[
+ OptionalNullable[int],
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
+ ] = 0
+ r"""Number of records to skip for pagination"""
+
+ limit: Annotated[
+ Optional[int],
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
+ ] = 50
+ r"""Maximum number of records to return (max 100)"""
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(
+ [
+ "HTTP-Referer",
+ "X-OpenRouter-Title",
+ "X-OpenRouter-Categories",
+ "offset",
+ "limit",
+ ]
+ )
+ nullable_fields = set(["offset"])
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+ is_nullable_and_explicitly_set = (
+ k in nullable_fields
+ and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
+ )
+
+ if val != UNSET_SENTINEL:
+ if (
+ val is not None
+ or k not in optional_fields
+ or is_nullable_and_explicitly_set
+ ):
+ m[k] = val
+
+ return m
+
+
+class ListScimGroupMappingsResponseTypedDict(TypedDict):
+ result: (
+ components_listscimgroupmappingsresponse.ListScimGroupMappingsResponseTypedDict
+ )
+
+
+class ListScimGroupMappingsResponse(BaseModel):
+ next: Union[
+ Callable[[], Optional[ListScimGroupMappingsResponse]],
+ Callable[[], Awaitable[Optional[ListScimGroupMappingsResponse]]],
+ ]
+
+ result: components_listscimgroupmappingsresponse.ListScimGroupMappingsResponse
diff --git a/src/openrouter/operations/listscimgroups.py b/src/openrouter/operations/listscimgroups.py
new file mode 100644
index 00000000..8d3d678a
--- /dev/null
+++ b/src/openrouter/operations/listscimgroups.py
@@ -0,0 +1,184 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from openrouter.components import (
+ listscimgroupsresponse as components_listscimgroupsresponse,
+)
+from openrouter.types import BaseModel, Nullable, OptionalNullable, UNSET_SENTINEL
+from openrouter.utils import FieldMetadata, HeaderMetadata, QueryParamMetadata
+import pydantic
+from pydantic import model_serializer
+from typing import Awaitable, Callable, Optional, Union
+from typing_extensions import Annotated, NotRequired, TypedDict
+
+
+class ListScimGroupsGlobalsTypedDict(TypedDict):
+ http_referer: NotRequired[str]
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+ x_open_router_title: NotRequired[str]
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+ x_open_router_categories: NotRequired[str]
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+
+
+class ListScimGroupsGlobals(BaseModel):
+ http_referer: Annotated[
+ Optional[str],
+ pydantic.Field(alias="HTTP-Referer"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+
+ x_open_router_title: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Title"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+
+ x_open_router_categories: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Categories"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(
+ ["HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories"]
+ )
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+
+ if val != UNSET_SENTINEL:
+ if val is not None or k not in optional_fields:
+ m[k] = val
+
+ return m
+
+
+class ListScimGroupsRequestTypedDict(TypedDict):
+ http_referer: NotRequired[str]
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+ x_open_router_title: NotRequired[str]
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+ x_open_router_categories: NotRequired[str]
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+ offset: NotRequired[Nullable[int]]
+ r"""Number of records to skip for pagination"""
+ limit: NotRequired[int]
+ r"""Maximum number of records to return (max 100)"""
+
+
+class ListScimGroupsRequest(BaseModel):
+ http_referer: Annotated[
+ Optional[str],
+ pydantic.Field(alias="HTTP-Referer"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+
+ x_open_router_title: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Title"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+
+ x_open_router_categories: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Categories"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+
+ offset: Annotated[
+ OptionalNullable[int],
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
+ ] = 0
+ r"""Number of records to skip for pagination"""
+
+ limit: Annotated[
+ Optional[int],
+ FieldMetadata(query=QueryParamMetadata(style="form", explode=True)),
+ ] = 50
+ r"""Maximum number of records to return (max 100)"""
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(
+ [
+ "HTTP-Referer",
+ "X-OpenRouter-Title",
+ "X-OpenRouter-Categories",
+ "offset",
+ "limit",
+ ]
+ )
+ nullable_fields = set(["offset"])
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+ is_nullable_and_explicitly_set = (
+ k in nullable_fields
+ and (self.__pydantic_fields_set__.intersection({n})) # pylint: disable=no-member
+ )
+
+ if val != UNSET_SENTINEL:
+ if (
+ val is not None
+ or k not in optional_fields
+ or is_nullable_and_explicitly_set
+ ):
+ m[k] = val
+
+ return m
+
+
+class ListScimGroupsResponseTypedDict(TypedDict):
+ result: components_listscimgroupsresponse.ListScimGroupsResponseTypedDict
+
+
+class ListScimGroupsResponse(BaseModel):
+ next: Union[
+ Callable[[], Optional[ListScimGroupsResponse]],
+ Callable[[], Awaitable[Optional[ListScimGroupsResponse]]],
+ ]
+
+ result: components_listscimgroupsresponse.ListScimGroupsResponse
diff --git a/src/openrouter/operations/updatescimgroupmapping.py b/src/openrouter/operations/updatescimgroupmapping.py
new file mode 100644
index 00000000..2cceda1e
--- /dev/null
+++ b/src/openrouter/operations/updatescimgroupmapping.py
@@ -0,0 +1,158 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from __future__ import annotations
+from openrouter.components import (
+ updatescimgroupmappingrequest as components_updatescimgroupmappingrequest,
+)
+from openrouter.types import BaseModel, UNSET_SENTINEL
+from openrouter.utils import (
+ FieldMetadata,
+ HeaderMetadata,
+ PathParamMetadata,
+ RequestMetadata,
+)
+import pydantic
+from pydantic import model_serializer
+from typing import Optional
+from typing_extensions import Annotated, NotRequired, TypedDict
+
+
+class UpdateScimGroupMappingGlobalsTypedDict(TypedDict):
+ http_referer: NotRequired[str]
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+ x_open_router_title: NotRequired[str]
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+ x_open_router_categories: NotRequired[str]
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+
+
+class UpdateScimGroupMappingGlobals(BaseModel):
+ http_referer: Annotated[
+ Optional[str],
+ pydantic.Field(alias="HTTP-Referer"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+
+ x_open_router_title: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Title"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+
+ x_open_router_categories: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Categories"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(
+ ["HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories"]
+ )
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+
+ if val != UNSET_SENTINEL:
+ if val is not None or k not in optional_fields:
+ m[k] = val
+
+ return m
+
+
+class UpdateScimGroupMappingRequestTypedDict(TypedDict):
+ id: str
+ update_scim_group_mapping_request: (
+ components_updatescimgroupmappingrequest.UpdateScimGroupMappingRequestTypedDict
+ )
+ http_referer: NotRequired[str]
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+ x_open_router_title: NotRequired[str]
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+ x_open_router_categories: NotRequired[str]
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+
+
+class UpdateScimGroupMappingRequest(BaseModel):
+ id: Annotated[
+ str, FieldMetadata(path=PathParamMetadata(style="simple", explode=False))
+ ]
+
+ update_scim_group_mapping_request: Annotated[
+ components_updatescimgroupmappingrequest.UpdateScimGroupMappingRequest,
+ FieldMetadata(request=RequestMetadata(media_type="application/json")),
+ ]
+
+ http_referer: Annotated[
+ Optional[str],
+ pydantic.Field(alias="HTTP-Referer"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ """
+
+ x_open_router_title: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Title"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ """
+
+ x_open_router_categories: Annotated[
+ Optional[str],
+ pydantic.Field(alias="X-OpenRouter-Categories"),
+ FieldMetadata(header=HeaderMetadata(style="simple", explode=False)),
+ ] = None
+ r"""Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ """
+
+ @model_serializer(mode="wrap")
+ def serialize_model(self, handler):
+ optional_fields = set(
+ ["HTTP-Referer", "X-OpenRouter-Title", "X-OpenRouter-Categories"]
+ )
+ serialized = handler(self)
+ m = {}
+
+ for n, f in type(self).model_fields.items():
+ k = f.alias or n
+ val = serialized.get(k, serialized.get(n))
+
+ if val != UNSET_SENTINEL:
+ if val is not None or k not in optional_fields:
+ m[k] = val
+
+ return m
diff --git a/src/openrouter/scim.py b/src/openrouter/scim.py
new file mode 100644
index 00000000..f6ad93a8
--- /dev/null
+++ b/src/openrouter/scim.py
@@ -0,0 +1,1814 @@
+"""Code generated by Speakeasy (https://speakeasy.com). DO NOT EDIT."""
+
+from .basesdk import BaseSDK
+from jsonpath import JSONPath
+from openrouter import components, errors, operations, utils
+from openrouter._hooks import HookContext
+from openrouter.types import OptionalNullable, UNSET
+from openrouter.utils import get_security_from_env
+from openrouter.utils.unmarshal_json_response import unmarshal_json_response
+from typing import Any, Awaitable, Dict, List, Mapping, Optional, Union
+
+
+class Scim(BaseSDK):
+ r"""SCIM endpoints"""
+
+ def list_mappings(
+ self,
+ *,
+ http_referer: Optional[str] = None,
+ x_open_router_title: Optional[str] = None,
+ x_open_router_categories: Optional[str] = None,
+ offset: OptionalNullable[int] = 0,
+ limit: Optional[int] = 50,
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
+ server_url: Optional[str] = None,
+ timeout_ms: Optional[int] = None,
+ http_headers: Optional[Mapping[str, str]] = None,
+ ) -> Optional[operations.ListScimGroupMappingsResponse]:
+ r"""List SCIM group mappings
+
+ List SCIM group-to-workspace mappings for the organization. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+
+ :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ :param offset: Number of records to skip for pagination
+ :param limit: Maximum number of records to return (max 100)
+ :param retries: Override the default retry configuration for this method
+ :param server_url: Override the default server URL for this method
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
+ :param http_headers: Additional headers to set or replace on requests.
+ """
+ base_url = None
+ url_variables = None
+ if timeout_ms is None:
+ timeout_ms = self.sdk_configuration.timeout_ms
+
+ if server_url is not None:
+ base_url = server_url
+ else:
+ base_url = self._get_url(base_url, url_variables)
+
+ request = operations.ListScimGroupMappingsRequest(
+ http_referer=http_referer,
+ x_open_router_title=x_open_router_title,
+ x_open_router_categories=x_open_router_categories,
+ offset=offset,
+ limit=limit,
+ )
+
+ req = self._build_request(
+ method="GET",
+ path="/scim/group-mappings",
+ base_url=base_url,
+ url_variables=url_variables,
+ request=request,
+ request_body_required=False,
+ request_has_path_params=False,
+ request_has_query_params=True,
+ user_agent_header="user-agent",
+ accept_header_value="application/json",
+ http_headers=http_headers,
+ _globals=operations.ListScimGroupMappingsGlobals(
+ http_referer=self.sdk_configuration.globals.http_referer,
+ x_open_router_title=self.sdk_configuration.globals.x_open_router_title,
+ x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories,
+ ),
+ security=self.sdk_configuration.security,
+ allow_empty_value=None,
+ timeout_ms=timeout_ms,
+ )
+
+ if retries == UNSET:
+ if self.sdk_configuration.retry_config is not UNSET:
+ retries = self.sdk_configuration.retry_config
+ else:
+ retries = utils.RetryConfig(
+ "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True
+ )
+
+ retry_config = None
+ if isinstance(retries, utils.RetryConfig):
+ retry_config = (retries, ["5XX"])
+
+ http_res = self.do_request(
+ hook_ctx=HookContext(
+ config=self.sdk_configuration,
+ base_url=base_url or "",
+ operation_id="listScimGroupMappings",
+ oauth2_scopes=None,
+ security_source=get_security_from_env(
+ self.sdk_configuration.security, components.Security
+ ),
+ tags=["SCIM"],
+ extensions=None,
+ ),
+ request=req,
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
+ retry_config=retry_config,
+ )
+
+ def next_func() -> Optional[operations.ListScimGroupMappingsResponse]:
+ body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]])
+
+ offset = request.offset if isinstance(request.offset, int) else 0
+
+ if not http_res.text:
+ return None
+ results = JSONPath("$.data").parse(body)
+ if len(results) == 0 or len(results[0]) == 0:
+ return None
+ limit_ = request.limit if isinstance(request.limit, int) else 50
+ if len(results[0]) < limit_:
+ return None
+ next_offset = offset + len(results[0])
+
+ return self.list_mappings(
+ http_referer=http_referer,
+ x_open_router_title=x_open_router_title,
+ x_open_router_categories=x_open_router_categories,
+ offset=next_offset,
+ limit=limit,
+ retries=retries,
+ server_url=server_url,
+ timeout_ms=timeout_ms,
+ http_headers=http_headers,
+ )
+
+ response_data: Any = None
+ if utils.match_response(http_res, "200", "application/json"):
+ return operations.ListScimGroupMappingsResponse(
+ result=unmarshal_json_response(
+ components.ListScimGroupMappingsResponse, http_res
+ ),
+ next=next_func,
+ )
+ if utils.match_response(http_res, "401", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.UnauthorizedResponseErrorData, http_res
+ )
+ raise errors.UnauthorizedResponseError(response_data, http_res)
+ if utils.match_response(http_res, "404", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.NotFoundResponseErrorData, http_res
+ )
+ raise errors.NotFoundResponseError(response_data, http_res)
+ if utils.match_response(http_res, "500", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.InternalServerResponseErrorData, http_res
+ )
+ raise errors.InternalServerResponseError(response_data, http_res)
+ if utils.match_response(http_res, "4XX", "*"):
+ http_res_text = utils.stream_to_text(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+ if utils.match_response(http_res, "5XX", "*"):
+ http_res_text = utils.stream_to_text(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+
+ raise errors.OpenRouterDefaultError("Unexpected response received", http_res)
+
+ async def list_mappings_async(
+ self,
+ *,
+ http_referer: Optional[str] = None,
+ x_open_router_title: Optional[str] = None,
+ x_open_router_categories: Optional[str] = None,
+ offset: OptionalNullable[int] = 0,
+ limit: Optional[int] = 50,
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
+ server_url: Optional[str] = None,
+ timeout_ms: Optional[int] = None,
+ http_headers: Optional[Mapping[str, str]] = None,
+ ) -> Optional[operations.ListScimGroupMappingsResponse]:
+ r"""List SCIM group mappings
+
+ List SCIM group-to-workspace mappings for the organization. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+
+ :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ :param offset: Number of records to skip for pagination
+ :param limit: Maximum number of records to return (max 100)
+ :param retries: Override the default retry configuration for this method
+ :param server_url: Override the default server URL for this method
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
+ :param http_headers: Additional headers to set or replace on requests.
+ """
+ base_url = None
+ url_variables = None
+ if timeout_ms is None:
+ timeout_ms = self.sdk_configuration.timeout_ms
+
+ if server_url is not None:
+ base_url = server_url
+ else:
+ base_url = self._get_url(base_url, url_variables)
+
+ request = operations.ListScimGroupMappingsRequest(
+ http_referer=http_referer,
+ x_open_router_title=x_open_router_title,
+ x_open_router_categories=x_open_router_categories,
+ offset=offset,
+ limit=limit,
+ )
+
+ req = self._build_request_async(
+ method="GET",
+ path="/scim/group-mappings",
+ base_url=base_url,
+ url_variables=url_variables,
+ request=request,
+ request_body_required=False,
+ request_has_path_params=False,
+ request_has_query_params=True,
+ user_agent_header="user-agent",
+ accept_header_value="application/json",
+ http_headers=http_headers,
+ _globals=operations.ListScimGroupMappingsGlobals(
+ http_referer=self.sdk_configuration.globals.http_referer,
+ x_open_router_title=self.sdk_configuration.globals.x_open_router_title,
+ x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories,
+ ),
+ security=self.sdk_configuration.security,
+ allow_empty_value=None,
+ timeout_ms=timeout_ms,
+ )
+
+ if retries == UNSET:
+ if self.sdk_configuration.retry_config is not UNSET:
+ retries = self.sdk_configuration.retry_config
+ else:
+ retries = utils.RetryConfig(
+ "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True
+ )
+
+ retry_config = None
+ if isinstance(retries, utils.RetryConfig):
+ retry_config = (retries, ["5XX"])
+
+ http_res = await self.do_request_async(
+ hook_ctx=HookContext(
+ config=self.sdk_configuration,
+ base_url=base_url or "",
+ operation_id="listScimGroupMappings",
+ oauth2_scopes=None,
+ security_source=get_security_from_env(
+ self.sdk_configuration.security, components.Security
+ ),
+ tags=["SCIM"],
+ extensions=None,
+ ),
+ request=req,
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
+ retry_config=retry_config,
+ )
+
+ def next_func() -> (
+ Awaitable[Optional[operations.ListScimGroupMappingsResponse]]
+ ):
+ body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]])
+
+ async def empty_result():
+ return None
+
+ offset = request.offset if isinstance(request.offset, int) else 0
+
+ if not http_res.text:
+ return empty_result()
+ results = JSONPath("$.data").parse(body)
+ if len(results) == 0 or len(results[0]) == 0:
+ return empty_result()
+ limit_ = request.limit if isinstance(request.limit, int) else 50
+ if len(results[0]) < limit_:
+ return empty_result()
+ next_offset = offset + len(results[0])
+
+ return self.list_mappings_async(
+ http_referer=http_referer,
+ x_open_router_title=x_open_router_title,
+ x_open_router_categories=x_open_router_categories,
+ offset=next_offset,
+ limit=limit,
+ retries=retries,
+ server_url=server_url,
+ timeout_ms=timeout_ms,
+ http_headers=http_headers,
+ )
+
+ response_data: Any = None
+ if utils.match_response(http_res, "200", "application/json"):
+ return operations.ListScimGroupMappingsResponse(
+ result=unmarshal_json_response(
+ components.ListScimGroupMappingsResponse, http_res
+ ),
+ next=next_func,
+ )
+ if utils.match_response(http_res, "401", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.UnauthorizedResponseErrorData, http_res
+ )
+ raise errors.UnauthorizedResponseError(response_data, http_res)
+ if utils.match_response(http_res, "404", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.NotFoundResponseErrorData, http_res
+ )
+ raise errors.NotFoundResponseError(response_data, http_res)
+ if utils.match_response(http_res, "500", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.InternalServerResponseErrorData, http_res
+ )
+ raise errors.InternalServerResponseError(response_data, http_res)
+ if utils.match_response(http_res, "4XX", "*"):
+ http_res_text = await utils.stream_to_text_async(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+ if utils.match_response(http_res, "5XX", "*"):
+ http_res_text = await utils.stream_to_text_async(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+
+ raise errors.OpenRouterDefaultError("Unexpected response received", http_res)
+
+ def create(
+ self,
+ *,
+ role: components.CreateScimGroupMappingRequestRole,
+ scim_group_id: str,
+ workspace_id: str,
+ http_referer: Optional[str] = None,
+ x_open_router_title: Optional[str] = None,
+ x_open_router_categories: Optional[str] = None,
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
+ server_url: Optional[str] = None,
+ timeout_ms: Optional[int] = None,
+ http_headers: Optional[Mapping[str, str]] = None,
+ ) -> components.CreateScimGroupMappingResponse:
+ r"""Create a SCIM group mapping
+
+ Create a SCIM group-to-workspace role mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+
+ :param role:
+ :param scim_group_id:
+ :param workspace_id:
+ :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ :param retries: Override the default retry configuration for this method
+ :param server_url: Override the default server URL for this method
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
+ :param http_headers: Additional headers to set or replace on requests.
+ """
+ base_url = None
+ url_variables = None
+ if timeout_ms is None:
+ timeout_ms = self.sdk_configuration.timeout_ms
+
+ if server_url is not None:
+ base_url = server_url
+ else:
+ base_url = self._get_url(base_url, url_variables)
+
+ request = operations.CreateScimGroupMappingRequest(
+ http_referer=http_referer,
+ x_open_router_title=x_open_router_title,
+ x_open_router_categories=x_open_router_categories,
+ create_scim_group_mapping_request=components.CreateScimGroupMappingRequest(
+ role=role,
+ scim_group_id=scim_group_id,
+ workspace_id=workspace_id,
+ ),
+ )
+
+ req = self._build_request(
+ method="POST",
+ path="/scim/group-mappings",
+ base_url=base_url,
+ url_variables=url_variables,
+ request=request,
+ request_body_required=True,
+ request_has_path_params=False,
+ request_has_query_params=True,
+ user_agent_header="user-agent",
+ accept_header_value="application/json",
+ http_headers=http_headers,
+ _globals=operations.CreateScimGroupMappingGlobals(
+ http_referer=self.sdk_configuration.globals.http_referer,
+ x_open_router_title=self.sdk_configuration.globals.x_open_router_title,
+ x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories,
+ ),
+ security=self.sdk_configuration.security,
+ get_serialized_body=lambda: utils.serialize_request_body(
+ request.create_scim_group_mapping_request,
+ False,
+ False,
+ "json",
+ components.CreateScimGroupMappingRequest,
+ ),
+ allow_empty_value=None,
+ timeout_ms=timeout_ms,
+ )
+
+ if retries == UNSET:
+ if self.sdk_configuration.retry_config is not UNSET:
+ retries = self.sdk_configuration.retry_config
+ else:
+ retries = utils.RetryConfig(
+ "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True
+ )
+
+ retry_config = None
+ if isinstance(retries, utils.RetryConfig):
+ retry_config = (retries, ["5XX"])
+
+ http_res = self.do_request(
+ hook_ctx=HookContext(
+ config=self.sdk_configuration,
+ base_url=base_url or "",
+ operation_id="createScimGroupMapping",
+ oauth2_scopes=None,
+ security_source=get_security_from_env(
+ self.sdk_configuration.security, components.Security
+ ),
+ tags=["SCIM"],
+ extensions=None,
+ ),
+ request=req,
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
+ retry_config=retry_config,
+ )
+
+ response_data: Any = None
+ if utils.match_response(http_res, "201", "application/json"):
+ return unmarshal_json_response(
+ components.CreateScimGroupMappingResponse, http_res
+ )
+ if utils.match_response(http_res, "400", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.BadRequestResponseErrorData, http_res
+ )
+ raise errors.BadRequestResponseError(response_data, http_res)
+ if utils.match_response(http_res, "401", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.UnauthorizedResponseErrorData, http_res
+ )
+ raise errors.UnauthorizedResponseError(response_data, http_res)
+ if utils.match_response(http_res, "404", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.NotFoundResponseErrorData, http_res
+ )
+ raise errors.NotFoundResponseError(response_data, http_res)
+ if utils.match_response(http_res, "409", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.ConflictResponseErrorData, http_res
+ )
+ raise errors.ConflictResponseError(response_data, http_res)
+ if utils.match_response(http_res, "500", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.InternalServerResponseErrorData, http_res
+ )
+ raise errors.InternalServerResponseError(response_data, http_res)
+ if utils.match_response(http_res, "4XX", "*"):
+ http_res_text = utils.stream_to_text(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+ if utils.match_response(http_res, "5XX", "*"):
+ http_res_text = utils.stream_to_text(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+
+ raise errors.OpenRouterDefaultError("Unexpected response received", http_res)
+
+ async def create_async(
+ self,
+ *,
+ role: components.CreateScimGroupMappingRequestRole,
+ scim_group_id: str,
+ workspace_id: str,
+ http_referer: Optional[str] = None,
+ x_open_router_title: Optional[str] = None,
+ x_open_router_categories: Optional[str] = None,
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
+ server_url: Optional[str] = None,
+ timeout_ms: Optional[int] = None,
+ http_headers: Optional[Mapping[str, str]] = None,
+ ) -> components.CreateScimGroupMappingResponse:
+ r"""Create a SCIM group mapping
+
+ Create a SCIM group-to-workspace role mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+
+ :param role:
+ :param scim_group_id:
+ :param workspace_id:
+ :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ :param retries: Override the default retry configuration for this method
+ :param server_url: Override the default server URL for this method
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
+ :param http_headers: Additional headers to set or replace on requests.
+ """
+ base_url = None
+ url_variables = None
+ if timeout_ms is None:
+ timeout_ms = self.sdk_configuration.timeout_ms
+
+ if server_url is not None:
+ base_url = server_url
+ else:
+ base_url = self._get_url(base_url, url_variables)
+
+ request = operations.CreateScimGroupMappingRequest(
+ http_referer=http_referer,
+ x_open_router_title=x_open_router_title,
+ x_open_router_categories=x_open_router_categories,
+ create_scim_group_mapping_request=components.CreateScimGroupMappingRequest(
+ role=role,
+ scim_group_id=scim_group_id,
+ workspace_id=workspace_id,
+ ),
+ )
+
+ req = self._build_request_async(
+ method="POST",
+ path="/scim/group-mappings",
+ base_url=base_url,
+ url_variables=url_variables,
+ request=request,
+ request_body_required=True,
+ request_has_path_params=False,
+ request_has_query_params=True,
+ user_agent_header="user-agent",
+ accept_header_value="application/json",
+ http_headers=http_headers,
+ _globals=operations.CreateScimGroupMappingGlobals(
+ http_referer=self.sdk_configuration.globals.http_referer,
+ x_open_router_title=self.sdk_configuration.globals.x_open_router_title,
+ x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories,
+ ),
+ security=self.sdk_configuration.security,
+ get_serialized_body=lambda: utils.serialize_request_body(
+ request.create_scim_group_mapping_request,
+ False,
+ False,
+ "json",
+ components.CreateScimGroupMappingRequest,
+ ),
+ allow_empty_value=None,
+ timeout_ms=timeout_ms,
+ )
+
+ if retries == UNSET:
+ if self.sdk_configuration.retry_config is not UNSET:
+ retries = self.sdk_configuration.retry_config
+ else:
+ retries = utils.RetryConfig(
+ "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True
+ )
+
+ retry_config = None
+ if isinstance(retries, utils.RetryConfig):
+ retry_config = (retries, ["5XX"])
+
+ http_res = await self.do_request_async(
+ hook_ctx=HookContext(
+ config=self.sdk_configuration,
+ base_url=base_url or "",
+ operation_id="createScimGroupMapping",
+ oauth2_scopes=None,
+ security_source=get_security_from_env(
+ self.sdk_configuration.security, components.Security
+ ),
+ tags=["SCIM"],
+ extensions=None,
+ ),
+ request=req,
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
+ retry_config=retry_config,
+ )
+
+ response_data: Any = None
+ if utils.match_response(http_res, "201", "application/json"):
+ return unmarshal_json_response(
+ components.CreateScimGroupMappingResponse, http_res
+ )
+ if utils.match_response(http_res, "400", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.BadRequestResponseErrorData, http_res
+ )
+ raise errors.BadRequestResponseError(response_data, http_res)
+ if utils.match_response(http_res, "401", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.UnauthorizedResponseErrorData, http_res
+ )
+ raise errors.UnauthorizedResponseError(response_data, http_res)
+ if utils.match_response(http_res, "404", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.NotFoundResponseErrorData, http_res
+ )
+ raise errors.NotFoundResponseError(response_data, http_res)
+ if utils.match_response(http_res, "409", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.ConflictResponseErrorData, http_res
+ )
+ raise errors.ConflictResponseError(response_data, http_res)
+ if utils.match_response(http_res, "500", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.InternalServerResponseErrorData, http_res
+ )
+ raise errors.InternalServerResponseError(response_data, http_res)
+ if utils.match_response(http_res, "4XX", "*"):
+ http_res_text = await utils.stream_to_text_async(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+ if utils.match_response(http_res, "5XX", "*"):
+ http_res_text = await utils.stream_to_text_async(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+
+ raise errors.OpenRouterDefaultError("Unexpected response received", http_res)
+
+ def delete(
+ self,
+ *,
+ id: str,
+ keep_members: Union[operations.KeepMembers, operations.KeepMembersTypedDict],
+ http_referer: Optional[str] = None,
+ x_open_router_title: Optional[str] = None,
+ x_open_router_categories: Optional[str] = None,
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
+ server_url: Optional[str] = None,
+ timeout_ms: Optional[int] = None,
+ http_headers: Optional[Mapping[str, str]] = None,
+ ) -> components.DeleteScimGroupMappingResponse:
+ r"""Delete a SCIM group mapping
+
+ Delete a SCIM group-to-workspace mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+
+ :param id:
+ :param keep_members: Required. Whether to keep workspace members after deleting the mapping. `false` **removes** the members this mapping granted access to; `true` deletes the mapping while leaving membership intact as manually-managed. There is deliberately no default — omitting it returns `400` so the destructive path cannot be reached by accident. Mirrors the dashboard, whose `DeleteMappingSchema.keepMembers` is likewise required.
+ :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ :param retries: Override the default retry configuration for this method
+ :param server_url: Override the default server URL for this method
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
+ :param http_headers: Additional headers to set or replace on requests.
+ """
+ base_url = None
+ url_variables = None
+ if timeout_ms is None:
+ timeout_ms = self.sdk_configuration.timeout_ms
+
+ if server_url is not None:
+ base_url = server_url
+ else:
+ base_url = self._get_url(base_url, url_variables)
+
+ request = operations.DeleteScimGroupMappingRequest(
+ http_referer=http_referer,
+ x_open_router_title=x_open_router_title,
+ x_open_router_categories=x_open_router_categories,
+ id=id,
+ keep_members=keep_members,
+ )
+
+ req = self._build_request(
+ method="DELETE",
+ path="/scim/group-mappings/{id}",
+ base_url=base_url,
+ url_variables=url_variables,
+ request=request,
+ request_body_required=False,
+ request_has_path_params=True,
+ request_has_query_params=True,
+ user_agent_header="user-agent",
+ accept_header_value="application/json",
+ http_headers=http_headers,
+ _globals=operations.DeleteScimGroupMappingGlobals(
+ http_referer=self.sdk_configuration.globals.http_referer,
+ x_open_router_title=self.sdk_configuration.globals.x_open_router_title,
+ x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories,
+ ),
+ security=self.sdk_configuration.security,
+ allow_empty_value=None,
+ timeout_ms=timeout_ms,
+ )
+
+ if retries == UNSET:
+ if self.sdk_configuration.retry_config is not UNSET:
+ retries = self.sdk_configuration.retry_config
+ else:
+ retries = utils.RetryConfig(
+ "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True
+ )
+
+ retry_config = None
+ if isinstance(retries, utils.RetryConfig):
+ retry_config = (retries, ["5XX"])
+
+ http_res = self.do_request(
+ hook_ctx=HookContext(
+ config=self.sdk_configuration,
+ base_url=base_url or "",
+ operation_id="deleteScimGroupMapping",
+ oauth2_scopes=None,
+ security_source=get_security_from_env(
+ self.sdk_configuration.security, components.Security
+ ),
+ tags=["SCIM"],
+ extensions=None,
+ ),
+ request=req,
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
+ retry_config=retry_config,
+ )
+
+ response_data: Any = None
+ if utils.match_response(http_res, "200", "application/json"):
+ return unmarshal_json_response(
+ components.DeleteScimGroupMappingResponse, http_res
+ )
+ if utils.match_response(http_res, "400", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.BadRequestResponseErrorData, http_res
+ )
+ raise errors.BadRequestResponseError(response_data, http_res)
+ if utils.match_response(http_res, "401", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.UnauthorizedResponseErrorData, http_res
+ )
+ raise errors.UnauthorizedResponseError(response_data, http_res)
+ if utils.match_response(http_res, "404", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.NotFoundResponseErrorData, http_res
+ )
+ raise errors.NotFoundResponseError(response_data, http_res)
+ if utils.match_response(http_res, "500", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.InternalServerResponseErrorData, http_res
+ )
+ raise errors.InternalServerResponseError(response_data, http_res)
+ if utils.match_response(http_res, "4XX", "*"):
+ http_res_text = utils.stream_to_text(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+ if utils.match_response(http_res, "5XX", "*"):
+ http_res_text = utils.stream_to_text(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+
+ raise errors.OpenRouterDefaultError("Unexpected response received", http_res)
+
+ async def delete_async(
+ self,
+ *,
+ id: str,
+ keep_members: Union[operations.KeepMembers, operations.KeepMembersTypedDict],
+ http_referer: Optional[str] = None,
+ x_open_router_title: Optional[str] = None,
+ x_open_router_categories: Optional[str] = None,
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
+ server_url: Optional[str] = None,
+ timeout_ms: Optional[int] = None,
+ http_headers: Optional[Mapping[str, str]] = None,
+ ) -> components.DeleteScimGroupMappingResponse:
+ r"""Delete a SCIM group mapping
+
+ Delete a SCIM group-to-workspace mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+
+ :param id:
+ :param keep_members: Required. Whether to keep workspace members after deleting the mapping. `false` **removes** the members this mapping granted access to; `true` deletes the mapping while leaving membership intact as manually-managed. There is deliberately no default — omitting it returns `400` so the destructive path cannot be reached by accident. Mirrors the dashboard, whose `DeleteMappingSchema.keepMembers` is likewise required.
+ :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ :param retries: Override the default retry configuration for this method
+ :param server_url: Override the default server URL for this method
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
+ :param http_headers: Additional headers to set or replace on requests.
+ """
+ base_url = None
+ url_variables = None
+ if timeout_ms is None:
+ timeout_ms = self.sdk_configuration.timeout_ms
+
+ if server_url is not None:
+ base_url = server_url
+ else:
+ base_url = self._get_url(base_url, url_variables)
+
+ request = operations.DeleteScimGroupMappingRequest(
+ http_referer=http_referer,
+ x_open_router_title=x_open_router_title,
+ x_open_router_categories=x_open_router_categories,
+ id=id,
+ keep_members=keep_members,
+ )
+
+ req = self._build_request_async(
+ method="DELETE",
+ path="/scim/group-mappings/{id}",
+ base_url=base_url,
+ url_variables=url_variables,
+ request=request,
+ request_body_required=False,
+ request_has_path_params=True,
+ request_has_query_params=True,
+ user_agent_header="user-agent",
+ accept_header_value="application/json",
+ http_headers=http_headers,
+ _globals=operations.DeleteScimGroupMappingGlobals(
+ http_referer=self.sdk_configuration.globals.http_referer,
+ x_open_router_title=self.sdk_configuration.globals.x_open_router_title,
+ x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories,
+ ),
+ security=self.sdk_configuration.security,
+ allow_empty_value=None,
+ timeout_ms=timeout_ms,
+ )
+
+ if retries == UNSET:
+ if self.sdk_configuration.retry_config is not UNSET:
+ retries = self.sdk_configuration.retry_config
+ else:
+ retries = utils.RetryConfig(
+ "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True
+ )
+
+ retry_config = None
+ if isinstance(retries, utils.RetryConfig):
+ retry_config = (retries, ["5XX"])
+
+ http_res = await self.do_request_async(
+ hook_ctx=HookContext(
+ config=self.sdk_configuration,
+ base_url=base_url or "",
+ operation_id="deleteScimGroupMapping",
+ oauth2_scopes=None,
+ security_source=get_security_from_env(
+ self.sdk_configuration.security, components.Security
+ ),
+ tags=["SCIM"],
+ extensions=None,
+ ),
+ request=req,
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
+ retry_config=retry_config,
+ )
+
+ response_data: Any = None
+ if utils.match_response(http_res, "200", "application/json"):
+ return unmarshal_json_response(
+ components.DeleteScimGroupMappingResponse, http_res
+ )
+ if utils.match_response(http_res, "400", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.BadRequestResponseErrorData, http_res
+ )
+ raise errors.BadRequestResponseError(response_data, http_res)
+ if utils.match_response(http_res, "401", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.UnauthorizedResponseErrorData, http_res
+ )
+ raise errors.UnauthorizedResponseError(response_data, http_res)
+ if utils.match_response(http_res, "404", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.NotFoundResponseErrorData, http_res
+ )
+ raise errors.NotFoundResponseError(response_data, http_res)
+ if utils.match_response(http_res, "500", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.InternalServerResponseErrorData, http_res
+ )
+ raise errors.InternalServerResponseError(response_data, http_res)
+ if utils.match_response(http_res, "4XX", "*"):
+ http_res_text = await utils.stream_to_text_async(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+ if utils.match_response(http_res, "5XX", "*"):
+ http_res_text = await utils.stream_to_text_async(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+
+ raise errors.OpenRouterDefaultError("Unexpected response received", http_res)
+
+ def read(
+ self,
+ *,
+ id: str,
+ http_referer: Optional[str] = None,
+ x_open_router_title: Optional[str] = None,
+ x_open_router_categories: Optional[str] = None,
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
+ server_url: Optional[str] = None,
+ timeout_ms: Optional[int] = None,
+ http_headers: Optional[Mapping[str, str]] = None,
+ ) -> components.GetScimGroupMappingResponse:
+ r"""Get a SCIM group mapping
+
+ Get a SCIM group-to-workspace mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+
+ :param id:
+ :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ :param retries: Override the default retry configuration for this method
+ :param server_url: Override the default server URL for this method
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
+ :param http_headers: Additional headers to set or replace on requests.
+ """
+ base_url = None
+ url_variables = None
+ if timeout_ms is None:
+ timeout_ms = self.sdk_configuration.timeout_ms
+
+ if server_url is not None:
+ base_url = server_url
+ else:
+ base_url = self._get_url(base_url, url_variables)
+
+ request = operations.GetScimGroupMappingRequest(
+ http_referer=http_referer,
+ x_open_router_title=x_open_router_title,
+ x_open_router_categories=x_open_router_categories,
+ id=id,
+ )
+
+ req = self._build_request(
+ method="GET",
+ path="/scim/group-mappings/{id}",
+ base_url=base_url,
+ url_variables=url_variables,
+ request=request,
+ request_body_required=False,
+ request_has_path_params=True,
+ request_has_query_params=True,
+ user_agent_header="user-agent",
+ accept_header_value="application/json",
+ http_headers=http_headers,
+ _globals=operations.GetScimGroupMappingGlobals(
+ http_referer=self.sdk_configuration.globals.http_referer,
+ x_open_router_title=self.sdk_configuration.globals.x_open_router_title,
+ x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories,
+ ),
+ security=self.sdk_configuration.security,
+ allow_empty_value=None,
+ timeout_ms=timeout_ms,
+ )
+
+ if retries == UNSET:
+ if self.sdk_configuration.retry_config is not UNSET:
+ retries = self.sdk_configuration.retry_config
+ else:
+ retries = utils.RetryConfig(
+ "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True
+ )
+
+ retry_config = None
+ if isinstance(retries, utils.RetryConfig):
+ retry_config = (retries, ["5XX"])
+
+ http_res = self.do_request(
+ hook_ctx=HookContext(
+ config=self.sdk_configuration,
+ base_url=base_url or "",
+ operation_id="getScimGroupMapping",
+ oauth2_scopes=None,
+ security_source=get_security_from_env(
+ self.sdk_configuration.security, components.Security
+ ),
+ tags=["SCIM"],
+ extensions=None,
+ ),
+ request=req,
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
+ retry_config=retry_config,
+ )
+
+ response_data: Any = None
+ if utils.match_response(http_res, "200", "application/json"):
+ return unmarshal_json_response(
+ components.GetScimGroupMappingResponse, http_res
+ )
+ if utils.match_response(http_res, "401", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.UnauthorizedResponseErrorData, http_res
+ )
+ raise errors.UnauthorizedResponseError(response_data, http_res)
+ if utils.match_response(http_res, "404", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.NotFoundResponseErrorData, http_res
+ )
+ raise errors.NotFoundResponseError(response_data, http_res)
+ if utils.match_response(http_res, "500", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.InternalServerResponseErrorData, http_res
+ )
+ raise errors.InternalServerResponseError(response_data, http_res)
+ if utils.match_response(http_res, "4XX", "*"):
+ http_res_text = utils.stream_to_text(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+ if utils.match_response(http_res, "5XX", "*"):
+ http_res_text = utils.stream_to_text(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+
+ raise errors.OpenRouterDefaultError("Unexpected response received", http_res)
+
+ async def read_async(
+ self,
+ *,
+ id: str,
+ http_referer: Optional[str] = None,
+ x_open_router_title: Optional[str] = None,
+ x_open_router_categories: Optional[str] = None,
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
+ server_url: Optional[str] = None,
+ timeout_ms: Optional[int] = None,
+ http_headers: Optional[Mapping[str, str]] = None,
+ ) -> components.GetScimGroupMappingResponse:
+ r"""Get a SCIM group mapping
+
+ Get a SCIM group-to-workspace mapping. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+
+ :param id:
+ :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ :param retries: Override the default retry configuration for this method
+ :param server_url: Override the default server URL for this method
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
+ :param http_headers: Additional headers to set or replace on requests.
+ """
+ base_url = None
+ url_variables = None
+ if timeout_ms is None:
+ timeout_ms = self.sdk_configuration.timeout_ms
+
+ if server_url is not None:
+ base_url = server_url
+ else:
+ base_url = self._get_url(base_url, url_variables)
+
+ request = operations.GetScimGroupMappingRequest(
+ http_referer=http_referer,
+ x_open_router_title=x_open_router_title,
+ x_open_router_categories=x_open_router_categories,
+ id=id,
+ )
+
+ req = self._build_request_async(
+ method="GET",
+ path="/scim/group-mappings/{id}",
+ base_url=base_url,
+ url_variables=url_variables,
+ request=request,
+ request_body_required=False,
+ request_has_path_params=True,
+ request_has_query_params=True,
+ user_agent_header="user-agent",
+ accept_header_value="application/json",
+ http_headers=http_headers,
+ _globals=operations.GetScimGroupMappingGlobals(
+ http_referer=self.sdk_configuration.globals.http_referer,
+ x_open_router_title=self.sdk_configuration.globals.x_open_router_title,
+ x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories,
+ ),
+ security=self.sdk_configuration.security,
+ allow_empty_value=None,
+ timeout_ms=timeout_ms,
+ )
+
+ if retries == UNSET:
+ if self.sdk_configuration.retry_config is not UNSET:
+ retries = self.sdk_configuration.retry_config
+ else:
+ retries = utils.RetryConfig(
+ "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True
+ )
+
+ retry_config = None
+ if isinstance(retries, utils.RetryConfig):
+ retry_config = (retries, ["5XX"])
+
+ http_res = await self.do_request_async(
+ hook_ctx=HookContext(
+ config=self.sdk_configuration,
+ base_url=base_url or "",
+ operation_id="getScimGroupMapping",
+ oauth2_scopes=None,
+ security_source=get_security_from_env(
+ self.sdk_configuration.security, components.Security
+ ),
+ tags=["SCIM"],
+ extensions=None,
+ ),
+ request=req,
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
+ retry_config=retry_config,
+ )
+
+ response_data: Any = None
+ if utils.match_response(http_res, "200", "application/json"):
+ return unmarshal_json_response(
+ components.GetScimGroupMappingResponse, http_res
+ )
+ if utils.match_response(http_res, "401", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.UnauthorizedResponseErrorData, http_res
+ )
+ raise errors.UnauthorizedResponseError(response_data, http_res)
+ if utils.match_response(http_res, "404", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.NotFoundResponseErrorData, http_res
+ )
+ raise errors.NotFoundResponseError(response_data, http_res)
+ if utils.match_response(http_res, "500", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.InternalServerResponseErrorData, http_res
+ )
+ raise errors.InternalServerResponseError(response_data, http_res)
+ if utils.match_response(http_res, "4XX", "*"):
+ http_res_text = await utils.stream_to_text_async(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+ if utils.match_response(http_res, "5XX", "*"):
+ http_res_text = await utils.stream_to_text_async(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+
+ raise errors.OpenRouterDefaultError("Unexpected response received", http_res)
+
+ def update(
+ self,
+ *,
+ id: str,
+ role: components.UpdateScimGroupMappingRequestRole,
+ http_referer: Optional[str] = None,
+ x_open_router_title: Optional[str] = None,
+ x_open_router_categories: Optional[str] = None,
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
+ server_url: Optional[str] = None,
+ timeout_ms: Optional[int] = None,
+ http_headers: Optional[Mapping[str, str]] = None,
+ ) -> components.UpdateScimGroupMappingResponse:
+ r"""Update a SCIM group mapping
+
+ Update a SCIM group mapping role. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+
+ :param id:
+ :param role:
+ :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ :param retries: Override the default retry configuration for this method
+ :param server_url: Override the default server URL for this method
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
+ :param http_headers: Additional headers to set or replace on requests.
+ """
+ base_url = None
+ url_variables = None
+ if timeout_ms is None:
+ timeout_ms = self.sdk_configuration.timeout_ms
+
+ if server_url is not None:
+ base_url = server_url
+ else:
+ base_url = self._get_url(base_url, url_variables)
+
+ request = operations.UpdateScimGroupMappingRequest(
+ http_referer=http_referer,
+ x_open_router_title=x_open_router_title,
+ x_open_router_categories=x_open_router_categories,
+ id=id,
+ update_scim_group_mapping_request=components.UpdateScimGroupMappingRequest(
+ role=role,
+ ),
+ )
+
+ req = self._build_request(
+ method="PATCH",
+ path="/scim/group-mappings/{id}",
+ base_url=base_url,
+ url_variables=url_variables,
+ request=request,
+ request_body_required=True,
+ request_has_path_params=True,
+ request_has_query_params=True,
+ user_agent_header="user-agent",
+ accept_header_value="application/json",
+ http_headers=http_headers,
+ _globals=operations.UpdateScimGroupMappingGlobals(
+ http_referer=self.sdk_configuration.globals.http_referer,
+ x_open_router_title=self.sdk_configuration.globals.x_open_router_title,
+ x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories,
+ ),
+ security=self.sdk_configuration.security,
+ get_serialized_body=lambda: utils.serialize_request_body(
+ request.update_scim_group_mapping_request,
+ False,
+ False,
+ "json",
+ components.UpdateScimGroupMappingRequest,
+ ),
+ allow_empty_value=None,
+ timeout_ms=timeout_ms,
+ )
+
+ if retries == UNSET:
+ if self.sdk_configuration.retry_config is not UNSET:
+ retries = self.sdk_configuration.retry_config
+ else:
+ retries = utils.RetryConfig(
+ "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True
+ )
+
+ retry_config = None
+ if isinstance(retries, utils.RetryConfig):
+ retry_config = (retries, ["5XX"])
+
+ http_res = self.do_request(
+ hook_ctx=HookContext(
+ config=self.sdk_configuration,
+ base_url=base_url or "",
+ operation_id="updateScimGroupMapping",
+ oauth2_scopes=None,
+ security_source=get_security_from_env(
+ self.sdk_configuration.security, components.Security
+ ),
+ tags=["SCIM"],
+ extensions=None,
+ ),
+ request=req,
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
+ retry_config=retry_config,
+ )
+
+ response_data: Any = None
+ if utils.match_response(http_res, "200", "application/json"):
+ return unmarshal_json_response(
+ components.UpdateScimGroupMappingResponse, http_res
+ )
+ if utils.match_response(http_res, "400", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.BadRequestResponseErrorData, http_res
+ )
+ raise errors.BadRequestResponseError(response_data, http_res)
+ if utils.match_response(http_res, "401", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.UnauthorizedResponseErrorData, http_res
+ )
+ raise errors.UnauthorizedResponseError(response_data, http_res)
+ if utils.match_response(http_res, "404", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.NotFoundResponseErrorData, http_res
+ )
+ raise errors.NotFoundResponseError(response_data, http_res)
+ if utils.match_response(http_res, "500", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.InternalServerResponseErrorData, http_res
+ )
+ raise errors.InternalServerResponseError(response_data, http_res)
+ if utils.match_response(http_res, "4XX", "*"):
+ http_res_text = utils.stream_to_text(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+ if utils.match_response(http_res, "5XX", "*"):
+ http_res_text = utils.stream_to_text(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+
+ raise errors.OpenRouterDefaultError("Unexpected response received", http_res)
+
+ async def update_async(
+ self,
+ *,
+ id: str,
+ role: components.UpdateScimGroupMappingRequestRole,
+ http_referer: Optional[str] = None,
+ x_open_router_title: Optional[str] = None,
+ x_open_router_categories: Optional[str] = None,
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
+ server_url: Optional[str] = None,
+ timeout_ms: Optional[int] = None,
+ http_headers: Optional[Mapping[str, str]] = None,
+ ) -> components.UpdateScimGroupMappingResponse:
+ r"""Update a SCIM group mapping
+
+ Update a SCIM group mapping role. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+
+ :param id:
+ :param role:
+ :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ :param retries: Override the default retry configuration for this method
+ :param server_url: Override the default server URL for this method
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
+ :param http_headers: Additional headers to set or replace on requests.
+ """
+ base_url = None
+ url_variables = None
+ if timeout_ms is None:
+ timeout_ms = self.sdk_configuration.timeout_ms
+
+ if server_url is not None:
+ base_url = server_url
+ else:
+ base_url = self._get_url(base_url, url_variables)
+
+ request = operations.UpdateScimGroupMappingRequest(
+ http_referer=http_referer,
+ x_open_router_title=x_open_router_title,
+ x_open_router_categories=x_open_router_categories,
+ id=id,
+ update_scim_group_mapping_request=components.UpdateScimGroupMappingRequest(
+ role=role,
+ ),
+ )
+
+ req = self._build_request_async(
+ method="PATCH",
+ path="/scim/group-mappings/{id}",
+ base_url=base_url,
+ url_variables=url_variables,
+ request=request,
+ request_body_required=True,
+ request_has_path_params=True,
+ request_has_query_params=True,
+ user_agent_header="user-agent",
+ accept_header_value="application/json",
+ http_headers=http_headers,
+ _globals=operations.UpdateScimGroupMappingGlobals(
+ http_referer=self.sdk_configuration.globals.http_referer,
+ x_open_router_title=self.sdk_configuration.globals.x_open_router_title,
+ x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories,
+ ),
+ security=self.sdk_configuration.security,
+ get_serialized_body=lambda: utils.serialize_request_body(
+ request.update_scim_group_mapping_request,
+ False,
+ False,
+ "json",
+ components.UpdateScimGroupMappingRequest,
+ ),
+ allow_empty_value=None,
+ timeout_ms=timeout_ms,
+ )
+
+ if retries == UNSET:
+ if self.sdk_configuration.retry_config is not UNSET:
+ retries = self.sdk_configuration.retry_config
+ else:
+ retries = utils.RetryConfig(
+ "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True
+ )
+
+ retry_config = None
+ if isinstance(retries, utils.RetryConfig):
+ retry_config = (retries, ["5XX"])
+
+ http_res = await self.do_request_async(
+ hook_ctx=HookContext(
+ config=self.sdk_configuration,
+ base_url=base_url or "",
+ operation_id="updateScimGroupMapping",
+ oauth2_scopes=None,
+ security_source=get_security_from_env(
+ self.sdk_configuration.security, components.Security
+ ),
+ tags=["SCIM"],
+ extensions=None,
+ ),
+ request=req,
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
+ retry_config=retry_config,
+ )
+
+ response_data: Any = None
+ if utils.match_response(http_res, "200", "application/json"):
+ return unmarshal_json_response(
+ components.UpdateScimGroupMappingResponse, http_res
+ )
+ if utils.match_response(http_res, "400", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.BadRequestResponseErrorData, http_res
+ )
+ raise errors.BadRequestResponseError(response_data, http_res)
+ if utils.match_response(http_res, "401", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.UnauthorizedResponseErrorData, http_res
+ )
+ raise errors.UnauthorizedResponseError(response_data, http_res)
+ if utils.match_response(http_res, "404", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.NotFoundResponseErrorData, http_res
+ )
+ raise errors.NotFoundResponseError(response_data, http_res)
+ if utils.match_response(http_res, "500", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.InternalServerResponseErrorData, http_res
+ )
+ raise errors.InternalServerResponseError(response_data, http_res)
+ if utils.match_response(http_res, "4XX", "*"):
+ http_res_text = await utils.stream_to_text_async(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+ if utils.match_response(http_res, "5XX", "*"):
+ http_res_text = await utils.stream_to_text_async(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+
+ raise errors.OpenRouterDefaultError("Unexpected response received", http_res)
+
+ def list_groups(
+ self,
+ *,
+ http_referer: Optional[str] = None,
+ x_open_router_title: Optional[str] = None,
+ x_open_router_categories: Optional[str] = None,
+ offset: OptionalNullable[int] = 0,
+ limit: Optional[int] = 50,
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
+ server_url: Optional[str] = None,
+ timeout_ms: Optional[int] = None,
+ http_headers: Optional[Mapping[str, str]] = None,
+ ) -> Optional[operations.ListScimGroupsResponse]:
+ r"""List SCIM groups
+
+ List SCIM groups for the organization. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+
+ :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ :param offset: Number of records to skip for pagination
+ :param limit: Maximum number of records to return (max 100)
+ :param retries: Override the default retry configuration for this method
+ :param server_url: Override the default server URL for this method
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
+ :param http_headers: Additional headers to set or replace on requests.
+ """
+ base_url = None
+ url_variables = None
+ if timeout_ms is None:
+ timeout_ms = self.sdk_configuration.timeout_ms
+
+ if server_url is not None:
+ base_url = server_url
+ else:
+ base_url = self._get_url(base_url, url_variables)
+
+ request = operations.ListScimGroupsRequest(
+ http_referer=http_referer,
+ x_open_router_title=x_open_router_title,
+ x_open_router_categories=x_open_router_categories,
+ offset=offset,
+ limit=limit,
+ )
+
+ req = self._build_request(
+ method="GET",
+ path="/scim/groups",
+ base_url=base_url,
+ url_variables=url_variables,
+ request=request,
+ request_body_required=False,
+ request_has_path_params=False,
+ request_has_query_params=True,
+ user_agent_header="user-agent",
+ accept_header_value="application/json",
+ http_headers=http_headers,
+ _globals=operations.ListScimGroupsGlobals(
+ http_referer=self.sdk_configuration.globals.http_referer,
+ x_open_router_title=self.sdk_configuration.globals.x_open_router_title,
+ x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories,
+ ),
+ security=self.sdk_configuration.security,
+ allow_empty_value=None,
+ timeout_ms=timeout_ms,
+ )
+
+ if retries == UNSET:
+ if self.sdk_configuration.retry_config is not UNSET:
+ retries = self.sdk_configuration.retry_config
+ else:
+ retries = utils.RetryConfig(
+ "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True
+ )
+
+ retry_config = None
+ if isinstance(retries, utils.RetryConfig):
+ retry_config = (retries, ["5XX"])
+
+ http_res = self.do_request(
+ hook_ctx=HookContext(
+ config=self.sdk_configuration,
+ base_url=base_url or "",
+ operation_id="listScimGroups",
+ oauth2_scopes=None,
+ security_source=get_security_from_env(
+ self.sdk_configuration.security, components.Security
+ ),
+ tags=["SCIM"],
+ extensions=None,
+ ),
+ request=req,
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
+ retry_config=retry_config,
+ )
+
+ def next_func() -> Optional[operations.ListScimGroupsResponse]:
+ body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]])
+
+ offset = request.offset if isinstance(request.offset, int) else 0
+
+ if not http_res.text:
+ return None
+ results = JSONPath("$.data").parse(body)
+ if len(results) == 0 or len(results[0]) == 0:
+ return None
+ limit_ = request.limit if isinstance(request.limit, int) else 50
+ if len(results[0]) < limit_:
+ return None
+ next_offset = offset + len(results[0])
+
+ return self.list_groups(
+ http_referer=http_referer,
+ x_open_router_title=x_open_router_title,
+ x_open_router_categories=x_open_router_categories,
+ offset=next_offset,
+ limit=limit,
+ retries=retries,
+ server_url=server_url,
+ timeout_ms=timeout_ms,
+ http_headers=http_headers,
+ )
+
+ response_data: Any = None
+ if utils.match_response(http_res, "200", "application/json"):
+ return operations.ListScimGroupsResponse(
+ result=unmarshal_json_response(
+ components.ListScimGroupsResponse, http_res
+ ),
+ next=next_func,
+ )
+ if utils.match_response(http_res, "401", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.UnauthorizedResponseErrorData, http_res
+ )
+ raise errors.UnauthorizedResponseError(response_data, http_res)
+ if utils.match_response(http_res, "404", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.NotFoundResponseErrorData, http_res
+ )
+ raise errors.NotFoundResponseError(response_data, http_res)
+ if utils.match_response(http_res, "500", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.InternalServerResponseErrorData, http_res
+ )
+ raise errors.InternalServerResponseError(response_data, http_res)
+ if utils.match_response(http_res, "4XX", "*"):
+ http_res_text = utils.stream_to_text(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+ if utils.match_response(http_res, "5XX", "*"):
+ http_res_text = utils.stream_to_text(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+
+ raise errors.OpenRouterDefaultError("Unexpected response received", http_res)
+
+ async def list_groups_async(
+ self,
+ *,
+ http_referer: Optional[str] = None,
+ x_open_router_title: Optional[str] = None,
+ x_open_router_categories: Optional[str] = None,
+ offset: OptionalNullable[int] = 0,
+ limit: Optional[int] = 50,
+ retries: OptionalNullable[utils.RetryConfig] = UNSET,
+ server_url: Optional[str] = None,
+ timeout_ms: Optional[int] = None,
+ http_headers: Optional[Mapping[str, str]] = None,
+ ) -> Optional[operations.ListScimGroupsResponse]:
+ r"""List SCIM groups
+
+ List SCIM groups for the organization. [Management key](/docs/guides/overview/auth/management-api-keys) required.
+
+ :param http_referer: The app identifier should be your app's URL and is used as the primary identifier for rankings.
+ This is used to track API usage per application.
+
+ :param x_open_router_title: The app display name allows you to customize how your app appears in OpenRouter's dashboard.
+
+ :param x_open_router_categories: Comma-separated list of app categories (e.g. \"cli-agent,cloud-agent\"). Used for marketplace rankings.
+
+ :param offset: Number of records to skip for pagination
+ :param limit: Maximum number of records to return (max 100)
+ :param retries: Override the default retry configuration for this method
+ :param server_url: Override the default server URL for this method
+ :param timeout_ms: Override the default request timeout configuration for this method in milliseconds
+ :param http_headers: Additional headers to set or replace on requests.
+ """
+ base_url = None
+ url_variables = None
+ if timeout_ms is None:
+ timeout_ms = self.sdk_configuration.timeout_ms
+
+ if server_url is not None:
+ base_url = server_url
+ else:
+ base_url = self._get_url(base_url, url_variables)
+
+ request = operations.ListScimGroupsRequest(
+ http_referer=http_referer,
+ x_open_router_title=x_open_router_title,
+ x_open_router_categories=x_open_router_categories,
+ offset=offset,
+ limit=limit,
+ )
+
+ req = self._build_request_async(
+ method="GET",
+ path="/scim/groups",
+ base_url=base_url,
+ url_variables=url_variables,
+ request=request,
+ request_body_required=False,
+ request_has_path_params=False,
+ request_has_query_params=True,
+ user_agent_header="user-agent",
+ accept_header_value="application/json",
+ http_headers=http_headers,
+ _globals=operations.ListScimGroupsGlobals(
+ http_referer=self.sdk_configuration.globals.http_referer,
+ x_open_router_title=self.sdk_configuration.globals.x_open_router_title,
+ x_open_router_categories=self.sdk_configuration.globals.x_open_router_categories,
+ ),
+ security=self.sdk_configuration.security,
+ allow_empty_value=None,
+ timeout_ms=timeout_ms,
+ )
+
+ if retries == UNSET:
+ if self.sdk_configuration.retry_config is not UNSET:
+ retries = self.sdk_configuration.retry_config
+ else:
+ retries = utils.RetryConfig(
+ "backoff", utils.BackoffStrategy(500, 60000, 1.5, 3600000), True
+ )
+
+ retry_config = None
+ if isinstance(retries, utils.RetryConfig):
+ retry_config = (retries, ["5XX"])
+
+ http_res = await self.do_request_async(
+ hook_ctx=HookContext(
+ config=self.sdk_configuration,
+ base_url=base_url or "",
+ operation_id="listScimGroups",
+ oauth2_scopes=None,
+ security_source=get_security_from_env(
+ self.sdk_configuration.security, components.Security
+ ),
+ tags=["SCIM"],
+ extensions=None,
+ ),
+ request=req,
+ is_error_status_code=lambda c: utils.match_status_codes(["4XX", "5XX"], c),
+ retry_config=retry_config,
+ )
+
+ def next_func() -> Awaitable[Optional[operations.ListScimGroupsResponse]]:
+ body = utils.unmarshal_json(http_res.text, Union[Dict[Any, Any], List[Any]])
+
+ async def empty_result():
+ return None
+
+ offset = request.offset if isinstance(request.offset, int) else 0
+
+ if not http_res.text:
+ return empty_result()
+ results = JSONPath("$.data").parse(body)
+ if len(results) == 0 or len(results[0]) == 0:
+ return empty_result()
+ limit_ = request.limit if isinstance(request.limit, int) else 50
+ if len(results[0]) < limit_:
+ return empty_result()
+ next_offset = offset + len(results[0])
+
+ return self.list_groups_async(
+ http_referer=http_referer,
+ x_open_router_title=x_open_router_title,
+ x_open_router_categories=x_open_router_categories,
+ offset=next_offset,
+ limit=limit,
+ retries=retries,
+ server_url=server_url,
+ timeout_ms=timeout_ms,
+ http_headers=http_headers,
+ )
+
+ response_data: Any = None
+ if utils.match_response(http_res, "200", "application/json"):
+ return operations.ListScimGroupsResponse(
+ result=unmarshal_json_response(
+ components.ListScimGroupsResponse, http_res
+ ),
+ next=next_func,
+ )
+ if utils.match_response(http_res, "401", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.UnauthorizedResponseErrorData, http_res
+ )
+ raise errors.UnauthorizedResponseError(response_data, http_res)
+ if utils.match_response(http_res, "404", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.NotFoundResponseErrorData, http_res
+ )
+ raise errors.NotFoundResponseError(response_data, http_res)
+ if utils.match_response(http_res, "500", "application/json"):
+ response_data = unmarshal_json_response(
+ errors.InternalServerResponseErrorData, http_res
+ )
+ raise errors.InternalServerResponseError(response_data, http_res)
+ if utils.match_response(http_res, "4XX", "*"):
+ http_res_text = await utils.stream_to_text_async(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+ if utils.match_response(http_res, "5XX", "*"):
+ http_res_text = await utils.stream_to_text_async(http_res)
+ raise errors.OpenRouterDefaultError(
+ "API error occurred", http_res, http_res_text
+ )
+
+ raise errors.OpenRouterDefaultError("Unexpected response received", http_res)
diff --git a/src/openrouter/sdk.py b/src/openrouter/sdk.py
index 9fdcc2fc..3846f887 100644
--- a/src/openrouter/sdk.py
+++ b/src/openrouter/sdk.py
@@ -39,6 +39,7 @@
from openrouter.providers import Providers
from openrouter.rerank import Rerank
from openrouter.responses import Responses
+ from openrouter.scim import Scim
from openrouter.stt import STT
from openrouter.tts import TTS
from openrouter.video_generation import VideoGeneration
@@ -98,6 +99,8 @@ class OpenRouter(BaseSDK):
r"""Rerank endpoints"""
responses: "Responses"
r"""OpenAI-compatible Responses API endpoints"""
+ scim: "Scim"
+ r"""SCIM endpoints"""
video_generation: "VideoGeneration"
r"""Video Generation endpoints"""
workspaces: "Workspaces"
@@ -128,6 +131,7 @@ class OpenRouter(BaseSDK):
"providers": ("openrouter.providers", "Providers"),
"rerank": ("openrouter.rerank", "Rerank"),
"responses": ("openrouter.responses", "Responses"),
+ "scim": ("openrouter.scim", "Scim"),
"video_generation": ("openrouter.video_generation", "VideoGeneration"),
"workspaces": ("openrouter.workspaces", "Workspaces"),
}
diff --git a/uv.lock b/uv.lock
index 26655c82..5f8d70b0 100644
--- a/uv.lock
+++ b/uv.lock
@@ -213,7 +213,7 @@ wheels = [
[[package]]
name = "openrouter"
-version = "1.1.19"
+version = "1.1.20"
source = { editable = "." }
dependencies = [
{ name = "httpcore" },