Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
9 changes: 9 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# Change Log

## [5.47.0](https://github.com/plivo/plivo-java/tree/v5.47.0) (2026-04-08)
**Feature - PhoneNumber Compliance API support**
- Added `PhoneNumberComplianceRequirement` resource with `lister()` for discovering compliance requirements by country, number type, and user type
- Added `PhoneNumberCompliance` resource with `creator()`, `getter()`, `lister()`, `updater()`, `deleter()` for compliance applications
- Added `PhoneNumberComplianceLinkCreator` for bulk linking phone numbers to accepted compliance applications
- Added PATCH support via Retrofit `@HTTP` annotation for compliance application updates
- Added `compliances` field to `ListResponse` for non-standard list response key
- Create and update operations support multipart file uploads for compliance documents

## [5.46.7](https://github.com/plivo/plivo-java/tree/v5.46.7) (2026-03-18)
**Feature - Profile Update API additional fields support**
- Added `ein`, `einIssuingCountry`, `altBusinessId`, `altBusinessIdType` parameters to Profile `update` method
Expand Down
2 changes: 1 addition & 1 deletion pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.plivo</groupId>
<artifactId>plivo-java</artifactId>
<version>5.46.7</version>
<version>5.47.0</version>
<name>plivo-java</name>
<description>A Java SDK to make voice calls &amp; send SMS using Plivo and to generate Plivo XML</description>
<licenses>
Expand Down
38 changes: 38 additions & 0 deletions src/main/java/com/plivo/api/PlivoAPIService.java
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@
import com.plivo.api.models.node.MultiPartyCall;
import com.plivo.api.models.number.*;
import com.plivo.api.models.number.Number;
import com.plivo.api.models.phonenumbercompliance.*;
import com.plivo.api.models.phlo.Phlo;
import com.plivo.api.models.phlo.PhloRunGetterResponse;
import com.plivo.api.models.phlo.PhloUpdateResponse;
Expand Down Expand Up @@ -827,4 +828,41 @@ Call<ListResponse<TollfreeVerification>> tollfreeVerificationList(@Path("authId"
// Delete
@DELETE("Account/{authId}/TollfreeVerification/{uuid}/")
Call<ResponseBody> tollfreeVerificationDelete(@Path("authId") String authId, @Path("uuid") String uuid);

// PhoneNumber Compliance Requirements
@GET("Account/{authId}/PhoneNumber/Compliance/Requirements/")
Call<PhoneNumberComplianceRequirement> phoneNumberComplianceRequirementList(@Path("authId") String authId,
@QueryMap Map<String, Object> params);

// PhoneNumber Compliance Create (multipart)
@POST("Account/{authId}/PhoneNumber/Compliance/")
Call<PhoneNumberComplianceCreateResponse> phoneNumberComplianceCreate(@Path("authId") String authId,
@Body RequestBody body);

// PhoneNumber Compliance List
@GET("Account/{authId}/PhoneNumber/Compliance/")
Call<ListResponse<PhoneNumberCompliance>> phoneNumberComplianceList(@Path("authId") String authId,
@QueryMap Map<String, Object> params);

// PhoneNumber Compliance Get
@GET("Account/{authId}/PhoneNumber/Compliance/{complianceId}/")
Call<PhoneNumberComplianceGetResponse> phoneNumberComplianceGet(@Path("authId") String authId,
@Path("complianceId") String complianceId,
@QueryMap Map<String, Object> params);

// PhoneNumber Compliance Update (PATCH, multipart)
@HTTP(method = "PATCH", path = "Account/{authId}/PhoneNumber/Compliance/{complianceId}/", hasBody = true)
Call<PhoneNumberComplianceUpdateResponse> phoneNumberComplianceUpdate(@Path("authId") String authId,
@Path("complianceId") String complianceId,
@Body RequestBody body);

// PhoneNumber Compliance Delete
@DELETE("Account/{authId}/PhoneNumber/Compliance/{complianceId}/")
Call<ResponseBody> phoneNumberComplianceDelete(@Path("authId") String authId,
@Path("complianceId") String complianceId);

// PhoneNumber Compliance Link
@POST("Account/{authId}/PhoneNumber/Compliance/Link/")
Call<PhoneNumberComplianceLinkResponse> phoneNumberComplianceLinkCreate(@Path("authId") String authId,
@Body PhoneNumberComplianceLinkCreator body);
}
7 changes: 7 additions & 0 deletions src/main/java/com/plivo/api/models/base/ListResponse.java
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,13 @@ public List<T> getCampaigns() {
public List<T> getSessions() {
return sessions;
}

private List<T> compliances;

public List<T> getCompliances() {
return compliances;
}

public Response getResponse() {
return response;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,104 @@
package com.plivo.api.models.phonenumbercompliance;

import com.plivo.api.models.base.BaseResource;

import java.util.List;

public class PhoneNumberCompliance extends BaseResource {

private String complianceId;
private String status;
private String alias;
private String countryIso;
private String numberType;
private String userType;
private String callbackUrl;
private String callbackMethod;
private String rejectionReason;
private String createdAt;
private String updatedAt;
private Object endUser;
private List<Object> documents;
private List<Object> linkedNumbers;

public static PhoneNumberComplianceCreator creator(String dataJson) {
return new PhoneNumberComplianceCreator(dataJson);
}

public static PhoneNumberComplianceGetter getter(String id) {
return new PhoneNumberComplianceGetter(id);
}

public static PhoneNumberComplianceLister lister() {
return new PhoneNumberComplianceLister();
}

public static PhoneNumberComplianceUpdater updater(String id) {
return new PhoneNumberComplianceUpdater(id);
}

public static PhoneNumberComplianceDeleter deleter(String id) {
return new PhoneNumberComplianceDeleter(id);
}

@Override
public String getId() {
return complianceId;
}

public String getComplianceId() {
return complianceId;
}

public String getStatus() {
return status;
}

public String getAlias() {
return alias;
}

public String getCountryIso() {
return countryIso;
}

public String getNumberType() {
return numberType;
}

public String getUserType() {
return userType;
}

public String getCallbackUrl() {
return callbackUrl;
}

public String getCallbackMethod() {
return callbackMethod;
}

public String getRejectionReason() {
return rejectionReason;
}

public String getCreatedAt() {
return createdAt;
}

public String getUpdatedAt() {
return updatedAt;
}

public Object getEndUser() {
return endUser;
}

public List<Object> getDocuments() {
return documents;
}

public List<Object> getLinkedNumbers() {
return linkedNumbers;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.plivo.api.models.phonenumbercompliance;

import com.plivo.api.models.base.BaseResponse;

public class PhoneNumberComplianceCreateResponse extends BaseResponse {

private String complianceId;

public String getComplianceId() {
return complianceId;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
package com.plivo.api.models.phonenumbercompliance;

import com.plivo.api.exceptions.ResourceNotFoundException;
import com.plivo.api.models.base.Creator;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.RequestBody;
import retrofit2.Call;

import javax.activation.MimetypesFileTypeMap;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;

public class PhoneNumberComplianceCreator extends Creator<PhoneNumberComplianceCreateResponse> {

private MultipartBody.Builder body;

PhoneNumberComplianceCreator(String dataJson) {
this.body = new MultipartBody.Builder().setType(MultipartBody.FORM);
this.body.addFormDataPart("data", dataJson);
}

public PhoneNumberComplianceCreator addDocument(int index, String filePath) throws ResourceNotFoundException {
File file = new File(filePath);
if (!file.exists()) {
throw new ResourceNotFoundException("File missing " + filePath);
}
try {
String contentType = "";
if (Files.probeContentType(file.toPath()) != null) {
contentType = Files.probeContentType(file.toPath());
} else {
Path source = Paths.get(filePath);
MimetypesFileTypeMap m = new MimetypesFileTypeMap(source.toString());
contentType = m.getContentType(file);
}
this.body.addFormDataPart("documents[" + index + "].file", file.getName(),
RequestBody.create(MediaType.parse(contentType), file));
} catch (IOException e) {
throw new ResourceNotFoundException("Unable to read file " + filePath);
}
return this;
}

@Override
protected Call<PhoneNumberComplianceCreateResponse> obtainCall() {
return client().getApiService().phoneNumberComplianceCreate(client().getAuthId(), this.body.build());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.plivo.api.models.phonenumbercompliance;

import com.plivo.api.models.base.Deleter;
import okhttp3.ResponseBody;
import retrofit2.Call;

public class PhoneNumberComplianceDeleter extends Deleter<PhoneNumberCompliance> {

public PhoneNumberComplianceDeleter(String id) {
super(id);
}

@Override
protected Call<ResponseBody> obtainCall() {
return client().getApiService().phoneNumberComplianceDelete(client().getAuthId(), id);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.plivo.api.models.phonenumbercompliance;

import com.plivo.api.models.base.BaseResource;

public class PhoneNumberComplianceGetResponse extends BaseResource {

private PhoneNumberCompliance compliance;

public PhoneNumberCompliance getCompliance() {
return compliance;
}

@Override
public String getId() {
return compliance != null ? compliance.getId() : null;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.plivo.api.models.phonenumbercompliance;

import com.plivo.api.models.base.Getter;
import retrofit2.Call;

public class PhoneNumberComplianceGetter extends Getter<PhoneNumberComplianceGetResponse> {

private String expand;

public PhoneNumberComplianceGetter(String id) {
super(id);
}

public String expand() {
return this.expand;
}

public PhoneNumberComplianceGetter expand(String expand) {
this.expand = expand;
return this;
}

@Override
protected Call<PhoneNumberComplianceGetResponse> obtainCall() {
return client().getApiService().phoneNumberComplianceGet(client().getAuthId(), id, toMap());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.plivo.api.models.phonenumbercompliance;

import com.plivo.api.models.base.Creator;
import retrofit2.Call;

import java.util.List;

public class PhoneNumberComplianceLinkCreator extends Creator<PhoneNumberComplianceLinkResponse> {

private List<PhoneNumberComplianceLinkNumber> numbers;

public List<PhoneNumberComplianceLinkNumber> getNumbers() {
return numbers;
}

public PhoneNumberComplianceLinkCreator numbers(List<PhoneNumberComplianceLinkNumber> numbers) {
this.numbers = numbers;
return this;
}

@Override
protected Call<PhoneNumberComplianceLinkResponse> obtainCall() {
return client().getApiService().phoneNumberComplianceLinkCreate(client().getAuthId(), this);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
package com.plivo.api.models.phonenumbercompliance;

public class PhoneNumberComplianceLinkNumber {

private String number;
private String complianceApplicationId;

public String getNumber() {
return number;
}

public void setNumber(String number) {
this.number = number;
}

public String getComplianceApplicationId() {
return complianceApplicationId;
}

public void setComplianceApplicationId(String complianceApplicationId) {
this.complianceApplicationId = complianceApplicationId;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package com.plivo.api.models.phonenumbercompliance;

import com.plivo.api.models.base.BaseResponse;

import java.util.List;

public class PhoneNumberComplianceLinkResponse extends BaseResponse {

private Integer totalCount;
private Integer updatedCount;
private List<Object> report;

public Integer getTotalCount() {
return totalCount;
}

public Integer getUpdatedCount() {
return updatedCount;
}

public List<Object> getReport() {
return report;
}
}
Loading
Loading