[{"data":1,"prerenderedAt":166},["ShallowReactive",2],{"page:\u002Fpublishing":3},{"id":4,"title":5,"body":6,"description":156,"extension":157,"meta":158,"navigation":159,"operation":160,"path":161,"rawbody":162,"seo":163,"stem":164,"__hash__":165},"docs\u002Fpublishing.md","Publishing properties",{"type":7,"value":8,"toc":148},"minimark",[9,13,16,21,77,99,103,106,109,113,120],[10,11,12],"p",{},"Publishing is a backend operation. The CRM keeps original images; websites, the external catalogue, the public portal and PDF exports use separate watermarked copies.",[10,14,15],{},"Existing photos grandfathered during migration retain unmarked copies with independent public URLs. New uploads still receive\nwatermarks, including new photos added to an existing property. This exception cannot be requested through the API.",[17,18,20],"h2",{"id":19},"integration-flow","Integration flow",[22,23,24,33,40,52,63],"ol",{},[25,26,27,32],"li",{},[28,29,31],"a",{"href":30},"\u002Fleads\u002Fcreate","Create a contact"," if the property needs a holder. Contacts are private CRM records, not public listings.",[25,34,35,39],{},[28,36,38],{"href":37},"\u002Fproperties\u002Fcreate","Create a property"," with its operation, price, location privacy, area and characteristics. Save the returned ID.",[25,41,42,46,47,51],{},[28,43,45],{"href":44},"\u002Fproperties\u002Fuploads","Prepare uploads",", PUT each accepted photo to its temporary upload URL, and ",[28,48,50],{"href":49},"\u002Fproperties\u002Fcomplete-uploads","complete the session",".",[25,53,54,58,59,51],{},[28,55,57],{"href":56},"\u002Fproperties\u002Fpublication","Request publication"," with ",[60,61,62],"code",{},"published: true",[25,64,65,69,70,72,73,51],{},[28,66,68],{"href":67},"\u002Fproperties\u002Fpublication-status","Poll status"," until ",[60,71,62],{},", or handle a failed job. Then ",[28,74,76],{"href":75},"\u002Fproperties\u002Fretrieve","retrieve the listing",[10,78,79,80,83,84,87,88,91,92,95,96,51],{},"Give an importer ",[60,81,82],{},"properties:write",", ",[60,85,86],{},"properties:publish"," and optionally ",[60,89,90],{},"leads:write",". A public website needs only ",[60,93,94],{},"properties:read"," and, for contact forms, ",[60,97,98],{},"leads:ingest",[17,100,102],{"id":101},"photo-protection","Photo protection",[10,104,105],{},"The workspace's logo is centered and translucent. If no customer logo exists, a small Vestta SVG mark appears at the bottom right. URLs and image IDs are random and independent from the original. Public responses contain neither private paths nor original filenames.",[10,107,108],{},"If processing fails, no original photo is substituted. Downloads from the authenticated CRM remain unmarked. Preparing a PDF's marked photos does not publish the property.",[17,110,112],{"id":111},"migration-from-the-old-api","Migration from the old API",[10,114,115,116,119],{},"The only API base is now ",[60,117,118],{},"https:\u002F\u002Fapi.vestta.io\u002Fv1","; the former mount has been removed. Update your integration's base URL before switching traffic. Existing API keys keep their scopes: write and publish permissions must be explicitly granted on a new key.",[10,121,122,123,126,127,130,131,134,135,138,139,142,143,138,145,51],{},"Errors now use ",[60,124,125],{},"application\u002Fproblem+json",", valid keys without permission receive ",[60,128,129],{},"403",", and ",[60,132,133],{},"count"," is the total on both list resources. Response envelopes stay ",[60,136,137],{},"status"," plus ",[60,140,141],{},"data"," for reads; creates and updates return ",[60,144,137],{},[60,146,147],{},"id",{"title":149,"searchDepth":150,"depth":150,"links":151},"",3,[152,154,155],{"id":19,"depth":153,"text":20},2,{"id":101,"depth":153,"text":102},{"id":111,"depth":153,"text":112},"Create a listing, upload original photos and publish marked images safely.","md",{},true,null,"\u002Fpublishing","---\ntitle: Publishing properties\ndescription: Create a listing, upload original photos and publish marked images safely.\n---\n\nPublishing is a backend operation. The CRM keeps original images; websites, the external catalogue, the public portal and PDF exports use separate watermarked copies.\n\nExisting photos grandfathered during migration retain unmarked copies with independent public URLs. New uploads still receive\nwatermarks, including new photos added to an existing property. This exception cannot be requested through the API.\n\n## Integration flow\n\n1. [Create a contact](\u002Fleads\u002Fcreate) if the property needs a holder. Contacts are private CRM records, not public listings.\n2. [Create a property](\u002Fproperties\u002Fcreate) with its operation, price, location privacy, area and characteristics. Save the returned ID.\n3. [Prepare uploads](\u002Fproperties\u002Fuploads), PUT each accepted photo to its temporary upload URL, and [complete the session](\u002Fproperties\u002Fcomplete-uploads).\n4. [Request publication](\u002Fproperties\u002Fpublication) with `published: true`.\n5. [Poll status](\u002Fproperties\u002Fpublication-status) until `published: true`, or handle a failed job. Then [retrieve the listing](\u002Fproperties\u002Fretrieve).\n\nGive an importer `properties:write`, `properties:publish` and optionally `leads:write`. A public website needs only `properties:read` and, for contact forms, `leads:ingest`.\n\n## Photo protection\n\nThe workspace's logo is centered and translucent. If no customer logo exists, a small Vestta SVG mark appears at the bottom right. URLs and image IDs are random and independent from the original. Public responses contain neither private paths nor original filenames.\n\nIf processing fails, no original photo is substituted. Downloads from the authenticated CRM remain unmarked. Preparing a PDF's marked photos does not publish the property.\n\n## Migration from the old API\n\nThe only API base is now `https:\u002F\u002Fapi.vestta.io\u002Fv1`; the former mount has been removed. Update your integration's base URL before switching traffic. Existing API keys keep their scopes: write and publish permissions must be explicitly granted on a new key.\n\nErrors now use `application\u002Fproblem+json`, valid keys without permission receive `403`, and `count` is the total on both list resources. Response envelopes stay `status` plus `data` for reads; creates and updates return `status` plus `id`.\n",{"title":5,"description":156},"publishing","TLNDYxVfvhCjnLbLaprpAaS20Q5IbxSrryisZG4piOQ",1791929309383]