Skip to content

Commit e63b9af

Browse files
release: 0.2.0 (#2)
Automated Release PR --- ## 0.2.0 (2026-03-16) Full Changelog: [v0.1.0...v0.2.0](v0.1.0...v0.2.0) ### Features * add OAuth2 as alternative auth on management API endpoints ([52c6c27](52c6c27)) * add OAuth2 client credentials security scheme from common spec ([be3f5df](be3f5df)) * add OAuth2 client_credentials auth to SDK config ([40d6e7a](40d6e7a)) * Include `array_format: brackets` settings ([59f0159](59f0159)) * PyPi underscore package name ([3cd5a1e](3cd5a1e)) * support HTTP Basic Auth for service account token endpoint (RFC 6749 2.3.1) ([b9d6db0](b9d6db0)) * update pkg-oapi-common and add OAuth2 security scheme ([4a94884](4a94884)) ### Bug Fixes * **tests:** correct setup of OAuth 2 Client Credentials tests ([fe2b8ba](fe2b8ba)) ### Chores * hide unstable mcp features from api documentation ([0fd55ba](0fd55ba)) ### Documentation * remove MCP endpoints ([06fb1fd](06fb1fd)) --- This pull request is managed by Stainless's [GitHub App](https://github.com/apps/stainless-app). The [semver version number](https://semver.org/#semantic-versioning-specification-semver) is based on included [commit messages](https://www.conventionalcommits.org/en/v1.0.0/). Alternatively, you can manually set the version number in the title of this pull request. For a better experience, it is recommended to use either rebase-merge or squash-merge when merging this pull request. 🔗 Stainless [website](https://www.stainlessapi.com) 📚 Read the [docs](https://app.stainlessapi.com/docs) 🙋 [Reach out](mailto:support@stainlessapi.com) for help or questions --------- Co-authored-by: stainless-app[bot] <142633134+stainless-app[bot]@users.noreply.github.com>
1 parent bf883cf commit e63b9af

80 files changed

Lines changed: 8947 additions & 1405 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.release-please-manifest.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
{
2-
".": "0.1.0"
2+
".": "0.2.0"
33
}

.stats.yml

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
configured_endpoints: 87
2-
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/keycard%2Fkeycard-api-5092d9d6393b940b63aecc5d9ba44f85c79c01cd926978c09c62450ee5f7c269.yml
3-
openapi_spec_hash: 6d95ae31ee4a688394df9e89b766a53f
4-
config_hash: 68c59785c54c03969ea8163e835c3402
1+
configured_endpoints: 107
2+
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/keycard%2Fkeycard-api-d3d69f45bfeddbd210e86edb90a843d195ba38d3b8636915400f26bd10882b95.yml
3+
openapi_spec_hash: 3bb1233f309a042f4fe90d9e32a81a3d
4+
config_hash: 99a124cc01ffd9a67759ccbc360af24a

CHANGELOG.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,34 @@
11
# Changelog
22

3+
## 0.2.0 (2026-03-16)
4+
5+
Full Changelog: [v0.1.0...v0.2.0](https://github.com/keycardai/keycard-python/compare/v0.1.0...v0.2.0)
6+
7+
### Features
8+
9+
* add OAuth2 as alternative auth on management API endpoints ([52c6c27](https://github.com/keycardai/keycard-python/commit/52c6c27bb85b2f07f5ead2490ab902fef4816dca))
10+
* add OAuth2 client credentials security scheme from common spec ([be3f5df](https://github.com/keycardai/keycard-python/commit/be3f5df50f9f6434ab8836c06adeda99c9f514d4))
11+
* add OAuth2 client_credentials auth to SDK config ([40d6e7a](https://github.com/keycardai/keycard-python/commit/40d6e7a713f518df3653430ed7cee25b2db79140))
12+
* Include `array_format: brackets` settings ([59f0159](https://github.com/keycardai/keycard-python/commit/59f0159a9a84d4a89b219faf4e7ac67556c22392))
13+
* PyPi underscore package name ([3cd5a1e](https://github.com/keycardai/keycard-python/commit/3cd5a1e6bd8684f86efb5d77249cd950848631fe))
14+
* support HTTP Basic Auth for service account token endpoint (RFC 6749 2.3.1) ([b9d6db0](https://github.com/keycardai/keycard-python/commit/b9d6db00b5388ae7b8872c6f5f4345cb132edb56))
15+
* update pkg-oapi-common and add OAuth2 security scheme ([4a94884](https://github.com/keycardai/keycard-python/commit/4a9488474597b923dac403292e207ba0d8487754))
16+
17+
18+
### Bug Fixes
19+
20+
* **tests:** correct setup of OAuth 2 Client Credentials tests ([fe2b8ba](https://github.com/keycardai/keycard-python/commit/fe2b8ba8b7867cc86942b5306bb8cb31f5d469ac))
21+
22+
23+
### Chores
24+
25+
* hide unstable mcp features from api documentation ([0fd55ba](https://github.com/keycardai/keycard-python/commit/0fd55ba2f11a5ad75e6c13702a060853a209156c))
26+
27+
28+
### Documentation
29+
30+
* remove MCP endpoints ([06fb1fd](https://github.com/keycardai/keycard-python/commit/06fb1fdec007a642eac2debbc11acdef112635c1))
31+
332
## 0.1.0 (2026-03-10)
433

534
Full Changelog: [v0.0.1...v0.1.0](https://github.com/keycardai/keycard-python/compare/v0.0.1...v0.1.0)

README.md

Lines changed: 5 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Keycard API Python API library
22

33
<!-- prettier-ignore -->
4-
[![PyPI version](https://img.shields.io/pypi/v/keycardai-api.svg?label=pypi%20(stable))](https://pypi.org/project/keycardai-api/)
4+
[![PyPI version](https://img.shields.io/pypi/v/keycardai_api.svg?label=pypi%20(stable))](https://pypi.org/project/keycardai_api/)
55

66
The Keycard API Python library provides convenient access to the Keycard API REST API from any Python 3.9+
77
application. The library includes type definitions for all request params and response fields,
@@ -17,42 +17,31 @@ The REST API documentation can be found on [docs.keycard.ai](https://docs.keycar
1717

1818
```sh
1919
# install from PyPI
20-
pip install keycardai-api
20+
pip install keycardai_api
2121
```
2222

2323
## Usage
2424

2525
The full API of this library can be found in [api.md](api.md).
2626

2727
```python
28-
import os
2928
from keycardai_api import KeycardAPI
3029

31-
client = KeycardAPI(
32-
api_key=os.environ.get("KEYCARD_API_API_KEY"), # This is the default and can be omitted
33-
)
30+
client = KeycardAPI()
3431

3532
zones = client.zones.list()
3633
print(zones.items)
3734
```
3835

39-
While you can provide an `api_key` keyword argument,
40-
we recommend using [python-dotenv](https://pypi.org/project/python-dotenv/)
41-
to add `KEYCARD_API_API_KEY="My API Key"` to your `.env` file
42-
so that your API Key is not stored in source control.
43-
4436
## Async usage
4537

4638
Simply import `AsyncKeycardAPI` instead of `KeycardAPI` and use `await` with each API call:
4739

4840
```python
49-
import os
5041
import asyncio
5142
from keycardai_api import AsyncKeycardAPI
5243

53-
client = AsyncKeycardAPI(
54-
api_key=os.environ.get("KEYCARD_API_API_KEY"), # This is the default and can be omitted
55-
)
44+
client = AsyncKeycardAPI()
5645

5746

5847
async def main() -> None:
@@ -73,21 +62,19 @@ You can enable this by installing `aiohttp`:
7362

7463
```sh
7564
# install from PyPI
76-
pip install keycardai-api[aiohttp]
65+
pip install keycardai_api[aiohttp]
7766
```
7867

7968
Then you can enable it by instantiating the client with `http_client=DefaultAioHttpClient()`:
8069

8170
```python
82-
import os
8371
import asyncio
8472
from keycardai_api import DefaultAioHttpClient
8573
from keycardai_api import AsyncKeycardAPI
8674

8775

8876
async def main() -> None:
8977
async with AsyncKeycardAPI(
90-
api_key=os.environ.get("KEYCARD_API_API_KEY"), # This is the default and can be omitted
9178
http_client=DefaultAioHttpClient(),
9279
) as client:
9380
zones = await client.zones.list()

api.md

Lines changed: 95 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ Methods:
1919
- <code title="patch /zones/{zoneId}">client.zones.<a href="./src/keycardai_api/resources/zones/zones.py">update</a>(zone_id, \*\*<a href="src/keycardai_api/types/zone_update_params.py">params</a>) -> <a href="./src/keycardai_api/types/zone.py">Zone</a></code>
2020
- <code title="get /zones">client.zones.<a href="./src/keycardai_api/resources/zones/zones.py">list</a>(\*\*<a href="src/keycardai_api/types/zone_list_params.py">params</a>) -> <a href="./src/keycardai_api/types/zone_list_response.py">ZoneListResponse</a></code>
2121
- <code title="delete /zones/{zoneId}">client.zones.<a href="./src/keycardai_api/resources/zones/zones.py">delete</a>(zone_id) -> None</code>
22-
- <code title="delete /zones/{zoneId}/mcp-servers/{downstreamId}">client.zones.<a href="./src/keycardai_api/resources/zones/zones.py">delete_mcp_server</a>(downstream_id, \*, zone_id) -> None</code>
2322
- <code title="get /zones/{zoneId}/session-resource-access">client.zones.<a href="./src/keycardai_api/resources/zones/zones.py">list_session_resource_access</a>(zone_id, \*\*<a href="src/keycardai_api/types/zone_list_session_resource_access_params.py">params</a>) -> <a href="./src/keycardai_api/types/zone_list_session_resource_access_response.py">ZoneListSessionResourceAccessResponse</a></code>
2423

2524
## Applications
@@ -104,18 +103,6 @@ Methods:
104103
- <code title="get /zones/{zoneId}/delegated-grants">client.zones.delegated_grants.<a href="./src/keycardai_api/resources/zones/delegated_grants.py">list</a>(zone_id, \*\*<a href="src/keycardai_api/types/zones/delegated_grant_list_params.py">params</a>) -> <a href="./src/keycardai_api/types/zones/delegated_grant_list_response.py">DelegatedGrantListResponse</a></code>
105104
- <code title="delete /zones/{zoneId}/delegated-grants/{id}">client.zones.delegated_grants.<a href="./src/keycardai_api/resources/zones/delegated_grants.py">delete</a>(id, \*, zone_id) -> None</code>
106105

107-
## McpGateways
108-
109-
Types:
110-
111-
```python
112-
from keycardai_api.types.zones import McpGatewayCreateMcpServerResponse
113-
```
114-
115-
Methods:
116-
117-
- <code title="post /zones/{zoneId}/mcp-gateways/{applicationId}/mcp-servers">client.zones.mcp_gateways.<a href="./src/keycardai_api/resources/zones/mcp_gateways.py">create_mcp_server</a>(application_id, \*, zone_id, \*\*<a href="src/keycardai_api/types/zones/mcp_gateway_create_mcp_server_params.py">params</a>) -> <a href="./src/keycardai_api/types/zones/mcp_gateway_create_mcp_server_response.py">McpGatewayCreateMcpServerResponse</a></code>
118-
119106
## Providers
120107

121108
Types:
@@ -227,6 +214,101 @@ Methods:
227214
- <code title="get /zones/{zone_id}/secrets">client.zones.secrets.<a href="./src/keycardai_api/resources/zones/secrets.py">list</a>(zone_id, \*\*<a href="src/keycardai_api/types/zones/secret_list_params.py">params</a>) -> <a href="./src/keycardai_api/types/zones/secret_list_response.py">SecretListResponse</a></code>
228215
- <code title="delete /zones/{zone_id}/secrets/{id}">client.zones.secrets.<a href="./src/keycardai_api/resources/zones/secrets.py">delete</a>(id, \*, zone_id) -> None</code>
229216

217+
## PolicySchemas
218+
219+
Types:
220+
221+
```python
222+
from keycardai_api.types.zones import (
223+
SchemaVersion,
224+
SchemaVersionWithZoneInfo,
225+
PolicySchemaListResponse,
226+
)
227+
```
228+
229+
Methods:
230+
231+
- <code title="get /zones/{zone_id}/policy-schemas/{version}">client.zones.policy_schemas.<a href="./src/keycardai_api/resources/zones/policy_schemas.py">retrieve</a>(version, \*, zone_id, \*\*<a href="src/keycardai_api/types/zones/policy_schema_retrieve_params.py">params</a>) -> <a href="./src/keycardai_api/types/zones/schema_version_with_zone_info.py">SchemaVersionWithZoneInfo</a></code>
232+
- <code title="get /zones/{zone_id}/policy-schemas">client.zones.policy_schemas.<a href="./src/keycardai_api/resources/zones/policy_schemas.py">list</a>(zone_id, \*\*<a href="src/keycardai_api/types/zones/policy_schema_list_params.py">params</a>) -> <a href="./src/keycardai_api/types/zones/policy_schema_list_response.py">PolicySchemaListResponse</a></code>
233+
- <code title="patch /zones/{zone_id}/policy-schemas/{version}">client.zones.policy_schemas.<a href="./src/keycardai_api/resources/zones/policy_schemas.py">set_default</a>(version, \*, zone_id, \*\*<a href="src/keycardai_api/types/zones/policy_schema_set_default_params.py">params</a>) -> <a href="./src/keycardai_api/types/zones/schema_version_with_zone_info.py">SchemaVersionWithZoneInfo</a></code>
234+
235+
## Policies
236+
237+
Types:
238+
239+
```python
240+
from keycardai_api.types.zones import Policy, PolicyDraft, PolicyListResponse
241+
```
242+
243+
Methods:
244+
245+
- <code title="post /zones/{zone_id}/policies">client.zones.policies.<a href="./src/keycardai_api/resources/zones/policies/policies.py">create</a>(zone_id, \*\*<a href="src/keycardai_api/types/zones/policy_create_params.py">params</a>) -> <a href="./src/keycardai_api/types/zones/policy.py">Policy</a></code>
246+
- <code title="get /zones/{zone_id}/policies/{policy_id}">client.zones.policies.<a href="./src/keycardai_api/resources/zones/policies/policies.py">retrieve</a>(policy_id, \*, zone_id) -> <a href="./src/keycardai_api/types/zones/policy.py">Policy</a></code>
247+
- <code title="patch /zones/{zone_id}/policies/{policy_id}">client.zones.policies.<a href="./src/keycardai_api/resources/zones/policies/policies.py">update</a>(policy_id, \*, zone_id, \*\*<a href="src/keycardai_api/types/zones/policy_update_params.py">params</a>) -> <a href="./src/keycardai_api/types/zones/policy.py">Policy</a></code>
248+
- <code title="get /zones/{zone_id}/policies">client.zones.policies.<a href="./src/keycardai_api/resources/zones/policies/policies.py">list</a>(zone_id, \*\*<a href="src/keycardai_api/types/zones/policy_list_params.py">params</a>) -> <a href="./src/keycardai_api/types/zones/policy_list_response.py">PolicyListResponse</a></code>
249+
- <code title="delete /zones/{zone_id}/policies/{policy_id}">client.zones.policies.<a href="./src/keycardai_api/resources/zones/policies/policies.py">archive</a>(policy_id, \*, zone_id) -> <a href="./src/keycardai_api/types/zones/policy.py">Policy</a></code>
250+
251+
### Versions
252+
253+
Types:
254+
255+
```python
256+
from keycardai_api.types.zones.policies import PolicyVersion, VersionListResponse
257+
```
258+
259+
Methods:
260+
261+
- <code title="post /zones/{zone_id}/policies/{policy_id}/versions">client.zones.policies.versions.<a href="./src/keycardai_api/resources/zones/policies/versions.py">create</a>(policy_id, \*, zone_id, \*\*<a href="src/keycardai_api/types/zones/policies/version_create_params.py">params</a>) -> <a href="./src/keycardai_api/types/zones/policies/policy_version.py">PolicyVersion</a></code>
262+
- <code title="get /zones/{zone_id}/policies/{policy_id}/versions/{version_id}">client.zones.policies.versions.<a href="./src/keycardai_api/resources/zones/policies/versions.py">retrieve</a>(version_id, \*, zone_id, policy_id, \*\*<a href="src/keycardai_api/types/zones/policies/version_retrieve_params.py">params</a>) -> <a href="./src/keycardai_api/types/zones/policies/policy_version.py">PolicyVersion</a></code>
263+
- <code title="get /zones/{zone_id}/policies/{policy_id}/versions">client.zones.policies.versions.<a href="./src/keycardai_api/resources/zones/policies/versions.py">list</a>(policy_id, \*, zone_id, \*\*<a href="src/keycardai_api/types/zones/policies/version_list_params.py">params</a>) -> <a href="./src/keycardai_api/types/zones/policies/version_list_response.py">VersionListResponse</a></code>
264+
- <code title="delete /zones/{zone_id}/policies/{policy_id}/versions/{version_id}">client.zones.policies.versions.<a href="./src/keycardai_api/resources/zones/policies/versions.py">archive</a>(version_id, \*, zone_id, policy_id) -> <a href="./src/keycardai_api/types/zones/policies/policy_version.py">PolicyVersion</a></code>
265+
266+
## PolicySets
267+
268+
Types:
269+
270+
```python
271+
from keycardai_api.types.zones import (
272+
Attestation,
273+
AttestationStatement,
274+
PolicySet,
275+
PolicySetDraft,
276+
PolicySetManifest,
277+
PolicySetManifestEntry,
278+
PolicySetWithBinding,
279+
PolicySetListResponse,
280+
)
281+
```
282+
283+
Methods:
284+
285+
- <code title="post /zones/{zone_id}/policy-sets">client.zones.policy_sets.<a href="./src/keycardai_api/resources/zones/policy_sets/policy_sets.py">create</a>(zone_id, \*\*<a href="src/keycardai_api/types/zones/policy_set_create_params.py">params</a>) -> <a href="./src/keycardai_api/types/zones/policy_set_with_binding.py">PolicySetWithBinding</a></code>
286+
- <code title="get /zones/{zone_id}/policy-sets/{policy_set_id}">client.zones.policy_sets.<a href="./src/keycardai_api/resources/zones/policy_sets/policy_sets.py">retrieve</a>(policy_set_id, \*, zone_id) -> <a href="./src/keycardai_api/types/zones/policy_set_with_binding.py">PolicySetWithBinding</a></code>
287+
- <code title="patch /zones/{zone_id}/policy-sets/{policy_set_id}">client.zones.policy_sets.<a href="./src/keycardai_api/resources/zones/policy_sets/policy_sets.py">update</a>(policy_set_id, \*, zone_id, \*\*<a href="src/keycardai_api/types/zones/policy_set_update_params.py">params</a>) -> <a href="./src/keycardai_api/types/zones/policy_set_with_binding.py">PolicySetWithBinding</a></code>
288+
- <code title="get /zones/{zone_id}/policy-sets">client.zones.policy_sets.<a href="./src/keycardai_api/resources/zones/policy_sets/policy_sets.py">list</a>(zone_id, \*\*<a href="src/keycardai_api/types/zones/policy_set_list_params.py">params</a>) -> <a href="./src/keycardai_api/types/zones/policy_set_list_response.py">PolicySetListResponse</a></code>
289+
- <code title="delete /zones/{zone_id}/policy-sets/{policy_set_id}">client.zones.policy_sets.<a href="./src/keycardai_api/resources/zones/policy_sets/policy_sets.py">archive</a>(policy_set_id, \*, zone_id) -> <a href="./src/keycardai_api/types/zones/policy_set_with_binding.py">PolicySetWithBinding</a></code>
290+
291+
### Versions
292+
293+
Types:
294+
295+
```python
296+
from keycardai_api.types.zones.policy_sets import (
297+
PolicySetVersion,
298+
VersionListResponse,
299+
VersionListPoliciesResponse,
300+
)
301+
```
302+
303+
Methods:
304+
305+
- <code title="post /zones/{zone_id}/policy-sets/{policy_set_id}/versions">client.zones.policy_sets.versions.<a href="./src/keycardai_api/resources/zones/policy_sets/versions.py">create</a>(policy_set_id, \*, zone_id, \*\*<a href="src/keycardai_api/types/zones/policy_sets/version_create_params.py">params</a>) -> <a href="./src/keycardai_api/types/zones/policy_sets/policy_set_version.py">PolicySetVersion</a></code>
306+
- <code title="get /zones/{zone_id}/policy-sets/{policy_set_id}/versions/{version_id}">client.zones.policy_sets.versions.<a href="./src/keycardai_api/resources/zones/policy_sets/versions.py">retrieve</a>(version_id, \*, zone_id, policy_set_id) -> <a href="./src/keycardai_api/types/zones/policy_sets/policy_set_version.py">PolicySetVersion</a></code>
307+
- <code title="patch /zones/{zone_id}/policy-sets/{policy_set_id}/versions/{version_id}">client.zones.policy_sets.versions.<a href="./src/keycardai_api/resources/zones/policy_sets/versions.py">update</a>(version_id, \*, zone_id, policy_set_id, \*\*<a href="src/keycardai_api/types/zones/policy_sets/version_update_params.py">params</a>) -> <a href="./src/keycardai_api/types/zones/policy_sets/policy_set_version.py">PolicySetVersion</a></code>
308+
- <code title="get /zones/{zone_id}/policy-sets/{policy_set_id}/versions">client.zones.policy_sets.versions.<a href="./src/keycardai_api/resources/zones/policy_sets/versions.py">list</a>(policy_set_id, \*, zone_id, \*\*<a href="src/keycardai_api/types/zones/policy_sets/version_list_params.py">params</a>) -> <a href="./src/keycardai_api/types/zones/policy_sets/version_list_response.py">VersionListResponse</a></code>
309+
- <code title="delete /zones/{zone_id}/policy-sets/{policy_set_id}/versions/{version_id}">client.zones.policy_sets.versions.<a href="./src/keycardai_api/resources/zones/policy_sets/versions.py">archive</a>(version_id, \*, zone_id, policy_set_id) -> <a href="./src/keycardai_api/types/zones/policy_sets/policy_set_version.py">PolicySetVersion</a></code>
310+
- <code title="get /zones/{zone_id}/policy-sets/{policy_set_id}/versions/{version_id}/policies">client.zones.policy_sets.versions.<a href="./src/keycardai_api/resources/zones/policy_sets/versions.py">list_policies</a>(version_id, \*, zone_id, policy_set_id, \*\*<a href="src/keycardai_api/types/zones/policy_sets/version_list_policies_params.py">params</a>) -> <a href="./src/keycardai_api/types/zones/policy_sets/version_list_policies_response.py">VersionListPoliciesResponse</a></code>
311+
230312
# Organizations
231313

232314
Types:
@@ -338,12 +420,6 @@ Methods:
338420
- <code title="delete /organizations/{organization_id}/sso-connection">client.organizations.sso_connection.<a href="./src/keycardai_api/resources/organizations/sso_connection.py">disable</a>(organization_id) -> None</code>
339421
- <code title="post /organizations/{organization_id}/sso-connection">client.organizations.sso_connection.<a href="./src/keycardai_api/resources/organizations/sso_connection.py">enable</a>(organization_id, \*\*<a href="src/keycardai_api/types/organizations/sso_connection_enable_params.py">params</a>) -> <a href="./src/keycardai_api/types/organizations/sso_connection.py">SSOConnection</a></code>
340422

341-
# ServiceAccountToken
342-
343-
Methods:
344-
345-
- <code title="post /service-account-token">client.service_account_token.<a href="./src/keycardai_api/resources/service_account_token.py">create</a>(\*\*<a href="src/keycardai_api/types/service_account_token_create_params.py">params</a>) -> <a href="./src/keycardai_api/types/token_response.py">TokenResponse</a></code>
346-
347423
# Invitations
348424

349425
Types:

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
2-
name = "keycardai-api"
3-
version = "0.1.0"
2+
name = "keycardai_api"
3+
version = "0.2.0"
44
description = "The official Python library for the keycard-api API"
55
dynamic = ["readme"]
66
license = "Apache-2.0"

0 commit comments

Comments
 (0)