DevelopersAPI reference

Properties API

REST endpoints for properties in SKUFlow: 8 operations with parameters, request and response fields, permissions and curl examples.

Base URL: https://app.skuflow.ai/api. Every call needs Authorization: Bearer skf_… (Authentication); {organizationId} ($ORGANIZATION_ID in the examples) is your business's id.

OperationEndpointRisk
List addresses (properties)GET /organizations/{organizationId}/propertiesread
Create an address (property)POST /organizations/{organizationId}/propertieswrite
Get an address (property) with its linked customers over timeGET /organizations/{organizationId}/properties/{propertyId}read
Update an address (property)PATCH /organizations/{organizationId}/properties/{propertyId}write
Link a customer to an address (property)POST /organizations/{organizationId}/properties/{propertyId}/occupancieswrite
Change a current occupant's role or make them primaryPATCH /organizations/{organizationId}/properties/{propertyId}/occupancies/{occupancyId}write
End a customer's link to an address (property)POST /organizations/{organizationId}/properties/{propertyId}/occupancies/{occupancyId}/endwrite
Hand an address (property) over to another customerPOST /organizations/{organizationId}/properties/{propertyId}/transferwrite

List addresses (properties)

GET /organizations/{organizationId}/properties

Properties (customer addresses: ship-to / delivery locations) with their current occupants, filtered by text, type, tag, or customerId (that customer's current addresses); paged with a total. Read-only.

Permissionproperties.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolproperties_list (toolset customers, in the default set)

Parameters

NameInTypeRequiredDescription
queryquerystringNoFree-text search over the list's names, numbers and contact details. Up to 200 characters.
customerIdquerystringNo
propertyTypequeryenumNoOne of RESIDENTIAL, COMMERCIAL, MULTI_FAMILY, INDUSTRIAL.
tagquerystringNoUp to 200 characters.
limitqueryintegerNoPage size, 1–200. Default 50.
offsetqueryintegerNoRows to skip; the answer's total counts every match. Default 0.

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/properties" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
itemsarray of object
items[].idstringProperty id.
items[].organizationIdstring
items[].namestring or null
items[].addressstring or null
items[].address2string or null
items[].citystring or null
items[].countystring or nullCounty, for tax rules that name one.
items[].statestring or null
items[].zipstring or null
items[].countrystring or null
items[].propertyTypeenumOne of RESIDENTIAL, COMMERCIAL, MULTI_FAMILY, INDUSTRIAL.
items[].contactNamestring or nullWho receives deliveries at this address.
items[].contactPhonestring or null
items[].contactEmailstring or null
items[].timezonestringIANA timezone of the property.
items[].accessInstructionsstring or nullDelivery or drop-off instructions for this address.
items[].tagsarray of string
items[].taxRatenumber or nullTax rate in percent for sales shipped here, overriding the tax rules; null = the business's tax rules for the address.
items[].customFieldsanyCustom field values by key (definitions: GET /custom-fields).
items[].createdAtstring (date-time)
items[].updatedAtstring (date-time)
items[].occupanciesarray of objectCurrent occupants, primary first.
items[].occupancies[].idstringOccupancy id (for PATCH …/occupancies/{occupancyId}).
items[].occupancies[].propertyIdstring
items[].occupancies[].customerIdstring
items[].occupancies[].roleenumOne of OWNER, TENANT, LANDLORD, PROPERTY_MANAGER.
items[].occupancies[].isPrimarybooleanThe property's primary current occupant.
items[].occupancies[].startedOnstringFirst day of the link, YYYY-MM-DD.
items[].occupancies[].endedOnstring or nullLast day, YYYY-MM-DD; null = current.
items[].occupancies[].createdAtstring (date-time)
items[].occupancies[].customerobject
totalintegerHow many match the filters, across all pages.

Create an address (property)

POST /organizations/{organizationId}/properties

Creates a property (a customer address, e.g. a ship-to or delivery location). With customerId it is linked to that customer from startedOn or today (default role OWNER, primary). Returns the property.

Permissionproperties.write (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolproperties_create (toolset customers, in the default set)

Request body

FieldTypeRequiredDescription
namestring or nullNoUp to 500 characters.
addressstring or nullNoUp to 500 characters.
address2string or nullNoUp to 500 characters.
citystring or nullNoUp to 500 characters.
countystring or nullNoCounty (or parish), for tax rules that name one. Up to 500 characters.
statestring or nullNoUp to 500 characters.
zipstring or nullNoUp to 500 characters.
countrystring or nullNoUp to 500 characters.
propertyTypeenumNoOne of RESIDENTIAL, COMMERCIAL, MULTI_FAMILY, INDUSTRIAL.
contactNamestring or nullNoUp to 500 characters.
contactPhonestring or nullNoUp to 500 characters.
contactEmailempty string or string (email) or nullNo
timezonestringNoAn IANA timezone, e.g. America/Chicago. Up to 100 characters.
accessInstructionsstring or nullNoDelivery or drop-off instructions for this address. Up to 5000 characters.
tagsarray of stringNoUp to 100 items.
taxRatenumber or nullNoTax rate in percent for sales shipped here; null = the business default. -1000–1000.
customFieldsobjectNo
customerIdstringNo
roleenumNoOne of OWNER, TENANT, LANDLORD, PROPERTY_MANAGER.
startedOnstringNoA calendar date in the business's own calendar, YYYY-MM-DD.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/properties" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Whitfield","address":"string","address2":"string"}'

Response

201: the answer's fields
FieldTypeDescription
idstringProperty id.
organizationIdstring
namestring or null
addressstring or null
address2string or null
citystring or null
countystring or nullCounty, for tax rules that name one.
statestring or null
zipstring or null
countrystring or null
propertyTypeenumOne of RESIDENTIAL, COMMERCIAL, MULTI_FAMILY, INDUSTRIAL.
contactNamestring or nullWho receives deliveries at this address.
contactPhonestring or null
contactEmailstring or null
timezonestringIANA timezone of the property.
accessInstructionsstring or nullDelivery or drop-off instructions for this address.
tagsarray of string
taxRatenumber or nullTax rate in percent for sales shipped here, overriding the tax rules; null = the business's tax rules for the address.
customFieldsanyCustom field values by key (definitions: GET /custom-fields).
createdAtstring (date-time)
updatedAtstring (date-time)

Get an address (property) with its linked customers over time

GET /organizations/{organizationId}/properties/{propertyId}

One property (customer address) with every occupancy (owner, tenant … with dates) and custom fields. Read-only.

Permissionproperties.read (Owner, Admin, Staff, Member)
Riskread, OAuth scope skuflow.read. Read: reads only.
MCP toolproperties_get (toolset customers)

Parameters

NameInTypeRequiredDescription
propertyIdpathstringYes

Example

curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/properties/{propertyId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY"

Response

200: the answer's fields
FieldTypeDescription
idstringProperty id.
organizationIdstring
namestring or null
addressstring or null
address2string or null
citystring or null
countystring or nullCounty, for tax rules that name one.
statestring or null
zipstring or null
countrystring or null
propertyTypeenumOne of RESIDENTIAL, COMMERCIAL, MULTI_FAMILY, INDUSTRIAL.
contactNamestring or nullWho receives deliveries at this address.
contactPhonestring or null
contactEmailstring or null
timezonestringIANA timezone of the property.
accessInstructionsstring or nullDelivery or drop-off instructions for this address.
tagsarray of string
taxRatenumber or nullTax rate in percent for sales shipped here, overriding the tax rules; null = the business's tax rules for the address.
customFieldsanyCustom field values by key (definitions: GET /custom-fields).
createdAtstring (date-time)
updatedAtstring (date-time)
occupanciesarray of objectEvery occupancy, current ones first (endedOn null), then past ones.
occupancies[].idstringOccupancy id (for PATCH …/occupancies/{occupancyId}).
occupancies[].propertyIdstring
occupancies[].customerIdstring
occupancies[].roleenumOne of OWNER, TENANT, LANDLORD, PROPERTY_MANAGER.
occupancies[].isPrimarybooleanThe property's primary current occupant.
occupancies[].startedOnstringFirst day of the link, YYYY-MM-DD.
occupancies[].endedOnstring or nullLast day, YYYY-MM-DD; null = current.
occupancies[].createdAtstring (date-time)
occupancies[].customerobject
occupancies[].customer.idstringCustomer id.
occupancies[].customer.namestring
occupancies[].customer.typeenumOne of RESIDENTIAL, COMMERCIAL.
occupancies[].customer.phonestring or null
occupancies[].customer.emailstring or null

Update an address (property)

PATCH /organizations/{organizationId}/properties/{propertyId}

Changes the fields sent (address, delivery instructions, tax rate, custom fields …). Returns the property.

Permissionproperties.write (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolproperties_update (toolset customers)

Parameters

NameInTypeRequiredDescription
propertyIdpathstringYes

Request body

FieldTypeRequiredDescription
namestring or nullNoUp to 500 characters.
addressstring or nullNoUp to 500 characters.
address2string or nullNoUp to 500 characters.
citystring or nullNoUp to 500 characters.
countystring or nullNoCounty (or parish), for tax rules that name one. Up to 500 characters.
statestring or nullNoUp to 500 characters.
zipstring or nullNoUp to 500 characters.
countrystring or nullNoUp to 500 characters.
propertyTypeenumNoOne of RESIDENTIAL, COMMERCIAL, MULTI_FAMILY, INDUSTRIAL.
contactNamestring or nullNoUp to 500 characters.
contactPhonestring or nullNoUp to 500 characters.
contactEmailempty string or string (email) or nullNo
timezonestringNoAn IANA timezone, e.g. America/Chicago. Up to 100 characters.
accessInstructionsstring or nullNoDelivery or drop-off instructions for this address. Up to 5000 characters.
tagsarray of stringNoUp to 100 items.
taxRatenumber or nullNoTax rate in percent for sales shipped here; null = the business default. -1000–1000.
customFieldsobjectNo

Example

curl -X PATCH "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/properties/{propertyId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"name":"Dana Whitfield","address":"string","address2":"string"}'

Response

200: the answer's fields
FieldTypeDescription
idstringProperty id.
organizationIdstring
namestring or null
addressstring or null
address2string or null
citystring or null
countystring or nullCounty, for tax rules that name one.
statestring or null
zipstring or null
countrystring or null
propertyTypeenumOne of RESIDENTIAL, COMMERCIAL, MULTI_FAMILY, INDUSTRIAL.
contactNamestring or nullWho receives deliveries at this address.
contactPhonestring or null
contactEmailstring or null
timezonestringIANA timezone of the property.
accessInstructionsstring or nullDelivery or drop-off instructions for this address.
tagsarray of string
taxRatenumber or nullTax rate in percent for sales shipped here, overriding the tax rules; null = the business's tax rules for the address.
customFieldsanyCustom field values by key (definitions: GET /custom-fields).
createdAtstring (date-time)
updatedAtstring (date-time)

Link a customer to an address (property)

POST /organizations/{organizationId}/properties/{propertyId}/occupancies

Links a customer to the property as owner, tenant, landlord or property manager from a date. A new primary demotes the current one. Returns the occupancy.

Permissionproperties.write (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolproperties_addOccupant (toolset customers)

Parameters

NameInTypeRequiredDescription
propertyIdpathstringYes

Request body

FieldTypeRequiredDescription
customerIdstringYes
roleenumNoOne of OWNER, TENANT, LANDLORD, PROPERTY_MANAGER.
isPrimarybooleanNo
startedOnstringNoA calendar date in the business's own calendar, YYYY-MM-DD.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/properties/{propertyId}/occupancies" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"customerId":"customer_id"}'

Response

201: the answer's fields
FieldTypeDescription
idstringOccupancy id (for PATCH …/occupancies/{occupancyId}).
propertyIdstring
customerIdstring
roleenumOne of OWNER, TENANT, LANDLORD, PROPERTY_MANAGER.
isPrimarybooleanThe property's primary current occupant.
startedOnstringFirst day of the link, YYYY-MM-DD.
endedOnstring or nullLast day, YYYY-MM-DD; null = current.
createdAtstring (date-time)

Change a current occupant's role or make them primary

PATCH /organizations/{organizationId}/properties/{propertyId}/occupancies/{occupancyId}

Changes an open occupancy's role and/or makes it the primary one. Occupancy ids come from GET /properties/{propertyId}.

Permissionproperties.write (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolproperties_updateOccupancy (toolset customers)

Parameters

NameInTypeRequiredDescription
propertyIdpathstringYes
occupancyIdpathstringYes

Request body

FieldTypeRequiredDescription
roleenumNoOne of OWNER, TENANT, LANDLORD, PROPERTY_MANAGER.
isPrimarybooleanNo

Example

curl -X PATCH "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/properties/{propertyId}/occupancies/{occupancyId}" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"role":"OWNER","isPrimary":true}'

Response

200: the answer's fields
FieldTypeDescription
idstringOccupancy id (for PATCH …/occupancies/{occupancyId}).
propertyIdstring
customerIdstring
roleenumOne of OWNER, TENANT, LANDLORD, PROPERTY_MANAGER.
isPrimarybooleanThe property's primary current occupant.
startedOnstringFirst day of the link, YYYY-MM-DD.
endedOnstring or nullLast day, YYYY-MM-DD; null = current.
createdAtstring (date-time)

End a customer's link to an address (property)

POST /organizations/{organizationId}/properties/{propertyId}/occupancies/{occupancyId}/end

Ends the customer's link on endedOn (default today). The history row stays; the next current occupant becomes primary.

Permissionproperties.write (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolproperties_endOccupancy (toolset customers)

Parameters

NameInTypeRequiredDescription
propertyIdpathstringYes
occupancyIdpathstringYes

Request body

FieldTypeRequiredDescription
endedOnstringNoA calendar date in the business's own calendar, YYYY-MM-DD.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/properties/{propertyId}/occupancies/{occupancyId}/end" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"endedOn":"2026-11-03"}'

Response

200: the answer's fields
FieldTypeDescription
idstringOccupancy id (for PATCH …/occupancies/{occupancyId}).
propertyIdstring
customerIdstring
roleenumOne of OWNER, TENANT, LANDLORD, PROPERTY_MANAGER.
isPrimarybooleanThe property's primary current occupant.
startedOnstringFirst day of the link, YYYY-MM-DD.
endedOnstring or nullLast day, YYYY-MM-DD; null = current.
createdAtstring (date-time)

Hand an address (property) over to another customer

POST /organizations/{organizationId}/properties/{propertyId}/transfer

When an address changes hands (a customer moves out, a business is sold): ends every current link on onDate (default today) and makes toCustomerId the primary occupant. Notes, files and history stay with the property. Returns the new occupancy.

Permissionproperties.write (Owner, Admin, Staff)
Riskwrite, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it.
MCP toolproperties_transfer (toolset customers)

Parameters

NameInTypeRequiredDescription
propertyIdpathstringYes

Request body

FieldTypeRequiredDescription
toCustomerIdstringYes
roleenumNoOne of OWNER, TENANT, LANDLORD, PROPERTY_MANAGER.
onDatestringNoA calendar date in the business's own calendar, YYYY-MM-DD.

Example

curl -X POST "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/properties/{propertyId}/transfer" \
  -H "Authorization: Bearer $SKUFLOW_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"toCustomerId":"toCustomer_id"}'

Response

200: the answer's fields
FieldTypeDescription
idstringOccupancy id (for PATCH …/occupancies/{occupancyId}).
propertyIdstring
customerIdstring
roleenumOne of OWNER, TENANT, LANDLORD, PROPERTY_MANAGER.
isPrimarybooleanThe property's primary current occupant.
startedOnstringFirst day of the link, YYYY-MM-DD.
endedOnstring or nullLast day, YYYY-MM-DD; null = current.
createdAtstring (date-time)

On this page