Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
48 commits
Select commit Hold shift + click to select a range
e2c53d3
fix (HttpClientApache): define headers to be added as volatile for mu…
JPPortier May 4, 2026
690575d
fix (HttpClientApache): Use 'try with resource' scanner to avoid poss…
JPPortier May 4, 2026
2a59bff
fix (SinchClient): prevent exception in case of using AUXILIARY_FLAG …
JPPortier May 4, 2026
4facb28
fix: correct conversationContext label in Configuration.toString()
Copilot May 5, 2026
87b32d0
feat (Snippets): Fix typos
JPPortier May 12, 2026
6c380bd
Potential fix for pull request finding
JPPortier May 13, 2026
c337f25
doc: CHANGELOG update
JPPortier May 26, 2026
eabdc8a
feat (pagination): Support requets builder for pagination based onto …
JPPortier May 26, 2026
66e77c3
Merge pull request #342 from sinch/jpportier/DEVEXP-1378-small-fixes
edu-sinch May 26, 2026
96a7944
CI: Update CODEOWNERS
JPPortier May 27, 2026
4c71fd0
Merge pull request #345 from sinch/jpportier/CODEOWNERS-update
JPPortier May 27, 2026
c7ab2e6
Merge pull request #340 from sinch/jpportier/DEVEXP-1224-consent-mana…
JPPortier May 27, 2026
17389fb
DEVEXP-1378: auto close (#346)
JPPortier May 27, 2026
d73c013
NumberLookup Api V2 implementation (#348)
edu-sinch Jun 8, 2026
da8b6c7
Merge branch 'main' into feat/2.1-next
JPPortier Jun 8, 2026
5ec550b
Add NumberLookup API v2 snippet (#349)
edu-sinch Jun 12, 2026
0824c82
Added workflow to publish generated documentation on Sinch for develo…
edu-sinch Jun 12, 2026
0703af6
Merge pull request #350 from sinch/edu-sinch/DEVEXP-1330-PublishGener…
edu-sinch Jun 12, 2026
dcf44cc
Voice: use SvamlControlPatch for updateCall and manageCallWithCallLeg
edu-sinch Jun 16, 2026
b857f9d
Updated references to SvamlPatch in the snippets
edu-sinch Jun 16, 2026
b9bb6ae
Refactor e2e tests for list responses
edu-sinch Jun 16, 2026
45e3ed9
Refactor e2e tests for parallel execution with JUnit 5 Cucumber
edu-sinch Jun 17, 2026
e449cb6
Removed dead code for parallelism into the pom.xml file
edu-sinch Jun 17, 2026
3699415
Merge pull request #351 from sinch/edu-sinch/DEVEXP-1375-RefactorE2Et…
edu-sinch Jun 18, 2026
14c14f8
Voice: updated sources and references for tests and snippet files
edu-sinch Jun 18, 2026
896879d
Voice: rename SvamlActionPatch to ManagedCallSvamlAction, generated s…
edu-sinch Jun 19, 2026
25dbc2b
Merge pull request #352 from sinch/edu-sinch/DEVEXP-1408-VoiceRestric…
edu-sinch Jun 19, 2026
538b447
Feature/merge v2.1 next with main (#354)
marcos-sinch Jun 24, 2026
231d306
New generated Java Number sources and test coverage for internalFailu…
edu-sinch Jun 25, 2026
d2bb03b
New generated Java Conversation sources
edu-sinch Jun 26, 2026
8c73ec1
Removed create time and update time fields from tests
edu-sinch Jun 29, 2026
76f6328
Added CHANGELOG for new field internalFailurecode and added field int…
edu-sinch Jun 30, 2026
75abf97
Improved CHANGELOG
edu-sinch Jun 30, 2026
6a1ebb3
Fixed CHANGELOG
edu-sinch Jun 30, 2026
5263d86
Merge pull request #355 from sinch/edu-sinch/DEVEXP-1442-OAS-Synchro-…
edu-sinch Jun 30, 2026
7390338
Added request and response dedicated Dto tests
edu-sinch Jun 30, 2026
4fe258b
Merge pull request #356 from sinch/edu-sinch/DEVEXP-1445-OAS-Synchro-…
edu-sinch Jul 1, 2026
c8b0e2a
DEVEXP-1378: feat (HttpClient): Support proxy usage (#357)
JPPortier Jul 1, 2026
cb538a5
Added Number Lookup to CHANGELOG for Java release v2.1
edu-sinch Jul 2, 2026
f1cf9d9
Merge pull request #358 from sinch/edu-sinch/DEVEXP-1425-UpdateChangeLog
edu-sinch Jul 2, 2026
5bce6c3
Merge branch 'main' into feat/2.1-next
edu-sinch Jul 2, 2026
c009bba
chore: Bump sonatype plugin version to '0.11.0'
JPPortier Jul 2, 2026
7d9c28a
Merge pull request #359 from sinch/jpportier/update-release-plugin-ve…
JPPortier Jul 2, 2026
b8d58bc
build (release): Bump version to 2.1.0 for sources
invalid-email-address Jul 2, 2026
9693456
[release] Set release & tag: 2.1.0
invalid-email-address Jul 2, 2026
cf32bc9
[release] Set next version: 2.2.0-SNAPSHOT
invalid-email-address Jul 2, 2026
ebe3e05
build (release): Set next version to 2.2.0-dev for sources
invalid-email-address Jul 2, 2026
8b8fc8f
Update CHANGELOG for v2.1 release
JPPortier Jul 2, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/CODEOWNERS
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
# https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/about-code-owners
* @asein-sinch @JPPortier @matsk-sinch @rpredescu-sinch @edu-sinch @Hurus111
* @asein-sinch @JPPortier @matsk-sinch @edu-sinch @Hurus111 @marcos-sinch
78 changes: 78 additions & 0 deletions .github/workflows/generate-upload-documentation.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,78 @@
name: Generate and upload documentation

on:
release:
types: [published]
workflow_dispatch:
inputs:
version:
description: 'Version to use for the documentation package in semver format (e.g. 1.2.3)'
required: true

jobs:
upload-documentation:
runs-on: ubuntu-latest
env:
SDK_NAME: sinch-sdk-java

steps:
- name: Checkout Code
uses: actions/checkout@v4

- name: Resolve Version
id: version
run: |
if [ "${{ github.event_name }}" = "release" ]; then
VERSION="${{ github.event.release.tag_name }}"
else
VERSION="${{ inputs.version }}"
fi
# Strip leading 'v' if present (e.g. v1.2.3 → 1.2.3)
VERSION="${VERSION#v}"
echo "value=${VERSION}" >> "$GITHUB_OUTPUT"

- name: Validate Version Format
run: |
VERSION="${{ steps.version.outputs.value }}"
SEMVER_REGEX='^(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)\.(0|[1-9][0-9]*)(-((alpha|beta|preview)(\.[0-9]+)?))?$'
if [[ ! "$VERSION" =~ $SEMVER_REGEX ]]; then
echo "::error::Invalid version format: '$VERSION'. Expected semver (e.g. 1.2.3, 1.2.3-alpha, 1.2.3-beta.1, 1.2.3-preview)"
exit 1
fi
echo "Version '$VERSION' is valid"

- name: Setup Java SDK
uses: actions/setup-java@v4
with:
java-version: '21'
distribution: 'temurin'
cache: maven

- name: Generate Documentation
run: mvn -B javadoc:javadoc --file pom.xml

- name: Package Documentation
run: |
cd target/site/apidocs
zip -r "../../../${{ env.SDK_NAME }}-${{ steps.version.outputs.value }}.zip" .

- name: Upload to GitLab Registry
run: |
echo "Uploading documentation package to GitLab Registry..."
VERSION="${{ steps.version.outputs.value }}"
curl --fail --show-error --location --header "PRIVATE-TOKEN: ${{ secrets.GITLAB_REGISTRY_UPLOAD_DOC_TOKEN }}" \
--upload-file "./${{ env.SDK_NAME }}-${VERSION}.zip" \
"https://gitlab.com/api/v4/projects/63164411/packages/generic/${{ env.SDK_NAME }}/${VERSION}/${{ env.SDK_NAME }}-${VERSION}.zip"
echo "Documentation package for version ${VERSION} uploaded to GitLab Registry"

- name: Trigger Downstream GitLab Pipeline
run: |
echo "Triggering downstream GitLab pipeline to notify about new documentation package version..."
VERSION="${{ steps.version.outputs.value }}"
curl --fail --show-error --location --request POST \
--form "token=${{ secrets.GITLAB_NOTIFY_REGISTRY_UPLOADED_DOC_TOKEN }}" \
--form "ref=main" \
--form "variables[UPSTREAM_PACKAGE_NAME]=${{ env.SDK_NAME }}" \
--form "variables[UPSTREAM_PACKAGE_VERSION]=${VERSION}" \
"https://gitlab.com/api/v4/projects/63164411/trigger/pipeline"
echo "Documentation repo notified about new package version ${VERSION}"
30 changes: 30 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,36 @@ All notable changes to the **Sinch Java SDK** are documented in this file.

---

## v2.1 – 2026-07-02

### Numbers
- Extend `NumberSinchEvents` class.
- **[fix]** `EventTypeEnum`: `DEPROVISIONING_TO_VOICE_PLATFORM` is deprecated and has to be replaced by `DEPROVISIONING_FROM_VOICE_PLATFORM`.
- **[feature]** Support new `internalFailureCode` field.
- **[feature]** Support new `StatusEnum` values: `IN_REVIEW`, `BLOCKED`, `COMPLETED`, `REJECTED`, `EXPIRED`.
- **[feature]** Support new `EventTypeEnum` value: `NUMBER_ORDER_PROCESSING`.

### Conversation
- **[feature]** Support `Consents` API: `listIdentities` and `listAuditRecords` endpoints

### Number Lookup
- **[feature]** Support `Number Lookup` API V2

### SDK
- **[feature]** HTTP proxy support: configure an unauthenticated or authenticated (Basic) proxy via `HttpProxyConfiguration`
- **[feature]** `SinchClient` exposes a `close()` method to shut down the underlying HTTP connection pool and release all associated resources deterministically
- **[fix]** `HttpClientApache`: declare now `headersToBeAdded` as `volatile` to guarantee visibility across threads in concurrent usage
- **[fix]** `HttpClientApache`: wrap response-body `Scanner` in a try-with-resources block to prevent resource leaks; gracefully handle empty (`null`) response entities
- **[fix]** `SinchClient`: guard against a `NullPointerException` when `java.vendor` system property is absent while building the `User-Agent` auxiliary flag
- **[fix]** `Configuration`: correct copy-paste error in `toString()` and Javadoc — `conversationContext` label was incorrectly attributed to the Voice domain
- **[doc]** Improve README structure and content.


### Examples / Snippets
- **[doc]** Fix typos in `conversation/conversations/Create` and `voice/applications/GetEventDestinations` snippets

---

## v2.0 – 2026-03-31

### Major breaking changes with major release
Expand Down
66 changes: 60 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ For more information on the SDK, refer to the dedicated [Java SDK documentation
- [Getting started](#getting-started)
- [Logging](#logging)
- [Handling Exceptions](#handling-exceptions)
- [Proxy configuration](#proxy-configuration)
- [Third-party dependencies](#third-party-dependencies)
- [Examples](#examples)
- [Changelog and Migration](#changelog--migration)
Expand Down Expand Up @@ -61,6 +62,7 @@ Note: The `${sdk.version}` needs to be set according to the released version to
| Voice and Video | [Voice API](https://developers.sinch.com/docs/voice/) |
| Numbers | [Numbers API](https://developers.sinch.com/docs/numbers/) |
| Verification | [Verification API](https://developers.sinch.com/docs/verification/) |
| | [Number Lookup API](https://developers.sinch.com/docs/number-lookup/) |

> **Note:** The SMS API is end-of-sale. New integrations should use the [Conversation API](https://developers.sinch.com/docs/conversation/) instead, which supports SMS and many other channels.

Expand Down Expand Up @@ -226,6 +228,10 @@ NumberSinchEvent event = sinchEvents.parseEvent(body);

You can find a complete example in [examples/sinch-events](examples/sinch-events).

### Number Lookup API

The Number Lookup API needs no extra parameters, use the [common client](#client-initialization) shown above.

### Verification API

The Verification API uses application credentials. Set `applicationKey` and `applicationSecret`, both available on the [Apps dashboard](https://dashboard.sinch.com/verification/apps):
Expand Down Expand Up @@ -392,6 +398,54 @@ try {
- `ApiAuthException`: authentication/authorization failures.
- `ApiMappingException`: the response payload could not be deserialized into the expected type.

## Proxy configuration

If your network environment routes outbound traffic through an HTTP proxy, provide proxy
configuration via [HttpProxyConfiguration](client/src/main/com/sinch/sdk/models/HttpProxyConfiguration.java) on the [Configuration](client/src/main/com/sinch/sdk/models/Configuration.java) builder.

When used, all connections will go through the proxy (including OAuth).

**Unauthenticated proxy:**

```java
import com.sinch.sdk.SinchClient;
import com.sinch.sdk.models.Configuration;
import com.sinch.sdk.models.HttpProxyConfiguration;

...
Configuration configuration = Configuration.builder()
.setKeyId(PARAM_KEY_ID)
.setKeySecret(PARAM_KEY_SECRET)
.setProjectId(PARAM_PROJECT_ID)
.setHttpProxyConfiguration(
HttpProxyConfiguration.builder()
.setHostname(PARAM_PROXY_HOSTNAME)
.setPort(PARAM_PROXY_PORT)
.build())
.build();
SinchClient client = new SinchClient(configuration);
```

**Authenticated proxy:**


```java
Configuration configuration = Configuration.builder()
.setKeyId(PARAM_KEY_ID)
.setKeySecret(PARAM_KEY_SECRET)
.setProjectId(PARAM_PROJECT_ID)
.setHttpProxyConfiguration(
HttpProxyConfiguration.builder()
.setHostname(PARAM_PROXY_HOSTNAME)
.setPort(PARAM_PROXY_PORT)
.setUsername(PARAM_PROXY_USERNAME)
// prefer char[] over String to reduce password exposure in heap memory
.setPassword(PARAM_PROXY_PASSWORD_AS_CHAR_ARRAY)
.build())
.build();
SinchClient client = new SinchClient(configuration);
```


## Third-party dependencies
The SDK relies on the following third-party dependencies:
Expand Down Expand Up @@ -435,11 +489,11 @@ Note: Replace `VERSION-YOU-WANT-TO-BE-USED` with a Jackson version of at least `
## Examples

You can find:
- self-contained code snippets covering every API operation in the [examples/snippets](./examples/snippets) folder.
- getting started guides for specific use cases in the [examples/getting-started](./examples/getting-started) folder.
- a Spring Boot server template to process received Sinch Events in the [examples/sinch-events](./examples/sinch-events) folder.
- an SDK client template application in the [examples/client](./examples/client) folder.
- step-by-step tutorials combining multiple SDK features in the [examples/tutorials](./examples/tutorials) folder.
- self-contained code snippets covering every API operation in the [examples/snippets](./examples/snippets) folder.
- getting started guides for specific use cases in the [examples/getting-started](./examples/getting-started) folder.
- a Spring Boot server template to process received Sinch Events in the [examples/sinch-events](./examples/sinch-events) folder.
- an SDK client template application in the [examples/client](./examples/client) folder.
- step-by-step tutorials combining multiple SDK features in the [examples/tutorials](./examples/tutorials) folder.


## Changelog & Migration
Expand All @@ -452,4 +506,4 @@ This project is licensed under the Apache License. See the [LICENSE](LICENSE) fi

## Contact

Developer Experience engineering team: [team-developer-experience@sinch.com](mailto:team-developer-experience@sinch.com)
Developer Experience engineering team: [team-developer-experience@sinch.com](mailto:team-developer-experience@sinch.com)
2 changes: 2 additions & 0 deletions client/resources/config-default.properties
Original file line number Diff line number Diff line change
Expand Up @@ -21,3 +21,5 @@ voice-server-south-east-asia2=https://calling-apse2.api.sinch.com
conversation-region=
conversation-server=https://%s.conversation.api.sinch.com
template-management-conversation-server=https://%s.template.api.sinch.com

number-lookup-server=https://lookup.api.sinch.com
2 changes: 1 addition & 1 deletion client/src/main/com/sinch/sdk/SDK.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@
public class SDK {

public static final String NAME = "Sinch Java SDK";
public static final String VERSION = "2.1.0-dev";
public static final String VERSION = "2.2.0-dev";
public static final String AUXILIARY_FLAG = "";
}
Loading
Loading