Image Search - Image Submission API
Overall Call Flow
1. Submit image (/v3/api/open/ai-search/image/submit or /v3/api/open/ai-search/image/submit/image-url) (This API)
↓
2. Wait 10-20 seconds
↓
3. Query processing status (/v3/api/open/ai-search/image/status)
↓
4. Get result summary (/v3/api/open/ai-search/image/resultSummary)
↓
5. Based on summary data, selectively call detailed list APIs:
- Product list: /v3/api/open/ai-search/image/product/search
- Ad list: /v3/api/open/ai-search/image/search4/ad/search
- Store list: /v3/api/open/ai-search/image/root-path/search
- TikTok products: /v3/api/open/ai-search/image/tiktok-product/search
- TikTok shops: /v3/api/open/ai-search/image/tiktok-shop/search
API Overview
The image search feature provides two image submission methods:
- Upload Image File: Directly upload local image files for search
- Submit Image URL: Search using an image URL address
Both methods will vectorize the image and search for similar content in massive ad, product, and store data, returning an image ID for subsequent result queries.
API 1: Upload Image File
API Information
- API Name: Upload Image File for Image Search
- Request Method: POST
- API Address:
/open-api/v1/upload-file - API Path:
/v3/api/open/ai-search/image/submit - API Description: Upload local image files for image search, suitable for scenarios requiring local image uploads
- Pricing: Free
Request Headers:
- Content-Type: multipart/form-data
- Accept: application/json
Request Parameters
Multipart Form Fields
Send these three fields directly in a multipart/form-data body, without a JSON params object. When using cURL -F or FormData, let the client generate the Content-Type header with its multipart boundary.
| Parameter | Type | Required | Description |
|---|---|---|---|
key | string | Yes | Your API Key. |
uri | string | Yes | Set to /v3/api/open/ai-search/image/submit. |
image_data | File | Yes | Local image file. Supported formats: jpg, jpeg, png, gif, bmp, webp. Recommended maximum: 10MB and 4096×4096 pixels. |
Request Examples
Using cURL
curl -X POST "https://www.pipispy.com/open-api/v1/upload-file" \
-H "Accept: application/json" \
-F "image_data=@/path/to/image.jpg" \
-F "key=your_api_key" \
-F "uri=/v3/api/open/ai-search/image/submit"
Using Java (Spring RestTemplate)
import org.springframework.core.io.FileSystemResource;
import org.springframework.http.*;
import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import java.io.File;
import java.util.Collections;
public class UploadFileExample {
public static void main(String[] args) {
String url = "https://www.pipispy.com/open-api/v1/upload-file";
// Replace with your own image path and API key.
String imagePath = "/path/to/image.jpg";
String apiKey = "your_api_key";
String uriParam = "/v3/api/open/ai-search/image/submit";
// Create a RestTemplate instance.
RestTemplate restTemplate = new RestTemplate();
// Build a multipart/form-data request body.
FileSystemResource resource = new FileSystemResource(new File(imagePath));
MultiValueMap<String, Object> body = new LinkedMultiValueMap<>();
body.add("image_data", resource);
body.add("key", apiKey);
body.add("uri", uriParam);
// Set the request headers.
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.MULTIPART_FORM_DATA);
headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(body, headers);
// Send a POST request.
try {
ResponseEntity<String> response = restTemplate.exchange(url, HttpMethod.POST, requestEntity, String.class);
System.out.println("Status Code: " + response.getStatusCode());
System.out.println("Response Body: " + response.getBody());
} catch (Exception e) {
e.printStackTrace();
}
}
}
Maven Dependency:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.30</version>
</dependency>
API 2: Submit Image URL
API Information
- API Name: Image Search via Image URL
- Request Method: POST
- API Address:
/open-api/v1/data - API Path:
/v3/api/open/ai-search/image/submit/image-url - API Description: Search via image URL address, suitable for scenarios where images are already online, no file upload needed
- Pricing: Free
Request Headers:
- Content-Type: application/json
- Accept: application/json
Request Parameters
Request Structure
| Parameter | Type | Description | Example | Required | Default |
|---|---|---|---|---|---|
key | string | User's external API request key | "your_api_key_here" | Yes | |
uri | string | API path | "/v3/api/open/ai-search/image/submit/image-url" | Yes | |
params | object | API input parameters | See parameter list | Yes |
Request Body Parameters (params object)
| Parameter | Type | Required | Description |
|---|---|---|---|
image_url | String | Yes | Image URL address. Must be a publicly accessible HTTP/HTTPS link. Supported formats: jpg, jpeg, png, gif, bmp, webp. Recommended size: no more than 10MB, dimensions no more than 4096x4096 pixels. The system will download and convert the image to vectors for similarity matching |
Request Examples
Using cURL
curl -X POST "https://www.pipispy.com/open-api/v1/data" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"key": "your_api_key_here",
"uri": "/v3/api/open/ai-search/image/submit/image-url",
"params": {
"image_url": "https://example.com/path/to/image.jpg"
}
}'
Using Java (Spring RestTemplate)
import org.springframework.http.*;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.Map;
public class AiSearchImageUrlSubmitSpring {
public static void main(String[] args) {
String url = "https://www.pipispy.com/open-api/v1/data";
String apiKey = "your_api_key_here";
String imageUrl = "https://example.com/path/to/image.jpg";
RestTemplate restTemplate = new RestTemplate();
// Set request headers
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Accept", "application/json");
// Build request body
Map<String, Object> requestBody = new HashMap<>();
requestBody.put("key", apiKey);
requestBody.put("uri", "/v3/api/open/ai-search/image/submit/image-url");
Map<String, String> params = new HashMap<>();
params.put("image_url", imageUrl);
requestBody.put("params", params);
HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(requestBody, headers);
// Send request
ResponseEntity<String> response = restTemplate.exchange(
url,
HttpMethod.POST,
requestEntity,
String.class
);
if (response.getStatusCode() == HttpStatus.OK) {
System.out.println("Response: " + response.getBody());
} else {
System.err.println("Request failed: " + response.getStatusCode());
}
}
}
Maven Dependency:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.3.30</version>
</dependency>
Response Parameters
Response Body Structure
Both APIs have the same response format. data is the image ID string. Pass it as image_id in subsequent requests; do not read data.image_id.
{
"code": 200,
"message": "success",
"data": "img_1234567890123456",
"version": "v1",
"timestamp": null,
"sign": null,
"remaining_credits": 9980,
"consumed_credits": 0,
"success": true,
"fail": false
}
Response Field Description
| Field Name | Type | Description |
|---|---|---|
code | Integer | Response status code, 200 indicates success |
message | String | Response message |
data | String | Response data, unique image identifier (image_id), used for subsequent queries of search status and results. Format: starts with "img_" followed by a timestamp. |
version | String | API version |
timestamp | String | Response timestamp |
sign | String | Response signature |
remaining_credits | Long | Current remaining available credits after this request |
consumed_credits | Long | Credits consumed by this request |
success | Boolean | Whether request succeeded |
fail | Boolean | Whether request failed |
Response Examples
Success Response
{
"code": 200,
"message": "success",
"data": "img_1737532800123456",
"version": "v1",
"timestamp": null,
"sign": null,
"remaining_credits": 9980,
"consumed_credits": 0,
"success": true,
"fail": false
}
Error Response Examples
Empty File (API 1 only)
{
"code": 400,
"message": "File cannot be empty",
"data": null,
"version": "v1",
"timestamp": null,
"sign": null,
"remaining_credits": 9980,
"consumed_credits": 0,
"success": false,
"fail": true
}
Error Code Description
| Error Code | Description |
|---|---|
200 | Success |
400 | Request parameter error (empty file, invalid filename, unsupported format, invalid URL, etc.) |
401 | Unauthorized (invalid or expired API Key) |
500 | Internal server error (image upload failed, vectorization failed, etc.) |
Next Steps
After successful image submission, you can use the returned image_id for the following operations:
- Query Processing Status: Call
/v3/api/open/ai-search/image/statusAPI to query image processing status - Get Search Result Summary: Call
/v3/api/open/ai-search/image/resultSummaryAPI to get result statistics - Query Product List: Call
/v3/api/open/ai-search/image/product/searchAPI to get similar products - Query Ad List: Call
/v3/api/open/ai-search/image/search4/ad/searchAPI to get similar ads - Query Store List: Call
/v3/api/open/ai-search/image/root-path/searchAPI to get related stores - Query TikTok Products: Call
/v3/api/open/ai-search/image/tiktok-product/searchAPI to get TikTok Shop products - Query TikTok Shops: Call
/v3/api/open/ai-search/image/tiktok-shop/searchAPI to get TikTok Shops
Processing Flow Description
Processing flow after image submission:
- Image Acquisition (approx. 1-3 seconds):
- API 1: System saves uploaded image to OSS storage
- API 2: System downloads image from URL and saves to OSS storage
- Vector Extraction (approx. 2-5 seconds): Use AI model to extract image feature vectors
- Vector Retrieval (approx. 1-3 seconds): Search for similar images in Milvus vector database
- Result Organization (approx. 2-5 seconds): Filter and organize search results
The entire process typically completes within 10-20 seconds. It's recommended to wait a few seconds after submitting the image before calling the status query API.