> For the complete documentation index, see [llms.txt](https://newdocs.keeper.io/en/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://newdocs.keeper.io/en/release-notes/enterprise/keeper-secrets-manager/2026/java-sdk-17.3.0.md).

# Java SDK 17.3.0

> **Breaking changes**
>
> **`KeeperFile.url`:** Changed from `String` to `String?`. Callers treating `url` as non-null must now handle the nullable case; the server can omit this field and the previous behavior was an NPE crash.
>
> **`KeeperRecordData.custom`:** Changed from `MutableList<KeeperRecordField>?` to non-null `MutableList<KeeperRecordField>`. Assigning `null` to this field no longer compiles. Use an empty list instead.
>
> **`KEY_SERVER_PUBIC_KEY_ID` deprecated:** The misspelling published in 17.2.0 is replaced by `KEY_SERVER_PUBLIC_KEY_ID`. The old name is retained as a `@Deprecated` alias for source and bytecode compatibility; the stored config key (`"serverPublicKeyId"`) is unchanged.

* **KSM-878 / KSM-1032:** Added automatic throttle retry with exponential backoff. HTTP 403 throttle responses are retried up to 5 times (11s–176s, ±25% jitter); `retry_after` is honored. Raises `KeeperThrottleException` once retries are exhausted.
* **KSM-1008:** Added typed `KeeperRecordLink` accessors (Python parity): permission booleans (`allowsRotation`, `allowsConnections`, etc. with `allowedSettings` fallback), credential flags, and accessors for AI/JIT settings and metadata.
* **KSM-902:** Added custom server public key support via the `serverPublicKey` config field, a 4-segment one-time token, or `SecretsManagerOptions`. While a custom key is active, server rotation hints raise a clear error instead of silently overwriting it.
* **KSM-1026:** `SecretsManagerException` is now a public `open class`; callers can catch SDK errors by type instead of catching bare `Exception`. `KeeperThrottleException` extends it and is also public.
* **KSM-1072:** Added `dbConnectionMethod` field to `PamSettingsConnection`, matching the field available in other SDKs.
* **KSM-823:** Fixed `KeeperRecordData.custom` being omitted from record create payloads when no custom fields were set; the field now defaults to an empty list.
* **KSM-854:** Fixed a crash when downloading file metadata from records created by iOS, Android, or Web Vault clients; these clients omit `lastModified`, which was previously required by the deserializer.
* **KSM-753:** Fixed shared folder records returning null fields; records encrypted with a folder key (created via Commander or PowerShell) were previously decrypted with the app key.
* **KSM-765:** Fixed an NPE crash when a file's `url` field is absent; `downloadFile()` now throws a typed exception instead.
* **KSM-855:** Fixed file descriptor leaks in `LocalConfigStorage` and connection leaks in `downloadFile`, `uploadFile`, and `postFunction`.
* **KSM-985:** Fixed `base64ToBytes("")` and `webSafe64ToBytes("")` throwing an opaque NPE on empty input; both now raise `SecretsManagerException` naming the affected field.
* **KSM-1066 / KSM-1067:** Fixed IL5 `serverPublicKey` not being persisted to `LocalConfigStorage` after initialization. Also fixed rotation hints from the server silently overwriting a configured custom key.

**Links:**

* [Maven Central package](https://central.sonatype.com/artifact/com.keepersecurity.secrets-manager/core/17.3.0)
* See [Java SDK Documentation](/en/keeperpam/secrets-manager/developer-sdk-library/java-sdk.md)


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://newdocs.keeper.io/en/release-notes/enterprise/keeper-secrets-manager/2026/java-sdk-17.3.0.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
