Las cuatro herramientas funcionan como trabajos: respuesta 202, el resultado por consulta o webhook (Trabajos y resultados). La voz, la música, la frase final y el avatar se eligen de las listas de referencia (Datos de referencia).
Paquete de contenido
POST /content/generate: ámbito tools:contentgen. A partir de los datos del inmueble y de las fotos, GREM crea descripciones, publicaciones para redes, un vídeo con locución, una página de aterrizaje y un PDF, en un solo trabajo. Para el paquete se crea un borrador de inmueble.
Se necesitan al menos 4 fotos, como direcciones públicas en form.media.photos. Suba antes sus propios archivos con POST /uploads y pase las url devueltas (Archivos).
| Campo | Tipo | Descripción |
|---|---|---|
form.language | cadena | idioma del resultado: eng, rus, ukr, deu, spa, aze, arb, fra, zho, tur |
form.media.photos | array | de 4 a 20 direcciones de fotos (cadenas o { "url": "..." }): obligatorio |
form.objectId | cadena | crear el paquete para su inmueble existente |
form.objectType | cadena | property, rental o complex |
form.propertyCategory | cadena | tipo de inmueble: apartment, house, penthouse, land, warehouse ... |
form.dealType | cadena | sale o rent |
form.title | cadena | título |
form.description | cadena | su descripción: se usa como base de hechos |
form.customDirection | cadena | preferencias de tono y énfasis, hasta 500 caracteres |
form.totalArea | número | m² |
form.rooms, form.floor, form.buildingFloors | número | habitaciones, planta, plantas |
form.landPlotArea | número | terreno, m² (casas) |
form.price | número | precio |
form.priceCurrency | cadena | moneda del precio |
form.addressCountry, form.addressCity, form.street, form.streetNumber | cadena | dirección |
form.voiceId | cadena | voz de la locución, de GET /voices |
form.enableSubtitles | sí/no | subtítulos en el vídeo, activados por defecto |
form.showPhone | sí/no | mostrar el teléfono; el número en form.contactPhone |
form.options.music.trackId | cadena | pista de GET /video/music; form.options.music.enabled: false, sin música |
form.options.endCard.style | cadena | tarjeta final: photo, solid o split |
No hace falta el campo user: el paquete se crea en nombre de la cuenta de la clave.
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": "spa",
"propertyCategory": "apartment", "dealType": "sale",
"title": "Piso luminoso de 2 habitaciones junto al parque",
"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"] }
}
}'
Respuesta 202: jobId (id del trabajo) y propertyId (el borrador del inmueble). El trabajo terminado (GET /content/generate/jobs/{id}) contiene:
| Campo | Descripción |
|---|---|
artifacts | ids de los archivos generados |
artifactsSummary | una entrada por archivo: tipo, formato, tamaño |
bundle | la página de aterrizaje y el PDF del paquete, si se crearon |
progress | el avance de la generación mientras el trabajo está en curso |
masterProfile | el guion base sobre el que se crearon los textos y la locución |
error | en un trabajo fallido: el motivo, como texto genérico |
Archivo: GET /artifacts/v1/ai/assistant/announcement/jobs/{jobId}/artifacts/{artifactId}/download. Eventos: content.completed, content.partial (algunos archivos fallaron), content.failed. Menos de 4 fotos, 400.
Textos del anuncio
POST /text/generate: ámbito tools:text. Una descripción, una presentación y una publicación para redes. Se necesita objectId o al menos uno de description, city, totalArea; si no, 422 con code: not_enough_input.
| Campo | Tipo | Descripción |
|---|---|---|
objectId | cadena | su inmueble (o el de su agencia) |
title | cadena | hasta 120 caracteres |
description | cadena | su descripción, hasta 2000 caracteres |
city | cadena | ciudad |
totalArea | número | m² |
rooms | número | habitaciones |
price | número | precio |
currency | cadena | moneda del precio |
propertyCategory | cadena | tipo de inmueble |
language | cadena | en (por defecto), ru, ua, de, es, az, ar, fr, zh, tr |
customDirection | cadena | preferencias de tono y énfasis; un texto más largo se recorta a 500 caracteres |
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":"es","description":"Reformado, patio tranquilo, a 5 minutos del metro."}'
202 con jobId. Los textos están en los archivos del trabajo, como en el paquete de contenido; el trabajo lleva además progress, masterProfile y error. Eventos: text.completed / text.failed.
Vídeo a partir de fotos
POST /video/create: ámbito tools:video. Un vídeo corto con locución a partir de sus fotos o de las fotos de un inmueble.
Cuerpo: multipart/form-data, cada opción como campo de formulario propio (no JSON en un campo data):
| Campo | Descripción |
|---|---|
photos | archivos de fotos, de 1 a 8, una parte por archivo; con objectId no hace falta; JPEG, PNG, WebP o HEIC de hasta 20 MB cada una; las fotos después de la 8.ª no se usan |
objectId | tomar fotos y datos de su inmueble |
prompt | de qué trata el clip, hasta 500 caracteres; obligatorio sin objectId; un texto más largo se recorta |
title | título, hasta 120 caracteres |
length | short (por defecto) o long; otro valor se toma como short; long necesita al menos 4 fotos (code: long_needs_more_photos) |
aspect | 9:16, 1:1 o 16:9; otro valor: el predeterminado |
language | idioma de la locución: en, ru, ua, de, es, az, ar, fr, zh, tr |
narration | true (por defecto): con locución |
voiceId | voz de GET /voices |
enableSubtitles | subtítulos |
musicEnabled | con música |
musicTrackId | pista de GET /video/music |
musicVolume | volumen de la música, de 0 a 100 |
music | su propio archivo de música en lugar de una pista |
endCardEnabled, endCardStyle | tarjeta final: photo, solid o split |
ctaMode | frase final: auto (por defecto), elegida para el inmueble; manual, se usa ctaIntent o ctaText |
ctaIntent | una frase final lista: uno de los valores intent de GET /video/endings |
ctaText | su propia frase final, hasta 60 caracteres |
ctaMarket | a quién se dirige el vídeo: local, remote o international; ajusta la frase auto |
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=Piso soleado de 2 habitaciones en Berlin Mitte, patio tranquilo" \
-F "length=short" -F "aspect=9:16" -F "language=es"
202 con jobId; el vídeo está en los archivos del trabajo. El trabajo lleva además progress, masterProfile y error, como el paquete de contenido. El precio depende de length. Eventos: video.completed / video.failed.
Vídeo con avatar
POST /avatar/video: ámbito tools:avatar. Un presentador habla de su inmueble.
| Campo | Tipo | Descripción |
|---|---|---|
avatarId | cadena | obligatorio: un avatar con estado ready de GET /avatar/avatars |
objectId | cadena | obligatorio: su inmueble |
scriptText | cadena | obligatorio: el texto del presentador, al menos 100 caracteres; como máximo 1200 |
voiceId | cadena | voz de GET /voices |
language | cadena | idioma |
background.type | cadena | fondo: color, photo o slideshow |
background.color | cadena | color de fondo #RRGGBB |
background.photoUrl | cadena | foto de fondo |
dimension.width, dimension.height | número | tamaño del encuadre, de 100 a 4096 px; envíe ambos o ninguno |
enableSubtitles | sí/no | subtítulos |
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 con jobId. Vídeo: GET /artifacts/v1/ai/assistant/avatar/jobs/{jobId}/artifacts/{artifactId}/download, con el artifactId de artifacts del trabajo terminado. Eventos: avatar.completed / avatar.failed. Si faltan avatarId u objectId o el texto es corto, 400 con los campos en errors.
Artículos relacionados
- Datos de referencia: voces, avatares, música, frases finales.
- Trabajos y resultados: estados y archivos.
- Archivos: subir fotos.