diff --git a/README.md b/README.md
index 8c7f0e32..d28f1513 100644
--- a/README.md
+++ b/README.md
@@ -205,11 +205,15 @@ Class | Method | HTTP request | Description
*SearchApi* | [**searchCollections**](docs/SearchApi.md#searchCollections) | **GET** /v2/search/collections | Collections search
*SearchApi* | [**searchFunctions**](docs/SearchApi.md#searchFunctions) | **GET** /v2/search/functions | Functions search
*SearchApi* | [**searchTags**](docs/SearchApi.md#searchTags) | **GET** /v2/search/tags | Tags search
+*StringsApi* | [**addUserStringToAnalysis**](docs/StringsApi.md#addUserStringToAnalysis) | **POST** /v3/analyses/{analysis_id}/user-provided-strings | Add a user-provided string to an analysis.
+*StringsApi* | [**addUserStringToFunction**](docs/StringsApi.md#addUserStringToFunction) | **POST** /v3/functions/{function_id}/user-provided-strings | Add a user-provided string to a function.
## Documentation for Models
- [APIError](docs/APIError.md)
+ - [AddUserStringInputBody](docs/AddUserStringInputBody.md)
+ - [AddUserStringToFunctionInputBody](docs/AddUserStringToFunctionInputBody.md)
- [AdditionalDetailsStatusResponse](docs/AdditionalDetailsStatusResponse.md)
- [Addr](docs/Addr.md)
- [AiDecompilationRating](docs/AiDecompilationRating.md)
diff --git a/docs/AddUserStringInputBody.md b/docs/AddUserStringInputBody.md
new file mode 100644
index 00000000..dc97ffd6
--- /dev/null
+++ b/docs/AddUserStringInputBody.md
@@ -0,0 +1,14 @@
+
+
+# AddUserStringInputBody
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**string** | **String** | String literal | |
+|**virtualAddress** | **Long** | Virtual address at which this string is defined. | |
+
+
+
diff --git a/docs/AddUserStringToFunctionInputBody.md b/docs/AddUserStringToFunctionInputBody.md
new file mode 100644
index 00000000..d2770a20
--- /dev/null
+++ b/docs/AddUserStringToFunctionInputBody.md
@@ -0,0 +1,14 @@
+
+
+# AddUserStringToFunctionInputBody
+
+
+## Properties
+
+| Name | Type | Description | Notes |
+|------------ | ------------- | ------------- | -------------|
+|**string** | **String** | String literal | |
+|**virtualAddress** | **Long** | Virtual address at which this string is defined. | |
+
+
+
diff --git a/docs/StringsApi.md b/docs/StringsApi.md
new file mode 100644
index 00000000..f0799e51
--- /dev/null
+++ b/docs/StringsApi.md
@@ -0,0 +1,160 @@
+# StringsApi
+
+All URIs are relative to *https://api.reveng.ai*
+
+| Method | HTTP request | Description |
+|------------- | ------------- | -------------|
+| [**addUserStringToAnalysis**](StringsApi.md#addUserStringToAnalysis) | **POST** /v3/analyses/{analysis_id}/user-provided-strings | Add a user-provided string to an analysis. |
+| [**addUserStringToFunction**](StringsApi.md#addUserStringToFunction) | **POST** /v3/functions/{function_id}/user-provided-strings | Add a user-provided string to a function. |
+
+
+
+# **addUserStringToAnalysis**
+> Map<String, Object> addUserStringToAnalysis(analysisId, addUserStringInputBody)
+
+Add a user-provided string to an analysis.
+
+Attaches a user-provided string to an analysis at the given virtual address. The string is stored with source `USER` and complements strings discovered automatically during analysis. **Error codes:** - `404` [`NOT_FOUND`](/errors/NOT_FOUND) — Not Found - `403` [`ACCESS_DENIED`](/errors/ACCESS_DENIED) — Access Denied
+
+### Example
+```java
+// Import classes:
+import ai.reveng.invoker.ApiClient;
+import ai.reveng.invoker.ApiException;
+import ai.reveng.invoker.Configuration;
+import ai.reveng.invoker.auth.*;
+import ai.reveng.invoker.models.*;
+import ai.reveng.api.StringsApi;
+
+public class Example {
+ public static void main(String[] args) {
+ ApiClient defaultClient = Configuration.getDefaultApiClient();
+ defaultClient.setBasePath("https://api.reveng.ai");
+
+ // Configure API key authorization: APIKey
+ ApiKeyAuth APIKey = (ApiKeyAuth) defaultClient.getAuthentication("APIKey");
+ APIKey.setApiKey("YOUR API KEY");
+ // Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
+ //APIKey.setApiKeyPrefix("Token");
+
+ StringsApi apiInstance = new StringsApi(defaultClient);
+ Long analysisId = 56L; // Long | Analysis ID
+ AddUserStringInputBody addUserStringInputBody = new AddUserStringInputBody(); // AddUserStringInputBody |
+ try {
+ Map result = apiInstance.addUserStringToAnalysis(analysisId, addUserStringInputBody);
+ System.out.println(result);
+ } catch (ApiException e) {
+ System.err.println("Exception when calling StringsApi#addUserStringToAnalysis");
+ System.err.println("Status code: " + e.getCode());
+ System.err.println("Reason: " + e.getResponseBody());
+ System.err.println("Response headers: " + e.getResponseHeaders());
+ e.printStackTrace();
+ }
+ }
+}
+```
+
+### Parameters
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **analysisId** | **Long**| Analysis ID | |
+| **addUserStringInputBody** | [**AddUserStringInputBody**](AddUserStringInputBody.md)| | |
+
+### Return type
+
+**Map<String, Object>**
+
+### Authorization
+
+[APIKey](../README.md#APIKey)
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **201** | Created | - |
+| **403** | Forbidden | - |
+| **404** | Not Found | - |
+| **422** | Unprocessable Entity | - |
+| **500** | Internal Server Error | - |
+
+
+# **addUserStringToFunction**
+> Map<String, Object> addUserStringToFunction(functionId, addUserStringToFunctionInputBody)
+
+Add a user-provided string to a function.
+
+Attaches a user-provided string to a function at the given virtual address. The string is stored with source `USER` and complements strings discovered automatically during analysis. **Error codes:** - `404` [`NOT_FOUND`](/errors/NOT_FOUND) — Not Found - `403` [`ACCESS_DENIED`](/errors/ACCESS_DENIED) — Access Denied
+
+### Example
+```java
+// Import classes:
+import ai.reveng.invoker.ApiClient;
+import ai.reveng.invoker.ApiException;
+import ai.reveng.invoker.Configuration;
+import ai.reveng.invoker.auth.*;
+import ai.reveng.invoker.models.*;
+import ai.reveng.api.StringsApi;
+
+public class Example {
+ public static void main(String[] args) {
+ ApiClient defaultClient = Configuration.getDefaultApiClient();
+ defaultClient.setBasePath("https://api.reveng.ai");
+
+ // Configure API key authorization: APIKey
+ ApiKeyAuth APIKey = (ApiKeyAuth) defaultClient.getAuthentication("APIKey");
+ APIKey.setApiKey("YOUR API KEY");
+ // Uncomment the following line to set a prefix for the API key, e.g. "Token" (defaults to null)
+ //APIKey.setApiKeyPrefix("Token");
+
+ StringsApi apiInstance = new StringsApi(defaultClient);
+ Long functionId = 56L; // Long | Function ID
+ AddUserStringToFunctionInputBody addUserStringToFunctionInputBody = new AddUserStringToFunctionInputBody(); // AddUserStringToFunctionInputBody |
+ try {
+ Map result = apiInstance.addUserStringToFunction(functionId, addUserStringToFunctionInputBody);
+ System.out.println(result);
+ } catch (ApiException e) {
+ System.err.println("Exception when calling StringsApi#addUserStringToFunction");
+ System.err.println("Status code: " + e.getCode());
+ System.err.println("Reason: " + e.getResponseBody());
+ System.err.println("Response headers: " + e.getResponseHeaders());
+ e.printStackTrace();
+ }
+ }
+}
+```
+
+### Parameters
+
+| Name | Type | Description | Notes |
+|------------- | ------------- | ------------- | -------------|
+| **functionId** | **Long**| Function ID | |
+| **addUserStringToFunctionInputBody** | [**AddUserStringToFunctionInputBody**](AddUserStringToFunctionInputBody.md)| | |
+
+### Return type
+
+**Map<String, Object>**
+
+### Authorization
+
+[APIKey](../README.md#APIKey)
+
+### HTTP request headers
+
+ - **Content-Type**: application/json
+ - **Accept**: application/json
+
+### HTTP response details
+| Status code | Description | Response headers |
+|-------------|-------------|------------------|
+| **201** | Created | - |
+| **403** | Forbidden | - |
+| **404** | Not Found | - |
+| **422** | Unprocessable Entity | - |
+| **500** | Internal Server Error | - |
+
diff --git a/src/main/java/ai/reveng/api/StringsApi.java b/src/main/java/ai/reveng/api/StringsApi.java
new file mode 100644
index 00000000..b0f63594
--- /dev/null
+++ b/src/main/java/ai/reveng/api/StringsApi.java
@@ -0,0 +1,382 @@
+/*
+ * RevEng.AI API
+ * RevEng.AI is an AI-powered binary analysis platform for reverse engineering and malware analysis. It provides similarity search across executable binaries and functions, AI-driven decompilation, dynamic execution analysis, firmware unpacking, and integration with external threat intelligence sources like VirusTotal.
+ *
+ *
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package ai.reveng.api;
+
+import ai.reveng.invoker.ApiCallback;
+import ai.reveng.invoker.ApiClient;
+import ai.reveng.invoker.ApiException;
+import ai.reveng.invoker.ApiResponse;
+import ai.reveng.invoker.Configuration;
+import ai.reveng.invoker.Pair;
+import ai.reveng.invoker.ProgressRequestBody;
+import ai.reveng.invoker.ProgressResponseBody;
+
+import com.google.gson.reflect.TypeToken;
+
+import java.io.IOException;
+
+
+import ai.reveng.model.APIError;
+import ai.reveng.model.AddUserStringInputBody;
+import ai.reveng.model.AddUserStringToFunctionInputBody;
+
+import java.lang.reflect.Type;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class StringsApi {
+ private ApiClient localVarApiClient;
+ private int localHostIndex;
+ private String localCustomBaseUrl;
+
+ public StringsApi() {
+ this(Configuration.getDefaultApiClient());
+ }
+
+ public StringsApi(ApiClient apiClient) {
+ this.localVarApiClient = apiClient;
+ }
+
+ public ApiClient getApiClient() {
+ return localVarApiClient;
+ }
+
+ public void setApiClient(ApiClient apiClient) {
+ this.localVarApiClient = apiClient;
+ }
+
+ public int getHostIndex() {
+ return localHostIndex;
+ }
+
+ public void setHostIndex(int hostIndex) {
+ this.localHostIndex = hostIndex;
+ }
+
+ public String getCustomBaseUrl() {
+ return localCustomBaseUrl;
+ }
+
+ public void setCustomBaseUrl(String customBaseUrl) {
+ this.localCustomBaseUrl = customBaseUrl;
+ }
+
+ /**
+ * Build call for addUserStringToAnalysis
+ * @param analysisId Analysis ID (required)
+ * @param addUserStringInputBody (required)
+ * @param _callback Callback for upload/download progress
+ * @return Call to execute
+ * @throws ApiException If fail to serialize the request body object
+ * @http.response.details
+
+ Response Details
+ | Status Code | Description | Response Headers |
+ | 201 | Created | - |
+ | 403 | Forbidden | - |
+ | 404 | Not Found | - |
+ | 422 | Unprocessable Entity | - |
+ | 500 | Internal Server Error | - |
+
+ */
+ public okhttp3.Call addUserStringToAnalysisCall(@javax.annotation.Nonnull Long analysisId, @javax.annotation.Nonnull AddUserStringInputBody addUserStringInputBody, final ApiCallback _callback) throws ApiException {
+ String basePath = null;
+ // Operation Servers
+ String[] localBasePaths = new String[] { };
+
+ // Determine Base Path to Use
+ if (localCustomBaseUrl != null){
+ basePath = localCustomBaseUrl;
+ } else if ( localBasePaths.length > 0 ) {
+ basePath = localBasePaths[localHostIndex];
+ } else {
+ basePath = null;
+ }
+
+ Object localVarPostBody = addUserStringInputBody;
+
+ // create path and map variables
+ String localVarPath = "/v3/analyses/{analysis_id}/user-provided-strings"
+ .replace("{" + "analysis_id" + "}", localVarApiClient.escapeString(analysisId.toString()));
+
+ List localVarQueryParams = new ArrayList();
+ List localVarCollectionQueryParams = new ArrayList();
+ Map localVarHeaderParams = new HashMap();
+ Map localVarCookieParams = new HashMap();
+ Map localVarFormParams = new HashMap();
+
+ final String[] localVarAccepts = {
+ "application/json"
+ };
+ final String localVarAccept = localVarApiClient.selectHeaderAccept(localVarAccepts);
+ if (localVarAccept != null) {
+ localVarHeaderParams.put("Accept", localVarAccept);
+ }
+
+ final String[] localVarContentTypes = {
+ "application/json"
+ };
+ final String localVarContentType = localVarApiClient.selectHeaderContentType(localVarContentTypes);
+ if (localVarContentType != null) {
+ localVarHeaderParams.put("Content-Type", localVarContentType);
+ }
+
+ String[] localVarAuthNames = new String[] { "APIKey" };
+ return localVarApiClient.buildCall(basePath, localVarPath, "POST", localVarQueryParams, localVarCollectionQueryParams, localVarPostBody, localVarHeaderParams, localVarCookieParams, localVarFormParams, localVarAuthNames, _callback);
+ }
+
+ @SuppressWarnings("rawtypes")
+ private okhttp3.Call addUserStringToAnalysisValidateBeforeCall(@javax.annotation.Nonnull Long analysisId, @javax.annotation.Nonnull AddUserStringInputBody addUserStringInputBody, final ApiCallback _callback) throws ApiException {
+ // verify the required parameter 'analysisId' is set
+ if (analysisId == null) {
+ throw new ApiException("Missing the required parameter 'analysisId' when calling addUserStringToAnalysis(Async)");
+ }
+
+ // verify the required parameter 'addUserStringInputBody' is set
+ if (addUserStringInputBody == null) {
+ throw new ApiException("Missing the required parameter 'addUserStringInputBody' when calling addUserStringToAnalysis(Async)");
+ }
+
+ return addUserStringToAnalysisCall(analysisId, addUserStringInputBody, _callback);
+
+ }
+
+ /**
+ * Add a user-provided string to an analysis.
+ * Attaches a user-provided string to an analysis at the given virtual address. The string is stored with source `USER` and complements strings discovered automatically during analysis. **Error codes:** - `404` [`NOT_FOUND`](/errors/NOT_FOUND) — Not Found - `403` [`ACCESS_DENIED`](/errors/ACCESS_DENIED) — Access Denied
+ * @param analysisId Analysis ID (required)
+ * @param addUserStringInputBody (required)
+ * @return Map<String, Object>
+ * @throws ApiException If fail to call the API, e.g. server error or cannot deserialize the response body
+ * @http.response.details
+
+ Response Details
+ | Status Code | Description | Response Headers |
+ | 201 | Created | - |
+ | 403 | Forbidden | - |
+ | 404 | Not Found | - |
+ | 422 | Unprocessable Entity | - |
+ | 500 | Internal Server Error | - |
+
+ */
+ public Map addUserStringToAnalysis(@javax.annotation.Nonnull Long analysisId, @javax.annotation.Nonnull AddUserStringInputBody addUserStringInputBody) throws ApiException {
+ ApiResponse