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.
| Operation | Endpoint | Risk |
|---|---|---|
| List addresses (properties) | GET /organizations/{organizationId}/properties | read |
| Create an address (property) | POST /organizations/{organizationId}/properties | write |
| Get an address (property) with its linked customers over time | GET /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}/occupancies | write |
| Change a current occupant's role or make them primary | PATCH /organizations/{organizationId}/properties/{propertyId}/occupancies/{occupancyId} | write |
| End a customer's link to an address (property) | POST /organizations/{organizationId}/properties/{propertyId}/occupancies/{occupancyId}/end | write |
| Hand an address (property) over to another customer | POST /organizations/{organizationId}/properties/{propertyId}/transfer | write |
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.
| Permission | properties.read (Owner, Admin, Staff, Member) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | properties_list (toolset customers, in the default set) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
query | query | string | No | Free-text search over the list's names, numbers and contact details. Up to 200 characters. |
customerId | query | string | No | |
propertyType | query | enum | No | One of RESIDENTIAL, COMMERCIAL, MULTI_FAMILY, INDUSTRIAL. |
tag | query | string | No | Up to 200 characters. |
limit | query | integer | No | Page size, 1–200. Default 50. |
offset | query | integer | No | Rows 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
| Field | Type | Description |
|---|---|---|
items | array of object | |
items[].id | string | Property id. |
items[].organizationId | string | |
items[].name | string or null | |
items[].address | string or null | |
items[].address2 | string or null | |
items[].city | string or null | |
items[].county | string or null | County, for tax rules that name one. |
items[].state | string or null | |
items[].zip | string or null | |
items[].country | string or null | |
items[].propertyType | enum | One of RESIDENTIAL, COMMERCIAL, MULTI_FAMILY, INDUSTRIAL. |
items[].contactName | string or null | Who receives deliveries at this address. |
items[].contactPhone | string or null | |
items[].contactEmail | string or null | |
items[].timezone | string | IANA timezone of the property. |
items[].accessInstructions | string or null | Delivery or drop-off instructions for this address. |
items[].tags | array of string | |
items[].taxRate | number or null | Tax rate in percent for sales shipped here, overriding the tax rules; null = the business's tax rules for the address. |
items[].customFields | any | Custom field values by key (definitions: GET /custom-fields). |
items[].createdAt | string (date-time) | |
items[].updatedAt | string (date-time) | |
items[].occupancies | array of object | Current occupants, primary first. |
items[].occupancies[].id | string | Occupancy id (for PATCH …/occupancies/{occupancyId}). |
items[].occupancies[].propertyId | string | |
items[].occupancies[].customerId | string | |
items[].occupancies[].role | enum | One of OWNER, TENANT, LANDLORD, PROPERTY_MANAGER. |
items[].occupancies[].isPrimary | boolean | The property's primary current occupant. |
items[].occupancies[].startedOn | string | First day of the link, YYYY-MM-DD. |
items[].occupancies[].endedOn | string or null | Last day, YYYY-MM-DD; null = current. |
items[].occupancies[].createdAt | string (date-time) | |
items[].occupancies[].customer | object | |
total | integer | How 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.
| Permission | properties.write (Owner, Admin, Staff) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | properties_create (toolset customers, in the default set) |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string or null | No | Up to 500 characters. |
address | string or null | No | Up to 500 characters. |
address2 | string or null | No | Up to 500 characters. |
city | string or null | No | Up to 500 characters. |
county | string or null | No | County (or parish), for tax rules that name one. Up to 500 characters. |
state | string or null | No | Up to 500 characters. |
zip | string or null | No | Up to 500 characters. |
country | string or null | No | Up to 500 characters. |
propertyType | enum | No | One of RESIDENTIAL, COMMERCIAL, MULTI_FAMILY, INDUSTRIAL. |
contactName | string or null | No | Up to 500 characters. |
contactPhone | string or null | No | Up to 500 characters. |
contactEmail | empty string or string (email) or null | No | |
timezone | string | No | An IANA timezone, e.g. America/Chicago. Up to 100 characters. |
accessInstructions | string or null | No | Delivery or drop-off instructions for this address. Up to 5000 characters. |
tags | array of string | No | Up to 100 items. |
taxRate | number or null | No | Tax rate in percent for sales shipped here; null = the business default. -1000–1000. |
customFields | object | No | |
customerId | string | No | |
role | enum | No | One of OWNER, TENANT, LANDLORD, PROPERTY_MANAGER. |
startedOn | string | No | A 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
| Field | Type | Description |
|---|---|---|
id | string | Property id. |
organizationId | string | |
name | string or null | |
address | string or null | |
address2 | string or null | |
city | string or null | |
county | string or null | County, for tax rules that name one. |
state | string or null | |
zip | string or null | |
country | string or null | |
propertyType | enum | One of RESIDENTIAL, COMMERCIAL, MULTI_FAMILY, INDUSTRIAL. |
contactName | string or null | Who receives deliveries at this address. |
contactPhone | string or null | |
contactEmail | string or null | |
timezone | string | IANA timezone of the property. |
accessInstructions | string or null | Delivery or drop-off instructions for this address. |
tags | array of string | |
taxRate | number or null | Tax rate in percent for sales shipped here, overriding the tax rules; null = the business's tax rules for the address. |
customFields | any | Custom field values by key (definitions: GET /custom-fields). |
createdAt | string (date-time) | |
updatedAt | string (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.
| Permission | properties.read (Owner, Admin, Staff, Member) |
| Risk | read, OAuth scope skuflow.read. Read: reads only. |
| MCP tool | properties_get (toolset customers) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
propertyId | path | string | Yes |
Example
curl "https://app.skuflow.ai/api/organizations/$ORGANIZATION_ID/properties/{propertyId}" \
-H "Authorization: Bearer $SKUFLOW_API_KEY"Response
200: the answer's fields
| Field | Type | Description |
|---|---|---|
id | string | Property id. |
organizationId | string | |
name | string or null | |
address | string or null | |
address2 | string or null | |
city | string or null | |
county | string or null | County, for tax rules that name one. |
state | string or null | |
zip | string or null | |
country | string or null | |
propertyType | enum | One of RESIDENTIAL, COMMERCIAL, MULTI_FAMILY, INDUSTRIAL. |
contactName | string or null | Who receives deliveries at this address. |
contactPhone | string or null | |
contactEmail | string or null | |
timezone | string | IANA timezone of the property. |
accessInstructions | string or null | Delivery or drop-off instructions for this address. |
tags | array of string | |
taxRate | number or null | Tax rate in percent for sales shipped here, overriding the tax rules; null = the business's tax rules for the address. |
customFields | any | Custom field values by key (definitions: GET /custom-fields). |
createdAt | string (date-time) | |
updatedAt | string (date-time) | |
occupancies | array of object | Every occupancy, current ones first (endedOn null), then past ones. |
occupancies[].id | string | Occupancy id (for PATCH …/occupancies/{occupancyId}). |
occupancies[].propertyId | string | |
occupancies[].customerId | string | |
occupancies[].role | enum | One of OWNER, TENANT, LANDLORD, PROPERTY_MANAGER. |
occupancies[].isPrimary | boolean | The property's primary current occupant. |
occupancies[].startedOn | string | First day of the link, YYYY-MM-DD. |
occupancies[].endedOn | string or null | Last day, YYYY-MM-DD; null = current. |
occupancies[].createdAt | string (date-time) | |
occupancies[].customer | object | |
occupancies[].customer.id | string | Customer id. |
occupancies[].customer.name | string | |
occupancies[].customer.type | enum | One of RESIDENTIAL, COMMERCIAL. |
occupancies[].customer.phone | string or null | |
occupancies[].customer.email | string 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.
| Permission | properties.write (Owner, Admin, Staff) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | properties_update (toolset customers) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
propertyId | path | string | Yes |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
name | string or null | No | Up to 500 characters. |
address | string or null | No | Up to 500 characters. |
address2 | string or null | No | Up to 500 characters. |
city | string or null | No | Up to 500 characters. |
county | string or null | No | County (or parish), for tax rules that name one. Up to 500 characters. |
state | string or null | No | Up to 500 characters. |
zip | string or null | No | Up to 500 characters. |
country | string or null | No | Up to 500 characters. |
propertyType | enum | No | One of RESIDENTIAL, COMMERCIAL, MULTI_FAMILY, INDUSTRIAL. |
contactName | string or null | No | Up to 500 characters. |
contactPhone | string or null | No | Up to 500 characters. |
contactEmail | empty string or string (email) or null | No | |
timezone | string | No | An IANA timezone, e.g. America/Chicago. Up to 100 characters. |
accessInstructions | string or null | No | Delivery or drop-off instructions for this address. Up to 5000 characters. |
tags | array of string | No | Up to 100 items. |
taxRate | number or null | No | Tax rate in percent for sales shipped here; null = the business default. -1000–1000. |
customFields | object | No |
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
| Field | Type | Description |
|---|---|---|
id | string | Property id. |
organizationId | string | |
name | string or null | |
address | string or null | |
address2 | string or null | |
city | string or null | |
county | string or null | County, for tax rules that name one. |
state | string or null | |
zip | string or null | |
country | string or null | |
propertyType | enum | One of RESIDENTIAL, COMMERCIAL, MULTI_FAMILY, INDUSTRIAL. |
contactName | string or null | Who receives deliveries at this address. |
contactPhone | string or null | |
contactEmail | string or null | |
timezone | string | IANA timezone of the property. |
accessInstructions | string or null | Delivery or drop-off instructions for this address. |
tags | array of string | |
taxRate | number or null | Tax rate in percent for sales shipped here, overriding the tax rules; null = the business's tax rules for the address. |
customFields | any | Custom field values by key (definitions: GET /custom-fields). |
createdAt | string (date-time) | |
updatedAt | string (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.
| Permission | properties.write (Owner, Admin, Staff) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | properties_addOccupant (toolset customers) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
propertyId | path | string | Yes |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
customerId | string | Yes | |
role | enum | No | One of OWNER, TENANT, LANDLORD, PROPERTY_MANAGER. |
isPrimary | boolean | No | |
startedOn | string | No | A 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
| Field | Type | Description |
|---|---|---|
id | string | Occupancy id (for PATCH …/occupancies/{occupancyId}). |
propertyId | string | |
customerId | string | |
role | enum | One of OWNER, TENANT, LANDLORD, PROPERTY_MANAGER. |
isPrimary | boolean | The property's primary current occupant. |
startedOn | string | First day of the link, YYYY-MM-DD. |
endedOn | string or null | Last day, YYYY-MM-DD; null = current. |
createdAt | string (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}.
| Permission | properties.write (Owner, Admin, Staff) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | properties_updateOccupancy (toolset customers) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
propertyId | path | string | Yes | |
occupancyId | path | string | Yes |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
role | enum | No | One of OWNER, TENANT, LANDLORD, PROPERTY_MANAGER. |
isPrimary | boolean | No |
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
| Field | Type | Description |
|---|---|---|
id | string | Occupancy id (for PATCH …/occupancies/{occupancyId}). |
propertyId | string | |
customerId | string | |
role | enum | One of OWNER, TENANT, LANDLORD, PROPERTY_MANAGER. |
isPrimary | boolean | The property's primary current occupant. |
startedOn | string | First day of the link, YYYY-MM-DD. |
endedOn | string or null | Last day, YYYY-MM-DD; null = current. |
createdAt | string (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.
| Permission | properties.write (Owner, Admin, Staff) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | properties_endOccupancy (toolset customers) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
propertyId | path | string | Yes | |
occupancyId | path | string | Yes |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
endedOn | string | No | A 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
| Field | Type | Description |
|---|---|---|
id | string | Occupancy id (for PATCH …/occupancies/{occupancyId}). |
propertyId | string | |
customerId | string | |
role | enum | One of OWNER, TENANT, LANDLORD, PROPERTY_MANAGER. |
isPrimary | boolean | The property's primary current occupant. |
startedOn | string | First day of the link, YYYY-MM-DD. |
endedOn | string or null | Last day, YYYY-MM-DD; null = current. |
createdAt | string (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.
| Permission | properties.write (Owner, Admin, Staff) |
| Risk | write, OAuth scope skuflow.write. Write: creates or changes records inside the business; nothing leaves it. |
| MCP tool | properties_transfer (toolset customers) |
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
propertyId | path | string | Yes |
Request body
| Field | Type | Required | Description |
|---|---|---|---|
toCustomerId | string | Yes | |
role | enum | No | One of OWNER, TENANT, LANDLORD, PROPERTY_MANAGER. |
onDate | string | No | A 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
| Field | Type | Description |
|---|---|---|
id | string | Occupancy id (for PATCH …/occupancies/{occupancyId}). |
propertyId | string | |
customerId | string | |
role | enum | One of OWNER, TENANT, LANDLORD, PROPERTY_MANAGER. |
isPrimary | boolean | The property's primary current occupant. |
startedOn | string | First day of the link, YYYY-MM-DD. |
endedOn | string or null | Last day, YYYY-MM-DD; null = current. |
createdAt | string (date-time) |