Docs

Content and video

Last updated: 2026-10-037 min read

All four tools run as jobs: a 202 answer, the result by polling or webhook (Jobs and results). Voice, music, closing phrase and avatar are picked from the reference lists (Reference data).

Content pack

POST /content/generate - scope tools:contentgen. From property facts and photos GREM makes descriptions, social posts, a narrated video, a landing page and a PDF - in one job. A draft listing is created for the pack.

At least 4 photos are required - as public addresses in form.media.photos. Upload your own files with POST /uploads first and pass the returned urls (Files).

FieldTypeDescription
form.languagestringresult language: eng, rus, ukr, deu, spa, aze, arb, fra, zho, tur
form.media.photosarray4-20 photo addresses (strings or { "url": "..." }) - required
form.objectIdstringbuild the pack for your existing listing
form.objectTypestringproperty, rental or complex
form.propertyCategorystringproperty type: apartment, house, penthouse, land, warehouse ...
form.dealTypestringsale or rent
form.titlestringtitle
form.descriptionstringyour description - used as facts
form.customDirectionstringtone and emphasis wishes, up to 500 characters
form.totalAreanumberm²
form.rooms, form.floor, form.buildingFloorsnumberrooms, floor, floors
form.landPlotAreanumberplot, m² (houses)
form.pricenumberprice
form.priceCurrencystringprice currency
form.addressCountry, form.addressCity, form.street, form.streetNumberstringaddress
form.voiceIdstringnarration voice from GET /voices
form.enableSubtitlesyes/novideo subtitles, on by default
form.showPhoneyes/noshow the phone; the number goes in form.contactPhone
form.options.music.trackIdstringtrack from GET /video/music; form.options.music.enabled: false - no music
form.options.endCard.stylestringend card: photo, solid or split

No user field is needed: the pack is created on behalf of the key's account.

curl -X POST https://developers.grem.capital/api/v1/content/generate \
  -H "Authorization: Bearer gsk_live_xxx" \
  -H "Content-Type: application/json" \
  -H "Idempotency-Key: 0c0e3a5b-7d1e-4b8a-9b2f-1e6d4c3a2b10" \
  -d '{
    "form": {
      "language": "eng",
      "propertyCategory": "apartment", "dealType": "sale",
      "title": "Bright 2-room flat near the park",
      "totalArea": 64, "rooms": 2, "price": 320000, "priceCurrency": "EUR",
      "addressCountry": "Germany", "addressCity": "Berlin",
      "media": { "photos": ["https://example.com/1.jpg", "https://example.com/2.jpg",
                             "https://example.com/3.jpg", "https://example.com/4.jpg"] }
    }
  }'

202 response: jobId (job id) and propertyId (the draft listing). The finished job (GET /content/generate/jobs/{id}) holds:

FieldDescription
artifactsids of the generated files
artifactsSummaryone entry per file: kind, format, size
bundlethe pack's landing page and PDF, when built
progressgeneration progress while the job runs
masterProfilethe story outline the texts and narration were built on
errorfor a failed job: the reason, as a generic text

File: GET /artifacts/v1/ai/assistant/announcement/jobs/{jobId}/artifacts/{artifactId}/download. Events - content.completed, content.partial (some files failed), content.failed. Fewer than 4 photos - 400.

Listing texts

POST /text/generate - scope tools:text. A description, a presentation and a social post. Needs either objectId or at least one of description, city, totalArea - otherwise 422 with code: not_enough_input.

FieldTypeDescription
objectIdstringyour listing (or your agency's)
titlestringup to 120 characters
descriptionstringyour description, up to 2000 characters
citystringcity
totalAreanumberm²
roomsnumberrooms
pricenumberprice
currencystringprice currency
propertyCategorystringproperty type
languagestringen (default), ru, ua, de, es, az, ar, fr, zh, tr
customDirectionstringtone and emphasis wishes; longer text is cut to 500 characters
curl -X POST https://developers.grem.capital/api/v1/text/generate \
  -H "Authorization: Bearer gsk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"city":"Berlin","totalArea":64,"rooms":2,"propertyCategory":"apartment","language":"en","description":"Renovated, quiet courtyard, 5 min to U-Bahn."}'

202 with jobId. The texts are in the job files, as with the content pack; the job also carries progress, masterProfile and error. Events - text.completed / text.failed.

Video from photos

POST /video/create - scope tools:video. A short narrated video from your photos or a listing's photos.

Body - multipart/form-data, each option as its own form field (not JSON in a data field):

FieldDescription
photosphoto files, 1 to 8 - one part per file; not needed with objectId; JPEG, PNG, WebP or HEIC up to 20 MB each; photos past the 8th are not used
objectIdtake photos and facts from your listing
promptwhat the clip is about, up to 500 characters; required without objectId; a longer text is cut
titletitle, up to 120 characters
lengthshort (default) or long; another value is treated as short; long needs at least 4 photos (code: long_needs_more_photos)
aspect9:16, 1:1 or 16:9; another value - the default
languagenarration language: en, ru, ua, de, es, az, ar, fr, zh, tr
narrationtrue (default) - with narration
voiceIdvoice from GET /voices
enableSubtitlessubtitles
musicEnabledwith music
musicTrackIdtrack from GET /video/music
musicVolumemusic volume, 0-100
musicyour own music file instead of a track
endCardEnabled, endCardStyleend card: photo, solid or split
ctaModeclosing phrase: auto (default) - picked for the listing; manual - use ctaIntent or ctaText
ctaIntenta ready closing phrase: one of the intent values from GET /video/endings
ctaTextyour own closing phrase, up to 60 characters
ctaMarketwho the video speaks to: local, remote or international; tunes the auto phrase
curl -X POST https://developers.grem.capital/api/v1/video/create \
  -H "Authorization: Bearer gsk_live_xxx" \
  -F "[email protected]" -F "[email protected]" -F "[email protected]" \
  -F "prompt=Sunny 2-room flat in Berlin Mitte, quiet courtyard" \
  -F "length=short" -F "aspect=9:16" -F "language=en"

202 with jobId; the video is in the job files. The job also carries progress, masterProfile and error, as with the content pack. The price depends on length. Events - video.completed / video.failed.

Avatar video

POST /avatar/video - scope tools:avatar. A presenter talks about your listing.

FieldTypeDescription
avatarIdstringrequired: an avatar with status ready from GET /avatar/avatars
objectIdstringrequired: your listing
scriptTextstringrequired: the presenter's text, at least 100 characters; at most 1200
voiceIdstringvoice from GET /voices
languagestringlanguage
background.typestringbackground: color, photo or slideshow
background.colorstringbackground colour #RRGGBB
background.photoUrlstringbackground photo
dimension.width, dimension.heightnumberframe size, 100-4096 px; send both or neither
enableSubtitlesyes/nosubtitles
curl -X POST https://developers.grem.capital/api/v1/avatar/video \
  -H "Authorization: Bearer gsk_live_xxx" \
  -H "Content-Type: application/json" \
  -d '{"avatarId":"AVATAR_ID","objectId":"OBJECT_ID","voiceId":"VOICE_ID","scriptText":"..."}'

202 with jobId. Video: GET /artifacts/v1/ai/assistant/avatar/jobs/{jobId}/artifacts/{artifactId}/download, artifactId from the artifacts of the finished job. Events - avatar.completed / avatar.failed. Missing avatarId, objectId or a short text - 400 with the fields in errors.

Was this article helpful?