diff --git a/CHANGELOG.md b/CHANGELOG.md
index b60b4903d..6453730a4 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+### v3.50.0 (2026-06-22)
+* * *
+### Bug Fixes:
+- Fixed JSON request body serialization where `Timestamp` parameters were sent in a human-readable format (e.g. `"expires_at":"2026-06-23 09:54:44.513"`) instead of Unix seconds. They are now serialized as numeric Unix seconds (e.g. `"expires_at":1782189229`), matching the form-url-encoded path and the format expected by the API. This affects all JSON content-type endpoints, such as [`create_promotional_grant`](https://apidocs.chargebee.com/docs/api/promotional_grants/create-promotional-grant) in [`PromotionalGrant`](https://apidocs.chargebee.com/docs/api/promotional_grants).
+
+
+
### v3.49.0 (2026-06-12)
* * *
### New Resources:
diff --git a/VERSION b/VERSION
index 549b777ea..ca25ff637 100644
--- a/VERSION
+++ b/VERSION
@@ -1 +1 @@
-3.49.0
+3.50.0
diff --git a/pom.xml b/pom.xml
index eaa845229..cf165cd0c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
com.chargebee
chargebee-java
- 3.49.0
+ 3.50.0
jar
diff --git a/src/main/java/com/chargebee/Environment.java b/src/main/java/com/chargebee/Environment.java
index 792a93d3a..012b3657c 100644
--- a/src/main/java/com/chargebee/Environment.java
+++ b/src/main/java/com/chargebee/Environment.java
@@ -38,7 +38,7 @@ public class Environment {
public static final String API_VERSION = "v2";
- public static final String LIBRARY_VERSION = "3.49.0";
+ public static final String LIBRARY_VERSION = "3.50.0";
private final String apiBaseUrl;
diff --git a/src/main/java/com/chargebee/internal/Params.java b/src/main/java/com/chargebee/internal/Params.java
index e2bfaf2d0..a4654b1cb 100644
--- a/src/main/java/com/chargebee/internal/Params.java
+++ b/src/main/java/com/chargebee/internal/Params.java
@@ -79,10 +79,52 @@ else if(c.isEnum()) {
}
public String toJson() {
- JSONObject jsonObject = new JSONObject(rawMap);
+ Map jsonMap = new HashMap(rawMap.size());
+ for (Map.Entry e : rawMap.entrySet()) {
+ if (e.getValue() == null) {
+ continue;
+ }
+ jsonMap.put(e.getKey(), toJsonValue(e.getValue()));
+ }
+ JSONObject jsonObject = new JSONObject(jsonMap);
return jsonObject.toString();
}
+ private static Object toJsonValue(Object value) {
+ if (value == null) {
+ return JSONObject.NULL;
+ }
+ Class> c = value.getClass();
+ if (c == Timestamp.class) {
+ return asUnixTimestamp((Timestamp) value);
+ } else if (c == Date.class) {
+ return new SimpleDateFormat("yyyy-MM-dd").format((Date) value);
+ } else if (c.isEnum()) {
+ return value.toString().toLowerCase();
+ } else if (value instanceof List) {
+ List