Skip to main content
PATCH
/
api
/
v1
/
offerings
/
{id}
Update an offering
curl --request PATCH \
  --url https://app.vorel.ai/api/v1/offerings/{id} \
  --header 'Authorization: Bearer <token>' \
  --header 'Content-Type: application/json' \
  --data '
{
  "external_id": "<string>",
  "reference_number": "<string>",
  "title": "<string>",
  "title_ar": "<string>",
  "description": "<string>",
  "description_ar": "<string>",
  "attributes": {},
  "price": 1,
  "price_currency": "<string>",
  "address": "<string>",
  "photos": [
    "<string>"
  ],
  "status": "<string>",
  "available_from": "<string>"
}
'
{
  "id": "3c90c3cc-0d44-4b50-8888-8dd25736052a",
  "title": "<string>",
  "price": "<string>",
  "price_currency": "<string>",
  "photos": [
    "<string>"
  ],
  "status": "<string>",
  "created_at": "2023-11-07T05:31:56Z",
  "updated_at": "2023-11-07T05:31:56Z",
  "external_id": "<string>",
  "reference_number": "<string>",
  "title_ar": "<string>",
  "description": "<string>",
  "description_ar": "<string>",
  "attributes": {},
  "address": "<string>",
  "available_from": "2023-12-25"
}

Documentation Index

Fetch the complete documentation index at: https://docs.vorel.ai/llms.txt

Use this file to discover all available pages before exploring further.

Authorizations

Authorization
string
header
required

Tenant-issued API key. Format: vapk_live_<48 hex chars> (60 chars total). Issue + manage at /settings/integrations/api-keys in the Vorel dashboard. Each key has a scope set (read, leads:write, appointments:write, offerings:write); endpoints requiring a write scope reject keys without it with a 403 envelope.

Path Parameters

id
string<uuid>
required

UUID of the offering to update.

Body

application/json

Partial-update body for PATCH /api/v1/offerings/{id}. Must include at least one updatable field. Setting a nullable field to null clears it. attributes is shallow-MERGED into the existing JSONB; within the merge, a null attribute value DELETES that key. Soft-deleted offerings return 404 (mirrors the GET surface's exclusion). assigned_user_id, deleted_at, and metadata are NOT updatable. No webhook events are emitted (the canonical event union does not yet include offering.*).

external_id
string | null
Maximum string length: 120
reference_number
string | null
Maximum string length: 120
title
string
Required string length: 1 - 500
title_ar
string | null
Maximum string length: 500
description
string | null
Maximum string length: 10000
description_ar
string | null
Maximum string length: 10000
attributes
object
price
Required range: x >= 0
price_currency
string
Pattern: ^[A-Z]{3}$
address
string | null
Maximum string length: 500
photos
string<uri>[]
Maximum array length: 20
Maximum string length: 2048
status
string
Maximum string length: 40
available_from
string | null
Pattern: ^\d{4}-\d{2}-\d{2}$

Response

Offering updated.

id
string<uuid>
required
title
string
required
price
string
required

Decimal serialized as string to preserve precision for large values that lose accuracy as JS numbers. Caller can parseFloat() if they don't need the precision.

price_currency
string
required

ISO 4217 (e.g. AED, USD).

Required string length: 3
photos
string<uri>[]
required
status
string
required
created_at
string<date-time>
required
updated_at
string<date-time>
required
external_id
string | null
reference_number
string | null
title_ar
string | null
description
string | null
description_ar
string | null
attributes
object

Vertical-specific JSONB (real estate: bedrooms/area/etc.; salon: service_type/duration_minutes/etc.).

address
string | null
available_from
string<date> | null

YYYY-MM-DD, no time component.