Smart Create
Smart Create lets you create a listing from a text description and photos. AI analyzes the input, extracts property details (type, area, price, amenities), and creates a structured listing automatically.
Why Use Smart Create
Instead of manually mapping every field from your CRM to Rentix format, send the raw description and photos — the system will do the rest.
| Approach | What You Send | What You Get |
|---|---|---|
| Standard upsert | All fields manually mapped | Listing with your data |
| Smart create | Text + photos | Listing with AI-extracted data |
Create a Listing from Description
Send a text description and at least one photo. The API creates a background job and returns immediately.
const response = await fetch('https://crm.rentix.md/api/v1/listings/smart', {
method: 'POST',
headers: {
'Authorization': 'ApiKey YOUR_API_KEY',
'Content-Type': 'application/json'
},
body: JSON.stringify({
description: 'Сдаётся уютная 2-комнатная квартира, 65 м², этаж 3/9. Евроремонт, тёплые полы, автономное отопление. Цена 500 евро/мес.',
files: [
{ url: 'https://example.com/photo1.jpg', externalFileId: 'apt-001-photo-1' },
{ url: 'https://example.com/photo2.jpg', externalFileId: 'apt-001-photo-2' },
{ url: 'https://example.com/photo3.jpg', externalFileId: 'apt-001-photo-3' }
],
externalId: 'apt-001',
targetStatus: 'active'
})
});
const result = await response.json();
console.log(`Job created: ${result.jobId}, status: ${result.status}`);
curl -X POST https://crm.rentix.md/api/v1/listings/smart \
-H "Authorization: ApiKey YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"description": "Сдаётся уютная 2-комнатная квартира, 65 м², этаж 3/9. Евроремонт, тёплые полы, автономное отопление. Цена 500 евро/мес.",
"files": [
{ "url": "https://example.com/photo1.jpg", "externalFileId": "apt-001-photo-1" },
{ "url": "https://example.com/photo2.jpg", "externalFileId": "apt-001-photo-2" },
{ "url": "https://example.com/photo3.jpg", "externalFileId": "apt-001-photo-3" }
],
"externalId": "apt-001",
"targetStatus": "active"
}'
$data = [
'description' => 'Сдаётся уютная 2-комнатная квартира, 65 м², этаж 3/9. Евроремонт, тёплые полы, автономное отопление. Цена 500 евро/мес.',
'files' => [
['url' => 'https://example.com/photo1.jpg', 'externalFileId' => 'apt-001-photo-1'],
['url' => 'https://example.com/photo2.jpg', 'externalFileId' => 'apt-001-photo-2'],
['url' => 'https://example.com/photo3.jpg', 'externalFileId' => 'apt-001-photo-3']
],
'externalId' => 'apt-001',
'targetStatus' => 'active'
];
$ch = curl_init('https://crm.rentix.md/api/v1/listings/smart');
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data));
curl_setopt($ch, CURLOPT_HTTPHEADER, [
'Authorization: ApiKey YOUR_API_KEY',
'Content-Type: application/json'
]);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$response = curl_exec($ch);
{
"jobId": 789,
"status": "pending",
"externalId": "apt-001"
}
The request returns immediately with a jobId. The listing is created asynchronously — track the job status to know when it's done.
Request Parameters
Required
| Field | Type | Description |
|---|---|---|
description | string | Property description (40–2000 characters) |
files | array | 1–20 photos (see file formats) |
Optional
| Field | Type | Description |
|---|---|---|
externalId | string | Your CRM ID (up to 255 characters) |
targetStatus | enum | draft or active (default: draft) |
user | object | { userId } or { externalUserId } — assign an agent |
formOverrides | object | Override AI-extracted fields (see below) |
applyAnalysis | boolean | Apply AI photo analysis (default: true) |
sanitizeAttributes | boolean | Silently strip invalid attributes (default: false) |
Override AI Results
If AI misidentifies certain fields, use formOverrides to correct them. Only the fields you specify are overridden — everything else comes from AI analysis.
{
"description": "Сдаётся квартира...",
"files": [{ "url": "https://example.com/photo.jpg" }],
"formOverrides": {
"announcementType": "rent",
"propertyType": "residential",
"propertySecondaryType": "apartment",
"announcementValue": 500,
"announcementCurrency": "EUR"
}
}
formOverrides accepts the same fields as the standard upsert, except announcementDescription, announcementStatus, and files — these are managed by smart create itself.Track Job Status
Smart create is asynchronous. After receiving the jobId, poll for completion:
const response = await fetch(
`https://crm.rentix.md/api/v1/job/status?id=${result.jobId}`,
{ headers: { 'Authorization': 'ApiKey YOUR_API_KEY' } }
);
const job = await response.json();
if (job.status === 'completed') {
console.log('Listing created:', job.resultData.announcementId);
}
{
"id": 789,
"type": "announcement_smart_create",
"status": "completed",
"resultData": {
"announcementId": 42,
"finalStatus": "active"
}
}
For full job tracking details, see Async Jobs.
Bulk Smart Create
You can include smart_create operations in bulk requests:
{
"operations": [
{
"op": "smart_create",
"description": "Сдаётся квартира...",
"files": [{ "url": "https://example.com/photo.jpg" }],
"externalId": "apt-001",
"targetStatus": "active"
},
{
"op": "smart_create",
"description": "Продаётся дом...",
"files": [{ "url": "https://example.com/house.jpg" }],
"externalId": "house-001"
}
]
}
Common Errors
| Error | Cause | Solution |
|---|---|---|
description too short | Description is less than 40 characters | Provide a more detailed description |
files are required | No photos provided | Add at least 1 photo |
Too many files | More than 20 photos | Reduce to 20 or fewer |
Unknown field in formOverrides | Invalid field name in overrides | Check allowed fields |
Next Steps
- Async Jobs — track smart create progress
- Bulk Operations — smart create in bulk
- Create and Update — standard listing creation with manual field mapping