Skip to content

Releases: openfga/python-sdk

v0.9.9

08 Dec 18:56
v0.9.9
79eaaea

Choose a tag to compare

0.9.9 (2025-12-09)

  • feat: improve error messaging (#245)

What's Changed

Full Changelog: v0.9.8...v0.9.9

v0.9.8

04 Nov 22:25
v0.9.8
0604026

Choose a tag to compare

0.9.8 (2025-11-04)

  • feat: add support for conflict options for Write operations: (#235)
    The client now supports setting ConflictOptions on ClientWriteOptions to control behavior when writing duplicate tuples or deleting non-existent tuples. This feature requires OpenFGA server v1.10.0 or later.
    See Conflict Options for Write Operations for more.
    • on_duplicate for handling duplicate tuple writes (ERROR or IGNORE)
    • on_missing for handling deletes of non-existent tuples (ERROR or IGNORE)

What's Changed

New Contributors

Full Changelog: v0.9.7...v0.9.8

v0.9.7

06 Oct 20:52
v0.9.7
6f06c2f

Choose a tag to compare

0.9.7 (2025-10-06)

  • feat: headers configuration property (#233)
  • fix: per-request custom header precedence (#230)

Full Changelog: v0.9.6...v0.9.7

v0.9.6

16 Sep 20:26
v0.9.6
42cc5cc

Choose a tag to compare

0.9.6 (2025-09-15)

  • fix: reuse ssl context in the sync client (#222) - thanks @wadells!
  • feat: add OAuth2 scopes parameter support to CredentialConfiguration (#213) - thanks @SoulPancake
  • chore: modernize packaging - thanks @abhiaagarwal

Full Changelog

  • chore: update readme import error by @carlastabile in #202
  • Update SECURITY-INSIGHTS by @aaguiarz in #203
  • Potential fix for code scanning alert no. 1: Workflow does not contain permissions by @aaguiarz in #204
  • Potential fix for code scanning alert no. 2: Workflow does not contain permissions by @aaguiarz in #205
  • Potential fix for code scanning alert no. 3: Workflow does not contain permissions by @aaguiarz in #206
  • chore(ci): remove semgrep workflow by @rhamzeh in #208
  • Create scorecard.yml by @aaguiarz in #209
  • ci: update dependabot config by @evansims in #211
  • chore(deps): bump the dependencies group with 3 updates by @dependabot[bot] in #212
  • chore(deps): update dependencies by @evansims in #210
  • feat: add OAuth2 scopes parameter support to CredentialConfiguration by @SoulPancake in #213
  • chore: sync sdk generator changes by @rhamzeh in #221
  • fix: reuse ssl context in the sync client by @rhamzeh in #222
  • chore: move to packaging with pyproject.toml by @rhamzeh in #220
  • release: v0.9.6 by @rhamzeh in #223
  • fix(ci): fix build with uv by @rhamzeh in #225

New Contributors

Full Changelog: v0.9.5...v0.9.6

v0.9.5

10 Jul 00:12
v0.9.5
c87c8d2

Choose a tag to compare

0.9.5 (2025-07-09)

v0.9.4

30 Apr 18:19
v0.9.4
372693e

Choose a tag to compare

0.9.4 (2025-04-30)

  • feat: support List Stores name filter (#181)
  • feat: fix and improve retries and rate limit handling. (#176) - thanks @GMorris-professional
    The SDK now respects the rate limit headers (Retry-After) returned by the server and will retry the request after the specified time.
    If the header is not sent or on network errors, it will fall back to exponential backoff.
  • feat: allow more user customizations for the token issuer (#186) - thanks @manuel-lang
  • fix: ListRelations should not swallow errors (#183)
  • fix: urllib3 compatibility < v2 (#187)

v0.9.3

04 Apr 14:44
v0.9.3
3936955

Choose a tag to compare

0.9.3 (2025-03-26)

  • fix: urllib3 compatibility < v2 (#179)

v0.9.2

25 Mar 15:15
e07ce96

Choose a tag to compare

0.9.2 (2025-03-25)

Fixed:

  • Resolve some bugs with telemetry attributes and metrics tracking #177
  • Resolved the REST client erroneously closing after a stream request is made #172

v0.9.1

24 Jan 17:42
v0.9.1
28945cb

Choose a tag to compare

0.9.1 (2025-01-23)

Added:

  • feat: add /streamed-list-objects endpoint support (#163)
  • feat: add contextual_tuples support for /expand endpoint requests (#164)

v0.9.0

19 Dec 09:09
v0.9.0
6145ea6

Choose a tag to compare

0.9.0 (2024-12-19)

Added:

  • feat: add support for start_time parameter in ReadChanges endpoint (#156) - Note, this feature requires v1.8.0 of OpenFGA or newer
  • feat!: add support for BatchCheck API (#154) - Note, this feature requires v1.8.2 of OpenFGA or newer

Changed:

Warning

Usage of the existing batch_check should now use client_batch_check instead, additionally the existing
BatchCheckResponse has been renamed to ClientBatchCheckClientResponse.

Please see below for how to migrate your code, and #154 for more details on this change.

Migration

"I want to continue using client side batch check"

Given that this necessitates an upgrade of OpenFGA, it might not be feasible for everyone to switch to the new server based method, if you wish to delay the migration, rename the existing usage to the new method name as shown below.

- client.batch_check()
+ client.client_batch_check()

"I want to migrate to the new server based batch check"

If you wish to migrate to the new method, whilst the method name remains the same. You will need to alter the way you construct the checks passed.

  • Previously a list of ClientCheckRequest was constructed and passed directly to batch_check, now you should construct a list of ClientBatchCheckItem and pass a ClientBatchCheckRequest to batch_check with that list as the checks property
    • The correlation_id on a ClientBatchCheckItem is set for you if you do not provide it.
  • The result now contains a correlation_id property in addition to the error and request types and has removed the response property. Additionally, the error property is now of a CheckError type, rather than an Exception type.
checks = [
-  ClientCheckRequest(
+  ClientBatchCheckItem(
        user="user:1",
        relation="owner",
        object="document:0192ab2a-d83f-756d-9397-c5ed9f3cb69a",
        contextual_tuples=[
            ClientTuple(
                user="user:1",
                relation="owner",
                object="document:0192ab2a-d83f-756d-9397-c5ed9f3cb69a",
            )
        ]
    ),
-  ClientCheckRequest(
+  ClientBatchCheckItem(
        user="use:2",
        relation="owner",
        object="document:0192ab2a-d83f-756d-9397-c5ed9f3cb69a"
    )
]

- result = fga_client.client_batch_check(checks)
+ result = fga_client.batch_check(ClientBatchCheckRequest(checks=checks))

# response.result = [{
#   allowed: true,
#   correlation_id: "de3630c2-f9be-4ee5-9441-cb1fbd82ce75", # generated by the SDK
#   tuple: {
#     user: "user:1",
#     relation: "viewer",
#     object: "document:0192ab2a-d83f-756d-9397-c5ed9f3cb69a",
#     contextual_tuples: [{
#       user: "user:1",
#       relation: "editor",
#       object: "document:0192ab2a-d83f-756d-9397-c5ed9f3cb69a"
#     }]
#   }
# }, {
#   allowed: false,
#   correlation_id: "6d7c7129-9607-480e-bfd0-17c16e46b9ec",
#   tuple: {
#     user="user:2",
#     relation="own",
#     object="document:0192ab2a-d83f-756d-9397-c5ed9f3cb69a"
#   },
#   error: {
#     input_error: "validation_error",
#     message: "type 'doc' not found"
#   }
# }]