What the Velisto API does for agencies and CRMs, and how to make your first calls.
The Velisto API lets your own code work with Velisto. Push listings in from your CRM or website, design images from Velisto’s templates, and make and schedule posts for your social channels. Webhooks tell your server as things happen. Every answer is JSON.
These guides explain how it works. The reference lists every call, with what it takes and what it answers.
Send each listing with Create or update a listing, under your CRM’s own id. The first call adds it, and the next ones update it. When a listing sells, Velisto can make a “Just sold” post for you to approve. See Listings from a CRM.
Make posts with Create a post: as a draft, for a time, in the next free posting time, or now. One post can go to many channels, each with its own text and settings. See Posting.
Pick a template, render it with a listing’s photos and details, and use the images in a post. Or write a design of your own and save it as a template. See Templates and rendering.
A webhook sends a message to your server when a listing changes, a post goes out or fails, a design is ready, or a channel needs reconnecting. See Webhooks.
Use Velisto from Zapier, Make and n8n, with their own tools for calling an API and catching webhooks. See Zapier, Make and n8n.
Read a channel’s daily numbers and a post’s numbers, from what Velisto has already stored. See Analytics.
Every call goes to an address under this base URL:
https://api.velisto.ai/v1
So GET /me means GET https://api.velisto.ai/v1/me. Most calls are about one workspace, and their addresses start with /workspaces/{workspace}, where {workspace} is its id. These guides write that part as …, so …/posts means https://api.velisto.ai/v1/workspaces/{workspace}/posts.
GET /me
GET https://api.velisto.ai/v1/me
/workspaces/{workspace}
{workspace}
…
…/posts
https://api.velisto.ai/v1/workspaces/{workspace}/posts
Content-Type: application/json
42
01k9zq5d6e7f8g9h0j1k2m3n4p
2026-11-12T09:30:00Z
data
These docs are at https://developers.velisto.ai.
vl_live_
Authorization
curl https://api.velisto.ai/v1/me \ -H "Authorization: Bearer vl_live_xxxxxxxxxxxx" \ -H "Accept: application/json"
The answer names the key, its account, the person who made it and the ids of the workspaces it can reach:
{ "data": { "key": { "id": "01k9zq5d6e7f8g9h0j1k2m3n4p", "name": "Our CRM", "access": "write", "all_workspaces": true, "created_at": "2026-11-08T09:30:00Z", "analytics": false }, "account": { "id": 7, "name": "Harbour Realty", "plan": "team", "read_only": false, "trial": false, "limits": { "listings": null, "social_connections": 10, "workspaces": 3, "seats": 5 } }, "maker": { "id": 12, "name": "Sara Khan", "email": "sara@example.com" }, "workspace_ids": [42] } }
my-crm
A-1001
curl -X PUT https://api.velisto.ai/v1/workspaces/42/listings/external/my-crm/A-1001 \ -H "Authorization: Bearer vl_live_xxxxxxxxxxxx" \ -H "Content-Type: application/json" \ -d '{ "title": "Sea-view apartment in Marina Bay", "price": 450000, "currency": "EUR", "beds": 3, "baths": 2, "status": "For Sale", "status_kind": "active", "photos": ["https://crm.example.com/photos/a-1001-front.jpg"] }'
The answer is 201 with the listing the first time, and 200 after that. Keep its id.
201
200
id
GET …/channels
curl https://api.velisto.ai/v1/workspaces/42/posts \ -H "Authorization: Bearer vl_live_xxxxxxxxxxxx" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: 5f0c7a52-2f8e-4c1b-9a37-1d6b2e4f8c90" \ -d '{ "mode": "schedule", "channel_ids": [318], "scheduled_at": "2026-11-12T09:30:00+01:00", "listing_id": 1207, "text": "Just listed: a sea-view apartment in Marina Bay." }'
Keys only ever go in the Authorization header, never in the address.