Introduction
Showdigs API Documentation
Base URL: https://api.showdigs.com
This reference, the OpenAPI document, and llms.txt describe the same public /api/v1 surface. Endpoint paths and authentication behavior stay compatible across releases; correcting documentation hosts is not a breaking API change.
API operations
Operating rules for production integrations. Endpoint-specific request and response details remain in the groups below; this section does not replace them.
Credential lifecycle
- Create a public API token in integrations settings.
- Send it as
Authorization: Bearer {token}on authenticated requests (see Authenticating requests). - Store the token as a secret. Treat leakage as a credential incident: revoke the token in integrations settings and create a replacement.
- Rotate by creating a new token, updating your integration, then revoking the old token. Tokens are not recoverable after creation; only a new token can be issued.
- Revoking a token immediately rejects further requests that use it (
401).
Pagination
List endpoints that accept page and per_page use Laravel-style pagination:
| Query | Rules |
|---|---|
page |
Integer ≥ 1. Defaults to 1 when omitted. |
per_page |
Integer from 1 to 100. |
Successful list responses include a data array plus links (first, last, prev, next) and meta (current_page, per_page, from, to, and related fields).
Traversal:
- Start at
page=1(or omitpage). - Follow
links.nextwhile it is non-null, or incrementpageuntil a page returns fewer thanper_pageitems (or an emptydataarray). - Do not assume a stable total count across long-running crawls; re-query when you need a fresh snapshot.
Invalid page / per_page values return 422 with the standard error shape below.
Rate limits and retries
Most /api/v1 routes use the application api throttle: 180 requests per minute per client IP. Exceeding the limit returns HTTP 429.
When you receive 429:
- Honor the
Retry-Afterheader when present (seconds to wait). - Back off and retry with jitter; do not tight-loop.
- Keep concurrency modest; fan-out from many IPs to bypass limits is not a supported integration pattern.
Successful idempotent GETs may be retried after transient 5xx or network failures. For non-idempotent POST / PUT / DELETE, retry only when you can safely detect duplicates on your side (for example via your own idempotency keys or by re-reading created resources). The API does not currently document a request-level idempotency key header.
Errors
Prefer the JSON error bodies already shown on individual endpoints. Common shapes:
Unauthenticated (401)
{
"message": "Unauthenticated."
}
Validation or domain failure (422)
{
"message": "Validation error",
"errors": {
"field_name": [
"The field_name field is required."
]
}
}
Some domain failures return only { "message": "..." } at 422 without an errors object. Missing models on this API surface are typically expressed as 422 with a message such as Unit doesn't exist, not 404.
Rate limited (429)
Empty or framework default body; use status + Retry-After.
Do not parse HTML error pages. Always send Accept: application/json.
Versioning and deprecation
Public routes are versioned under /api/v1/.... Additive, non-breaking documentation and response field additions may ship without a new version. Breaking changes to paths, auth, or required fields require a new versioned prefix and advance notice through release notes. Until a successor version is published, treat /api/v1 as current.
Test environment
There is no separate public sandbox API host for third-party integrations today. Integrate against https://api.showdigs.com with credentials for a business you control. Do not point production traffic at local or .test hosts. Capabilities that are not listed in this reference or the OpenAPI document are unsupported regardless of what appears in staging UIs.
API release notes
Documentation freshness appears as “Last updated” on this page. Behavioral changes to the public API are called out in product/engineering release notes when they affect integrators. Before releasing an integration change, confirm /docs/, /docs.openapi, and /llms.txt all reflect the contract you coded against.
Authenticating requests
To authenticate requests, include an Authorization header with the value "Bearer {YOUR_AUTH_KEY}".
All authenticated endpoints are marked with a requires authentication badge in the documentation below.
You can retrieve your token by visiting your integrations settings page.
Agent Coverage
Endpoints for checking agent coverage.
Check location coverage
requires authentication
Returns the coverage status of a location. For better accuracy and performance, we recommend using the latitude and longitude parameters.
Example request:
curl --request GET \
--get "https://api.showdigs.com/api/v1/coverage?latitude=40.762569&longitude=-73.8314318&price=45" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://api.showdigs.com/api/v1/coverage"
);
const params = {
"latitude": "40.762569",
"longitude": "-73.8314318",
"price": "45",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$response = $client->get(
'https://api.showdigs.com/api/v1/coverage',
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'latitude' => '40.762569',
'longitude' => '-73.8314318',
'price' => '45',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://api.showdigs.com/api/v1/coverage'
params = {
'latitude': '40.762569',
'longitude': '-73.8314318',
'price': '45',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
{
"data": {
"probability": 0.87,
"is_covered": true,
"network": "primary"
}
}
Example response (422):
{
"message": "failed to match given address to a place"
}
Example response (424):
{
"message": "Unable to determine coverage at this time"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Units
Endpoints for managing units.
Get all units
requires authentication
Returns a paginated list of all units.
Example request:
curl --request GET \
--get "https://api.showdigs.com/api/v1/units?page=1&per_page=10" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://api.showdigs.com/api/v1/units"
);
const params = {
"page": "1",
"per_page": "10",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$response = $client->get(
'https://api.showdigs.com/api/v1/units',
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'page' => '1',
'per_page' => '10',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://api.showdigs.com/api/v1/units'
params = {
'page': '1',
'per_page': '10',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
{
"data": [
{
"id": "35d5abef-2e5d-46dc-a7ed-005d3ea3fcdc",
"timezone": "Asia/Jerusalem",
"name": null,
"short_address": "26432 Leuschke Throughway Apt. 227, Lake Noahberg",
"vicinity": "Lake Noahberg",
"location": {
"latitude": 32.064511,
"longitude": 34.897845
},
"size": null,
"bedrooms": null,
"bathrooms": null,
"listing_title": null,
"listing_description": null,
"amenities": [],
"is_showing": false,
"origin_id": null
},
{
"id": "ec54b498-a119-4ac3-97ef-de8502c28c70",
"timezone": "Asia/Jerusalem",
"name": null,
"short_address": "771 Padberg Expressway, Port Lethachester",
"vicinity": "Port Lethachester",
"location": {
"latitude": 32.024912,
"longitude": 34.883938
},
"size": null,
"bedrooms": null,
"bathrooms": null,
"listing_title": null,
"listing_description": null,
"amenities": [],
"is_showing": false,
"origin_id": null
}
],
"links": {
"first": "/?page=1",
"last": null,
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"current_page_url": "/?page=1",
"from": 1,
"path": "/",
"per_page": "10",
"to": 2
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get unit by uuid
requires authentication
Returns a specific unit by UUID.
Example request:
curl --request GET \
--get "https://api.showdigs.com/api/v1/units/e1d8e8da-36e5-4083-83db-1f2bd1e35c6a" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://api.showdigs.com/api/v1/units/e1d8e8da-36e5-4083-83db-1f2bd1e35c6a"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$response = $client->get(
'https://api.showdigs.com/api/v1/units/e1d8e8da-36e5-4083-83db-1f2bd1e35c6a',
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://api.showdigs.com/api/v1/units/e1d8e8da-36e5-4083-83db-1f2bd1e35c6a'
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200):
{
"data": {
"id": "286d0ce0-e3d4-45f6-8600-f0e20ea5691c",
"timezone": "Asia/Jerusalem",
"name": null,
"short_address": "27905 Fahey Wells, West Herberttown",
"vicinity": "West Herberttown",
"location": {
"latitude": 32.042066,
"longitude": 34.781538
},
"size": null,
"bedrooms": null,
"bathrooms": null,
"listing_title": null,
"listing_description": null,
"amenities": [],
"is_showing": false,
"origin_id": null
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Listings
Endpoints for managing listings.
Create a Listing
requires authentication
Example request:
curl --request POST \
"https://api.showdigs.com/api/v1/units/123e4567-e89b-12d3-a456-426614174000/listing" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data '{
"type": "architecto",
"agent_backup": false,
"only_consecutive_tours": false,
"property_link": "https://example.com/property",
"application_link": "https://example.com/application",
"manager_email": "manager@example.com",
"access_hardware": "keypad",
"access_code": "1234 (required for non smart access hardware such as lockboxes or keypads)",
"serial_number": "12345678 (required if `access_hardware` is set to smart device: Codebox, Sentrilock)",
"notes": "This is a sample listing.",
"tours_limit": 10,
"rent": 1000,
"security_deposit": 500,
"screening_template_uuid": "123e4567-e89b-12d3-a456-426614174000",
"schedule_template_uuid": "123e4567-e89b-12d3-a456-426614174000 (required if `type` is restricted)",
"ai_identity_verification": true,
"tenants": null,
"report_emails": null,
"availability_date": "2023-01-01",
"showing_start_date": "2023-01-01"
}'
const url = new URL(
"https://api.showdigs.com/api/v1/units/123e4567-e89b-12d3-a456-426614174000/listing"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"type": "architecto",
"agent_backup": false,
"only_consecutive_tours": false,
"property_link": "https:\/\/example.com\/property",
"application_link": "https:\/\/example.com\/application",
"manager_email": "manager@example.com",
"access_hardware": "keypad",
"access_code": "1234 (required for non smart access hardware such as lockboxes or keypads)",
"serial_number": "12345678 (required if `access_hardware` is set to smart device: Codebox, Sentrilock)",
"notes": "This is a sample listing.",
"tours_limit": 10,
"rent": 1000,
"security_deposit": 500,
"screening_template_uuid": "123e4567-e89b-12d3-a456-426614174000",
"schedule_template_uuid": "123e4567-e89b-12d3-a456-426614174000 (required if `type` is restricted)",
"ai_identity_verification": true,
"tenants": null,
"report_emails": null,
"availability_date": "2023-01-01",
"showing_start_date": "2023-01-01"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$response = $client->post(
'https://api.showdigs.com/api/v1/units/123e4567-e89b-12d3-a456-426614174000/listing',
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'type' => 'architecto',
'agent_backup' => false,
'only_consecutive_tours' => false,
'property_link' => 'https://example.com/property',
'application_link' => 'https://example.com/application',
'manager_email' => 'manager@example.com',
'access_hardware' => 'keypad',
'access_code' => '1234 (required for non smart access hardware such as lockboxes or keypads)',
'serial_number' => '12345678 (required if `access_hardware` is set to smart device: Codebox, Sentrilock)',
'notes' => 'This is a sample listing.',
'tours_limit' => 10,
'rent' => 1000,
'security_deposit' => 500,
'screening_template_uuid' => '123e4567-e89b-12d3-a456-426614174000',
'schedule_template_uuid' => '123e4567-e89b-12d3-a456-426614174000 (required if `type` is restricted)',
'ai_identity_verification' => true,
'tenants' => null,
'report_emails' => null,
'availability_date' => '2023-01-01',
'showing_start_date' => '2023-01-01',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://api.showdigs.com/api/v1/units/123e4567-e89b-12d3-a456-426614174000/listing'
payload = {
"type": "architecto",
"agent_backup": false,
"only_consecutive_tours": false,
"property_link": "https:\/\/example.com\/property",
"application_link": "https:\/\/example.com\/application",
"manager_email": "manager@example.com",
"access_hardware": "keypad",
"access_code": "1234 (required for non smart access hardware such as lockboxes or keypads)",
"serial_number": "12345678 (required if `access_hardware` is set to smart device: Codebox, Sentrilock)",
"notes": "This is a sample listing.",
"tours_limit": 10,
"rent": 1000,
"security_deposit": 500,
"screening_template_uuid": "123e4567-e89b-12d3-a456-426614174000",
"schedule_template_uuid": "123e4567-e89b-12d3-a456-426614174000 (required if `type` is restricted)",
"ai_identity_verification": true,
"tenants": null,
"report_emails": null,
"availability_date": "2023-01-01",
"showing_start_date": "2023-01-01"
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()Example response (201, success):
{
"unit_uuid": "123e4567-e89b-12d3-a456-426614174000",
"scheduling_url": "https://showdigs.co/x1Y2z3",
"pms_unit_id": "550e8400-e29b-41d4-a716-446655440000"
}
Example response (404, unit not found):
{
"message": "Unit not found"
}
Example response (422, validation error):
{
"message": "Validation error",
"errors": {
"field_name": [
"The field_name field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update a Listing
requires authentication
Update a listing by UUID param.
Example request:
curl --request PUT \
"https://api.showdigs.com/api/v1/units/6ff8f7f6-1eb3-3525-be4a-3932c805afed/listing" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data '{
"rent": 1500,
"security_deposit": 500,
"application_url": "https://application.com/123Main",
"notes": "Updated notes"
}'
const url = new URL(
"https://api.showdigs.com/api/v1/units/6ff8f7f6-1eb3-3525-be4a-3932c805afed/listing"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"rent": 1500,
"security_deposit": 500,
"application_url": "https:\/\/application.com\/123Main",
"notes": "Updated notes"
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$response = $client->put(
'https://api.showdigs.com/api/v1/units/6ff8f7f6-1eb3-3525-be4a-3932c805afed/listing',
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'rent' => 1500,
'security_deposit' => 500,
'application_url' => 'https://application.com/123Main',
'notes' => 'Updated notes',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://api.showdigs.com/api/v1/units/6ff8f7f6-1eb3-3525-be4a-3932c805afed/listing'
payload = {
"rent": 1500,
"security_deposit": 500,
"application_url": "https:\/\/application.com\/123Main",
"notes": "Updated notes"
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('PUT', url, headers=headers, json=payload)
response.json()Example response (200, success):
{
"message": "Listing updated successfully"
}
Example response (404, unit not found):
{
"message": "Unit not found"
}
Example response (422, unit is not listed):
{
"message": "Unit is not listed"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
List all listings
requires authentication
Returns a list of all listings.
Example request:
curl --request GET \
--get "https://api.showdigs.com/api/v1/listings" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://api.showdigs.com/api/v1/listings"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$response = $client->get(
'https://api.showdigs.com/api/v1/listings',
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://api.showdigs.com/api/v1/listings'
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200, Listings returned):
{
"data": {
"units": [
{
"id": "123e4567-e89b-12d3-a456-426614174000",
"property_id": 123,
"timezone": "America/Los_Angeles",
"name": "Unit 101",
"cover_image": "https://example.com/listing.jpg",
"market_name": "Seattle",
"short_address": "42 Florentia St, Seattle",
"vicinity": "Seattle",
"state": "WA",
"location": {
"latitude": 47.6512,
"longitude": -122.3519
},
"rent": 1800,
"size": 750,
"bedrooms": "1",
"bathrooms": 1,
"screening_criteria": {
"availability_date": "2026-08-01 00:00:00"
},
"is_high_availability": true,
"is_video_tours_supported": false,
"is_self_showing": false,
"is_open_house": false,
"is_publish_listing": false,
"scheduling_url": "https://showdigs.co/x1Y2z3",
"application_url": "https://example.com/apply",
"listing_url": "https://example.com/listing",
"pms_unit_id": "550e8400-e29b-41d4-a716-446655440000",
"pms_listing_id": "660e8400-e29b-41d4-a716-446655440001"
}
],
"business": {
"formatted_phone_number": "(206) 555-0100",
"email": "leasing@example.com",
"name": "Example Property Management",
"show_listing_apply_button": true,
"logo_url": "https://example.com/logo.png",
"website_url": "https://example.com",
"theme": {
"primary": "#1F2937"
}
}
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get listing by uuid
requires authentication
Returns a specific listing by UUID.
Please provide UUID for better accuracy and performance. UUID can be either Showdigs unit UUID or PMS listing ID.
Example request:
curl --request GET \
--get "https://api.showdigs.com/api/v1/listings/123e4567-e89b-12d3-a456-426614174000" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://api.showdigs.com/api/v1/listings/123e4567-e89b-12d3-a456-426614174000"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$response = $client->get(
'https://api.showdigs.com/api/v1/listings/123e4567-e89b-12d3-a456-426614174000',
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://api.showdigs.com/api/v1/listings/123e4567-e89b-12d3-a456-426614174000'
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200, Listing returned):
{
"data": {
"unit": {
"id": "123e4567-e89b-12d3-a456-426614174000",
"property_id": 123,
"timezone": "America/Los_Angeles",
"name": "Unit 101",
"cover_image": "https://example.com/listing.jpg",
"market_name": "Seattle",
"short_address": "42 Florentia St, Seattle",
"vicinity": "Seattle",
"state": "WA",
"location": {
"latitude": 47.6512,
"longitude": -122.3519
},
"rent": 1800,
"size": 750,
"bedrooms": "1",
"bathrooms": 1,
"screening_criteria": {
"availability_date": "2026-08-01 00:00:00"
},
"is_high_availability": true,
"is_video_tours_supported": false,
"is_self_showing": false,
"is_open_house": false,
"is_publish_listing": false,
"scheduling_url": "https://showdigs.co/x1Y2z3",
"application_url": "https://example.com/apply",
"listing_url": "https://example.com/listing",
"pms_unit_id": "550e8400-e29b-41d4-a716-446655440000",
"pms_listing_id": "660e8400-e29b-41d4-a716-446655440001"
},
"business": {
"formatted_phone_number": "(206) 555-0100",
"email": "leasing@example.com",
"name": "Example Property Management",
"show_listing_apply_button": true,
"logo_url": "https://example.com/logo.png",
"website_url": "https://example.com",
"theme": {
"primary": "#1F2937"
}
}
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Delete listing by uuid
requires authentication
Delete a listing by UUID param.
Please provide UUID for better accuracy and performance. The UUID can be either Showdigs unit UUID, PMS unit ID, or PMS listing ID.
Example request:
curl --request DELETE \
"https://api.showdigs.com/api/v1/listings/6ff8f7f6-1eb3-3525-be4a-3932c805afed" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://api.showdigs.com/api/v1/listings/6ff8f7f6-1eb3-3525-be4a-3932c805afed"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$response = $client->delete(
'https://api.showdigs.com/api/v1/listings/6ff8f7f6-1eb3-3525-be4a-3932c805afed',
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://api.showdigs.com/api/v1/listings/6ff8f7f6-1eb3-3525-be4a-3932c805afed'
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('DELETE', url, headers=headers)
response.json()Example response (200):
scenario { "message": "Listing deactivated successfully" }
Example response (404):
scenario { "message": "Unit not found" }
Example response (422):
scenario { "message": "Unit is not listed" } || { "message": "Some tours are planned to take place soon and can not be cancelled, try deactivating the listing after those tours are completed" }
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Inquiries
Endpoints for managing inquiries.
Create an inquiry
requires authentication
Creates a new inquiry.
Example request:
curl --request POST \
"https://api.showdigs.com/api/v1/inquiries" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data '{
"first_name": "John",
"last_name": "Doe",
"email": "johndoe@example.com",
"phone_number": "+123456789",
"property_interest": "42 florentia st, Seattle",
"listing_id": "1f06224c-1587-49ac-999f-5e9fcca35fac",
"campaign": "Summer Leasing Push"
}'
const url = new URL(
"https://api.showdigs.com/api/v1/inquiries"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"first_name": "John",
"last_name": "Doe",
"email": "johndoe@example.com",
"phone_number": "+123456789",
"property_interest": "42 florentia st, Seattle",
"listing_id": "1f06224c-1587-49ac-999f-5e9fcca35fac",
"campaign": "Summer Leasing Push"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$response = $client->post(
'https://api.showdigs.com/api/v1/inquiries',
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'first_name' => 'John',
'last_name' => 'Doe',
'email' => 'johndoe@example.com',
'phone_number' => '+123456789',
'property_interest' => '42 florentia st, Seattle',
'listing_id' => '1f06224c-1587-49ac-999f-5e9fcca35fac',
'campaign' => 'Summer Leasing Push',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://api.showdigs.com/api/v1/inquiries'
payload = {
"first_name": "John",
"last_name": "Doe",
"email": "johndoe@example.com",
"phone_number": "+123456789",
"property_interest": "42 florentia st, Seattle",
"listing_id": "1f06224c-1587-49ac-999f-5e9fcca35fac",
"campaign": "Summer Leasing Push"
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()Example response (200, Inquiry created):
{
"inquiry_id": "7494ab9f-7da6-4598-8c3f-bc2c1f10e7b5",
"scheduling_url": "https://showdigs.co/x1Y2z3"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Response
Response Fields
inquiry_id
string
The unique identifier of the inquiry.
scheduling_url
string
The URL for scheduling.
Condition reports
Endpoints for requesting, retrieving, and cancelling condition reports.
List requested and recently completed condition reports
requires authentication
Returns a paginated list owned by the authenticated business. Includes all
in-progress reports and reports completed in the last month, matching the
Requested and Recently Completed tabs. Cancelled reports are excluded.
state is the machine-readable state; status is the PM UI label.
preferred_from and preferred_until describe the current requested or
scheduled inspection window in UTC; they are null before a time is chosen.
Example request:
curl --request GET \
--get "https://api.showdigs.com/api/v1/condition-reports?page=1&per_page=10" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://api.showdigs.com/api/v1/condition-reports"
);
const params = {
"page": "1",
"per_page": "10",
};
Object.keys(params)
.forEach(key => url.searchParams.append(key, params[key]));
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$response = $client->get(
'https://api.showdigs.com/api/v1/condition-reports',
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'query' => [
'page' => '1',
'per_page' => '10',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://api.showdigs.com/api/v1/condition-reports'
params = {
'page': '1',
'per_page': '10',
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers, params=params)
response.json()Example response (200):
{
"data": [
{
"uuid": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"condition_report_id": 12345,
"type": "periodic",
"state": "waiting_for_tenant",
"status": "Waiting for tenant",
"unit_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"address": "506 E Howell St, Seattle - E-308",
"timezone": "America/Los_Angeles",
"preferred_from": null,
"preferred_until": null,
"instructions": "Check smoke alarms",
"lock_box_code": null,
"access_instructions": null,
"associated_member_email": "manager@example.com",
"tenants": [
{
"first_name": "Jane",
"last_name": "Doe",
"phone_number": "+12065550123",
"email": "jane@example.com"
}
],
"price": 249,
"created_at": "2026-06-11T18:30:00.000000Z",
"completed_at": null,
"report_url": null
}
],
"links": {
"first": "https://api.showdigs.com/api/v1/condition-reports?page=1",
"last": "https://api.showdigs.com/api/v1/condition-reports?page=1",
"prev": null,
"next": null
},
"meta": {
"current_page": 1,
"last_page": 1,
"per_page": 15,
"total": 1
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Get a condition report
requires authentication
Returns a report owned by the authenticated business, including archived
completed and cancelled reports. Accepts either identifier returned by POST.
Times are UTC; preferred_from / preferred_until are the current requested
or scheduled window. status uses the PM UI labels while state is stable
for integrations. Completion notifications are documented under
Condition report completed.
Example request:
curl --request GET \
--get "https://api.showdigs.com/api/v1/condition-reports/f47ac10b-58cc-4372-a567-0e02b2c3d479" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://api.showdigs.com/api/v1/condition-reports/f47ac10b-58cc-4372-a567-0e02b2c3d479"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$response = $client->get(
'https://api.showdigs.com/api/v1/condition-reports/f47ac10b-58cc-4372-a567-0e02b2c3d479',
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://api.showdigs.com/api/v1/condition-reports/f47ac10b-58cc-4372-a567-0e02b2c3d479'
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (200):
{
"data": {
"uuid": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"condition_report_id": 12345,
"type": "move_in_out",
"state": "scheduled",
"status": "Scheduled",
"unit_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"address": "506 E Howell St, Seattle - E-308",
"timezone": "America/Los_Angeles",
"preferred_from": "2026-06-20T16:00:00.000000Z",
"preferred_until": "2026-06-20T20:00:00.000000Z",
"instructions": "Check smoke alarms",
"lock_box_code": "1234",
"access_instructions": "Use the side entrance",
"associated_member_email": "manager@example.com",
"tenants": [],
"price": 249,
"created_at": "2026-06-11T18:30:00.000000Z",
"completed_at": null,
"report_url": null
}
}
Example response (404):
{
"message": "Condition report not found"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Schedule a condition report
requires authentication
Creates a condition report for a unit owned by the authenticated business.
Supported types:
move_in_out: requireslock_box_code,access_instructions, andpreferred_frominside operating hours. The unit must already havebedroomsset. The server creates the default move-in/out inspection window frompreferred_from.periodic: requirestenants; the first tenant must include bothphone_numberandemail.vacancy_check: requireslock_box_code,access_instructions, and a property-localpreferred_fromdate; the server creates a 9 AM to 6 PM property-local window.
The create response uuid is the inspection UUID used for cancellation. The completed_condition_report webhook's uuid field currently refers to the unit UUID.
Example request:
curl --request POST \
"https://api.showdigs.com/api/v1/condition-reports" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data '{
"type": "move_in_out",
"unit_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"instructions": "Focus on kitchen appliances",
"associated_member_email": "manager@example.com",
"lock_box_code": "4821",
"access_instructions": "Lockbox on the railing by the front door.",
"preferred_from": "2026-06-20 09:00:00 -07:00",
"tenants": [
{
"first_name": "Jane",
"last_name": "Doe",
"phone_number": "+12065550123",
"email": "jane@example.com"
}
]
}'
const url = new URL(
"https://api.showdigs.com/api/v1/condition-reports"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"type": "move_in_out",
"unit_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"instructions": "Focus on kitchen appliances",
"associated_member_email": "manager@example.com",
"lock_box_code": "4821",
"access_instructions": "Lockbox on the railing by the front door.",
"preferred_from": "2026-06-20 09:00:00 -07:00",
"tenants": [
{
"first_name": "Jane",
"last_name": "Doe",
"phone_number": "+12065550123",
"email": "jane@example.com"
}
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$response = $client->post(
'https://api.showdigs.com/api/v1/condition-reports',
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => \deepclone_from_array([
'classes' => 'stdClass',
'objectMeta' => 1,
'prepared' => [
'type' => 'move_in_out',
'unit_uuid' => 'a1b2c3d4-e5f6-7890-abcd-ef1234567890',
'instructions' => 'Focus on kitchen appliances',
'associated_member_email' => 'manager@example.com',
'lock_box_code' => '4821',
'access_instructions' => 'Lockbox on the railing by the front door.',
'preferred_from' => '2026-06-20 09:00:00 -07:00',
'tenants' => [0],
],
'mask' => [
'tenants' => [true],
],
'properties' => [
'stdClass' => [
'first_name' => ['Jane'],
'last_name' => ['Doe'],
'phone_number' => ['+12065550123'],
'email' => ['jane@example.com'],
],
],
], null, true),
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://api.showdigs.com/api/v1/condition-reports'
payload = {
"type": "move_in_out",
"unit_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"instructions": "Focus on kitchen appliances",
"associated_member_email": "manager@example.com",
"lock_box_code": "4821",
"access_instructions": "Lockbox on the railing by the front door.",
"preferred_from": "2026-06-20 09:00:00 -07:00",
"tenants": [
{
"first_name": "Jane",
"last_name": "Doe",
"phone_number": "+12065550123",
"email": "jane@example.com"
}
]
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()Example response (201, move-in/out scheduled):
{
"uuid": "f47ac10b-58cc-4372-a567-0e02b2c3d479",
"condition_report_id": 12345,
"type": "move_in_out",
"state": "ordered",
"unit_uuid": "a1b2c3d4-e5f6-7890-abcd-ef1234567890",
"address": "506 E Howell St, Seattle - E-308",
"timezone": "America/Los_Angeles",
"preferred_from": "2026-06-20T16:00:00.000000Z",
"preferred_until": "2026-06-20T20:00:00.000000Z",
"price": 249,
"created_at": "2026-06-11T18:30:00.000000Z"
}
Example response (404, unit not found):
{
"message": "Unit not found"
}
Example response (422, no subscription):
{
"message": "Please renew your subscription"
}
Example response (422, occupied vacancy check):
{
"message": "Please note that the vacancy check report is not available because this unit is occupied"
}
Example response (422, existing report):
{
"message": "Existing condition report for this unit is currently in progress.",
"error": "existingInspection"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Cancel a condition report
requires authentication
Cancels a condition report that belongs to the authenticated business and has not completed or already been cancelled.
Example request:
curl --request DELETE \
"https://api.showdigs.com/api/v1/condition-reports/f47ac10b-58cc-4372-a567-0e02b2c3d479" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://api.showdigs.com/api/v1/condition-reports/f47ac10b-58cc-4372-a567-0e02b2c3d479"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "DELETE",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$response = $client->delete(
'https://api.showdigs.com/api/v1/condition-reports/f47ac10b-58cc-4372-a567-0e02b2c3d479',
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://api.showdigs.com/api/v1/condition-reports/f47ac10b-58cc-4372-a567-0e02b2c3d479'
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('DELETE', url, headers=headers)
response.json()Example response (204, cancelled):
Empty response
Example response (404, condition report not found):
{
"message": "Condition report not found"
}
Example response (422, already completed):
{
"message": "Inspection is already completed"
}
Example response (422, already cancelled):
{
"message": "Inspection is already cancelled"
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Endpoints
POST api/v1/webhooks/subscribe
requires authentication
Example request:
curl --request POST \
"https://api.showdigs.com/api/v1/webhooks/subscribe" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data '{
"url": "https:"
}'
const url = new URL(
"https://api.showdigs.com/api/v1/webhooks/subscribe"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"url": "https:"
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$response = $client->post(
'https://api.showdigs.com/api/v1/webhooks/subscribe',
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'url' => 'https:',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://api.showdigs.com/api/v1/webhooks/subscribe'
payload = {
"url": "https:"
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
DELETE api/v1/webhooks/unsubscribe
requires authentication
Example request:
curl --request DELETE \
"https://api.showdigs.com/api/v1/webhooks/unsubscribe" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data '{
"url": "https:"
}'
const url = new URL(
"https://api.showdigs.com/api/v1/webhooks/unsubscribe"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"url": "https:"
};
fetch(url, {
method: "DELETE",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$response = $client->delete(
'https://api.showdigs.com/api/v1/webhooks/unsubscribe',
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'url' => 'https:',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://api.showdigs.com/api/v1/webhooks/unsubscribe'
payload = {
"url": "https:"
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('DELETE', url, headers=headers, json=payload)
response.json()Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
GET api/v1/webhooks/sample
requires authentication
Example request:
curl --request GET \
--get "https://api.showdigs.com/api/v1/webhooks/sample" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json"const url = new URL(
"https://api.showdigs.com/api/v1/webhooks/sample"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
fetch(url, {
method: "GET",
headers,
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$response = $client->get(
'https://api.showdigs.com/api/v1/webhooks/sample',
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://api.showdigs.com/api/v1/webhooks/sample'
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('GET', url, headers=headers)
response.json()Example response (401):
Show headers
cache-control: no-cache, private
content-type: application/json
vary: Origin
{
"message": "Unauthenticated."
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Properties
Endpoints for managing properties and their units.
Create a Property and its Units
requires authentication
This endpoint allows you to create a new property along with its associated units.
Example request:
curl --request POST \
"https://api.showdigs.com/api/v1/properties" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data '{
"origin_id": "p_1",
"property_type": "Single Family Home",
"street": "4536 S Pennsylvania Ave",
"city": "Oklahoma City",
"state": "OK",
"zip": "73119",
"latitude": 35.4197022,
"longitude": -97.5471714,
"units": [
{
"name": "Unit A",
"bedrooms": 3,
"bathrooms": 2,
"size": 1200,
"images": [
"https://placehold.co/600x400/blue/black"
]
}
]
}'
const url = new URL(
"https://api.showdigs.com/api/v1/properties"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"origin_id": "p_1",
"property_type": "Single Family Home",
"street": "4536 S Pennsylvania Ave",
"city": "Oklahoma City",
"state": "OK",
"zip": "73119",
"latitude": 35.4197022,
"longitude": -97.5471714,
"units": [
{
"name": "Unit A",
"bedrooms": 3,
"bathrooms": 2,
"size": 1200,
"images": [
"https:\/\/placehold.co\/600x400\/blue\/black"
]
}
]
};
fetch(url, {
method: "POST",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$response = $client->post(
'https://api.showdigs.com/api/v1/properties',
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'origin_id' => 'p_1',
'property_type' => 'Single Family Home',
'street' => '4536 S Pennsylvania Ave',
'city' => 'Oklahoma City',
'state' => 'OK',
'zip' => '73119',
'latitude' => 35.4197022,
'longitude' => -97.5471714,
'units' => [
[
'name' => 'Unit A',
'bedrooms' => 3,
'bathrooms' => 2,
'size' => 1200,
'images' => ['https://placehold.co/600x400/blue/black'],
],
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://api.showdigs.com/api/v1/properties'
payload = {
"origin_id": "p_1",
"property_type": "Single Family Home",
"street": "4536 S Pennsylvania Ave",
"city": "Oklahoma City",
"state": "OK",
"zip": "73119",
"latitude": 35.4197022,
"longitude": -97.5471714,
"units": [
{
"name": "Unit A",
"bedrooms": 3,
"bathrooms": 2,
"size": 1200,
"images": [
"https:\/\/placehold.co\/600x400\/blue\/black"
]
}
]
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('POST', url, headers=headers, json=payload)
response.json()Example response (201, Property created):
{
"origin_id": "p_1",
"created_at": "2024-07-25 13:40:54",
"updated_at": "2024-07-25 13:40:54",
"property_type": "Single Family Home",
"short_address": "4536 S Pennsylvania Ave, Oklahoma City",
"timezone": "America/Denver",
"location": {
"type": "Point",
"coordinates": [
-97.5471714,
35.4197022
]
},
"units": [
{
"uuid": "u_1",
"created_at": "2024-07-25 13:40:54",
"updated_at": "2024-07-25 13:40:54",
"name": null,
"images": [
"https://example.com/pic.jpg",
"https://example.com/pic2.jpg"
],
"bedrooms": 3,
"bathrooms": 2,
"size": 1200
}
]
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Update a Property and its Units
requires authentication
This endpoint allows you to update an existing property along with its associated units.
Example request:
curl --request PUT \
"https://api.showdigs.com/api/v1/properties/architecto" \
--header "Authorization: Bearer {YOUR_AUTH_KEY}" \
--header "Content-Type: application/json" \
--header "Accept: application/json" \
--data '{
"property_type": "Single Family Home",
"street": "4536 S Pennsylvania Ave",
"city": "Oklahoma City",
"state": "OK",
"zip": "73119",
"latitude": 35.4197022,
"longitude": -97.5471714,
"units": [
{
"uuid": "54f4b3b3-1b1b-4b3b-8b3b-1b1b4b3b8b3b",
"name": "Unit A",
"bedrooms": 3,
"bathrooms": 2,
"size": 1200,
"images": [
"https://placehold.co/600x400/blue/black"
]
}
]
}'
const url = new URL(
"https://api.showdigs.com/api/v1/properties/architecto"
);
const headers = {
"Authorization": "Bearer {YOUR_AUTH_KEY}",
"Content-Type": "application/json",
"Accept": "application/json",
};
let body = {
"property_type": "Single Family Home",
"street": "4536 S Pennsylvania Ave",
"city": "Oklahoma City",
"state": "OK",
"zip": "73119",
"latitude": 35.4197022,
"longitude": -97.5471714,
"units": [
{
"uuid": "54f4b3b3-1b1b-4b3b-8b3b-1b1b4b3b8b3b",
"name": "Unit A",
"bedrooms": 3,
"bathrooms": 2,
"size": 1200,
"images": [
"https:\/\/placehold.co\/600x400\/blue\/black"
]
}
]
};
fetch(url, {
method: "PUT",
headers,
body: JSON.stringify(body),
}).then(response => response.json());$client = new \GuzzleHttp\Client();
$response = $client->put(
'https://api.showdigs.com/api/v1/properties/architecto',
[
'headers' => [
'Authorization' => 'Bearer {YOUR_AUTH_KEY}',
'Content-Type' => 'application/json',
'Accept' => 'application/json',
],
'json' => [
'property_type' => 'Single Family Home',
'street' => '4536 S Pennsylvania Ave',
'city' => 'Oklahoma City',
'state' => 'OK',
'zip' => '73119',
'latitude' => 35.4197022,
'longitude' => -97.5471714,
'units' => [
[
'uuid' => '54f4b3b3-1b1b-4b3b-8b3b-1b1b4b3b8b3b',
'name' => 'Unit A',
'bedrooms' => 3,
'bathrooms' => 2,
'size' => 1200,
'images' => ['https://placehold.co/600x400/blue/black'],
],
],
],
]
);
$body = $response->getBody();
print_r(json_decode((string) $body));import requests
import json
url = 'https://api.showdigs.com/api/v1/properties/architecto'
payload = {
"property_type": "Single Family Home",
"street": "4536 S Pennsylvania Ave",
"city": "Oklahoma City",
"state": "OK",
"zip": "73119",
"latitude": 35.4197022,
"longitude": -97.5471714,
"units": [
{
"uuid": "54f4b3b3-1b1b-4b3b-8b3b-1b1b4b3b8b3b",
"name": "Unit A",
"bedrooms": 3,
"bathrooms": 2,
"size": 1200,
"images": [
"https:\/\/placehold.co\/600x400\/blue\/black"
]
}
]
}
headers = {
'Authorization': 'Bearer {YOUR_AUTH_KEY}',
'Content-Type': 'application/json',
'Accept': 'application/json'
}
response = requests.request('PUT', url, headers=headers, json=payload)
response.json()Example response (202, Property updated):
{
"origin_id": "p_1",
"created_at": "2024-07-25 13:40:54",
"updated_at": "2024-07-25 13:40:54",
"property_type": "Single Family Home",
"short_address": "4536 S Pennsylvania Ave, Oklahoma City",
"timezone": "America/Denver",
"location": {
"type": "Point",
"coordinates": [
-97.5471714,
35.4197022
]
},
"units": [
{
"uuid": "u_1",
"created_at": "2024-07-25 13:40:54",
"updated_at": "2024-07-25 13:40:54",
"name": null,
"images": [
"https://example.com/pic.jpg",
"https://example.com/pic2.jpg"
],
"bedrooms": 3,
"bathrooms": 2,
"size": 1200
}
]
}
Example response (422, update property validation error):
{
"message": "The given data was invalid.",
"errors": {
"street": [
"The street field is required."
],
"city": [
"The city field is required."
],
"state": [
"The state field is required."
],
"zip": [
"The zip field is required."
],
"latitude": [
"The latitude field is required."
],
"longitude": [
"The longitude field is required."
],
"units": [
"The units field is required."
],
"units.0.uuid": [
"The units.0.uuid id field is required."
],
"units.0.bedrooms": [
"The units.0.bedrooms field is required."
],
"units.0.bathrooms": [
"The units.0.bathrooms field is required."
],
"units.0.size": [
"The units.0.size field is required."
]
}
}
Received response:
Request failed with error:
Tip: Check that you're properly connected to the network.
If you're a maintainer of ths API, verify that your API is running and you've enabled CORS.
You can check the Dev Tools console for debugging information.
Webhooks
Overview
Showdigs provides a webhook integration that allows you to receive requests in real-time.
In the settings page of your Showdigs account, you can configure a webhook URL to receive events. You can also configure a webhook access token to verify the authenticity of the request.

Webhook events can be differentiated based on their event_type, which will be included as the first
element in every webhook object.
Webhook Access Token
When the token is set, it will be included in the request headers.
"Authorization:" "Bearer TOKEN"
Delivery, acknowledgment, retries, and deduplication
Showdigs delivers each subscribed event as an HTTP POST of a JSON body to the webhook URL configured for your business (settings UI or POST /api/v1/webhooks/subscribe).
Delivery expectations
- Delivery is asynchronous (queued). A successful API call or in-app event does not mean your endpoint has already received the webhook.
- The request uses
Content-Type: application/jsonandAccept: application/json. - When a webhook access token is configured, Showdigs sends
Authorization: Bearer {token}. - Event payloads always include
event_type. Use the catalog below for field definitions; do not invent event types.
Acknowledgment
- Respond with HTTP 2xx as soon as you have accepted the payload for processing. Showdigs treats non-2xx responses (and transport failures) as delivery failures.
- Prefer acknowledging quickly, then process asynchronously on your side. Long-running work inside the request increases timeout risk.
- Response bodies are not used as an application-level ACK protocol beyond HTTP status.
Retries
- Failed deliveries are retried through the application job queue (typically up to 3 attempts under production worker defaults). There is no separately documented custom backoff schedule for partners.
- After retries are exhausted, the failure is recorded for Showdigs operations; there is no partner-facing dead-letter API to replay a specific delivery today.
Deduplication (your responsibility)
- Showdigs does not guarantee exactly-once delivery. At-least-once is the safe assumption: the same logical event may be POSTed more than once.
- Deduplicate on stable identifiers present in the payload for that event (for example
uuid,inquiry_id, and schedule/tour identifiers where provided), keyed withevent_type. - Delivery order across events is not guaranteed.
Unsupported guarantees (plainly)
- No signed payload / HMAC verification beyond the optional shared bearer token.
- No guaranteed ordering, exactly-once delivery, or durable partner replay API.
- No SLA latency bound is published in this reference; treat delivery as near-real-time best effort.
Inquiry Created
When a new inquiry is received for a property.
{
"event_type": "new_inquiry",
"inquiry_id": "4789",
"unit_internal_id": "2345",
"address": "506 E Howell St, Seattle - E-308",
"timezone": "America/Los_Angeles",
"prospect": {
"id": 98,
"first_name": "Brenna",
"last_name": "Webb",
"full_name": "Brenna Webb",
"phone_number": "+972549143350",
"email": "jelado@mailinator.com"
},
"comment": null,
"inquiry_source": "Manual",
"pms_unit_id": "550e8400-e29b-41d4-a716-446655440000",
"pms_listing_id": "660e8400-e29b-41d4-a716-446655440001",
"uuid": "1e840593-2e20-47f1-b7bc-65e96fe4740d",
"message": "Brenna Webb has inquired about 1473 22nd Ave, Seattle: https://app.showigs.com/prospects/98"
}
event_type
The webhook event.
inquiry_id
The inquiry identifier.
unit_internal_id
The PMS identifier for the property.
address
The address of the property the prospect is interested in.
timezone
The timezone the property is in.
prospect.id
The Showdigs prospect identifier.
prospect.first_name The prospect's first name.
prospect.last_name
The prospect's last name.
prospect.full_name
The prospect's full name.
prospect.phone_number The prospect's phone number.
prospect.email
The prospect's email.
comment
The message, if any, contained in the prospect’s inquiry.
inquiry_source
The source of the inquiry.
Example values: Zillow Rental Network, Zillow, Manual, PM Website
(the Showdigs listing page), plus many more
pms_unit_id
The PMS unit identifier.
pms_listing_id
The PMS listing identifier.
uuid
The Showdigs identifier, which can be used in the /listings:{uuid}
API call.
message
A human readable message to describe what happened.
Disqualified Lead
When a prospect completes the pre-screening and is disqualified from touring a property.
{
"event_type": "disqualified_lead",
"inquiry_id": "4789",
"unit_internal_id": "2345",
"address": "506 E Howell St, Seattle - E-308",
"timezone": "America/Los_Angeles",
"prospect": {
"id": 98,
"first_name": "Brenna",
"last_name": "Webb",
"full_name": "Brenna Webb",
"phone_number": "+972549143350",
"email": "jelado@mailinator.com"
},
"pre_screening_answers": {
"data": {
"move_in_date": {
"tour_at": "2023-03-18T18:30:00+02:00",
"move_in_date": "2023-03-18T14:28:00.000Z"
},
"smoking_policy": "no",
"minimum_lease_length": "2_years",
"maximum_allowed_tenants": "1_tenant"
},
"is_qualified": false
},
"pms_unit_id": "550e8400-e29b-41d4-a716-446655440000",
"pms_listing_id": "660e8400-e29b-41d4-a716-446655440001",
"uuid": "1e840593-2e20-47f1-b7bc-65e96fe4740d",
"message": "Brenna Webb completed the pre-screening and was disqualified from touring 506 E Howell St, Seattle - E-308: https://app.showdigs.com/prospects/98"
}
event_type
The webhook event.
inquiry_id
The inquiry identifier.
unit_internal_id
The PMS identifier for the property.
address
The address of the property the prospect was disqualified from touring.
timezone
The timezone the property is in.
prospect.id
The Showdigs prospect identifier.
prospect.first_name The prospect's first name.
prospect.last_name
The prospect's last name.
prospect.full_name
The prospect's full name.
prospect.phone_number The prospect's phone number.
prospect.email
The prospect's email.
pre_screening_answers
This section contains the prospect's responses to pre-screening
questions they were asked. The contents will differ based on
your individual showing configuration.
pms_unit_id
The PMS unit identifier.
pms_listing_id
The PMS listing identifier.
uuid
The Showdigs identifier, which can be used in the /listings:{uuid}
API call.
message
A human readable message to describe what happened.
Tour Scheduled
When a tour is scheduled.
{
"event_type": "tour_scheduled",
"tour_type": "agent",
"tour_id": 59,
"unit_internal_id": "my_int_id",
"address": "1473 22nd Ave, Seattle",
"timezone": "America/Los_Angeles",
"tour_at": "2023-03-18T16:30:00.000Z",
"tour_until": "2023-03-18T17:00:00.000Z",
"inquiry_id": 456,
"prospect_id": 123,
"prospect_first_name": "Shanon",
"prospect_last_name": "Klocko",
"prospect_phone_number": "+201255564049",
"prospect_email": "ouhwfiop@showdigs.testfake",
"pre_screening_answers": {
"data": {
"move_in_date": {
"tour_at": "2023-03-18T18:30:00+02:00",
"move_in_date": "2023-03-18T14:28:00.000Z"
},
"smoking_policy": "no",
"minimum_lease_length": "2_years",
"maximum_allowed_tenants": "1_tenant"
},
"is_qualified": true
},
"identity_verification": null,
"pms_unit_id": "550e8400-e29b-41d4-a716-446655440000",
"pms_listing_id": "660e8400-e29b-41d4-a716-446655440001",
"uuid": "1e840593-2e20-47f1-b7bc-65e96fe4740d",
"message": "Shanon Klocko scheduled a tour 1473 22nd Ave, Seattle: https://app.showdigs.com/tours/59"
}
event_type
The webhook event.
tour_type
The type of tour that was scheduled.
Possible values: self_showing, open_house, agent
tour_id
The Showdigs identifier for the tour. This will be consistent for a single tour
across the tour-related webhooks.
unit_internal_id
The PMS identifier for the property.
address
The address of the property being toured.
timezone
The timezone the property is in.
tour_at
The scheduled start time for the tour.
tour_until
The scheduled end time for the tour.
inquiry_id
The inquiry identifier that led to the tour.
prospect_id
The Showdigs identifier for the prospect. This will be the same for the prospect for
all properties they request to tour.
prospect_first_name
The prospect's first name.
prospect_last_name
The prospect's last name.
prospect_phone_number
The prospect's phone number.
prospect_email
The prospect's email address.
pre_screening_answers
This section contains the prospect's responses to pre-screening
questions they were asked when scheduling the tour. The contents
will differ based on your individual showing configuration.
pre_screening_answers.data.move_in_date
This provides the tour time and then the calculated move in date based on the
"Move in date" pre-screening criteria.
pre_screening_answers.data.smoking_policy
The prospect's answer to the question, "will you be smoking in this property?"
Possible values: yes, no
pre_screening_answers.data.minimum_lease_length
The prospect's answer to the question, "how long are you planning to lease
the property for?"
pre_screening_answers.data.maximum_allowed_tenants
The prospect's answer to the question, "how many tenants are expected to live
in the property?"
pre_screening_answers.is_qualified
The overall result of the pre-screening questions.
Possible values: true (is qualified), false (is not qualified)
identity_verification
This is an area we are planning to build into. For now, this will always be null.
pms_unit_id
The PMS unit identifier.
pms_listing_id
The PMS listing identifier.
uuid
The Showdigs identifier, which can be used in the /listings:{uuid}
API call.
message
A human readable message to describe what happened.
Tour Completed
When a tour is completed.
{
"event_type": "tour_completed",
"tour_type": "agent",
"tour_id": 59,
"outcome": "completed",
"unit_internal_id": "my_int_id",
"address": "1473 22nd Ave, Seattle",
"timezone": "America/Los_Angeles",
"tour_at": "2023-03-18T16:30:00.000Z",
"tour_until": "2023-03-18T17:00:00.000Z",
"survey_results": [
{
"key": "outcome",
"answer": "Successful tour",
"question": "Tour outcome"
},
{
"key": "does_unit_show_well",
"answer": "yes",
"question": "Does the unit show well? If not, what can be done to make it show better?"
}
],
"prospects_count": 2,
"prospects": [
{
"id": 90,
"first_name": "Ottis",
"last_name": "Feest",
"phone": "+201255563527",
"email": "ukbkadhj@showdigs.testfake",
"likely_to_apply": "Maybe",
"inquiry_id": 456
},
{
"id": 91,
"first_name": "Shanon",
"last_name": "Klocko",
"phone": "+201255564049",
"email": "ouhwfiop@showdigs.testfake",
"likely_to_apply": "Yes",
"inquiry_id": 789
}
],
"charge": 45,
"pms_unit_id": "550e8400-e29b-41d4-a716-446655440000",
"pms_listing_id": "660e8400-e29b-41d4-a716-446655440001",
"uuid": "1e840593-2e20-47f1-b7bc-65e96fe4740d",
"message": "Multiple prospects completed a tour of 1473 22nd Ave, Seattle: https://app.showdigs.com/tours/59"
}
event_type
The webhook event.
tour_type
The type of tour that was scheduled.
Possible values: self_showing, open_house, agent
tour_id
The Showdigs identifier for the tour. This will be consistent for a single tour
across the tour-related webhooks.
outcome
The outcome of the tour. Keep in mind that tour_cancelled is a different webhook.
Possible values: completed, no_show, technical_issue (typically refers to
an access issue that prevented the tour from occurring)
unit_internal_id
The PMS identifier for the property.
address
The address of the property being toured.
timezone
The timezone the property is in.
tour_at
The scheduled start time for the tour.
tour_until
The scheduled end time for the tour.
survey_results
An array of the questions asked to the agent and their responses
about the tour and property.
prospects_count
The number of prospects that attended the tour.
prospects
An array of the prospects that attended the tour. This will include each
prospect's id, name, phone, email, original inquiry identifier, and the
agent's thoughts regarding the likelihood of the prospect to apply.
charge
This is the amount that was charged to complete the tour.
Value will be numeric, and will not have any "money" formatting applied.
pms_unit_id
The PMS unit identifier.
pms_listing_id
The PMS listing identifier.
uuid
The Showdigs identifier, which can be used in the /listings:{uuid}
API call.
message
A human readable message to describe what happened
Tour Cancelled
When a tour is cancelled.
{
"event_type": "tour_cancelled",
"tour_type": "agent",
"tour_id": 59,
"unit_internal_id": "my_int_id",
"address": "1473 22nd Ave, Seattle",
"timezone": "America/Los_Angeles",
"tour_at": "2023-03-18T16:30:00.000Z",
"tour_until": "2023-03-18T17:00:00.000Z",
"prospects": [
{
"id": 90,
"first_name": "Ottis",
"last_name": "Feest",
"phone": "+201255563527",
"email": "ukbkadhj@showdigs.testfake",
"inquiry_id": 456
}
],
"pms_unit_id": "550e8400-e29b-41d4-a716-446655440000",
"pms_listing_id": "660e8400-e29b-41d4-a716-446655440001",
"uuid": "1e840593-2e20-47f1-b7bc-65e96fe4740d",
"message": "Ottis Feest cancelled a tour 1473 22nd Ave, Seattle: https://app.showdigs.com/tours/59"
}
event_type
The webhook event.
tour_type
The type of tour that was scheduled.
Possible values: self_showing, open_house, agent
tour_id
The Showdigs identifier for the tour. This will be consistent for a single tour
across the tour-related webhooks.
unit_internal_id
The PMS identifier for the property.
address
The address of the property being toured.
timezone
The timezone the property is in.
tour_at
The scheduled start time for the tour.
tour_until
The scheduled end time for the tour.
prospects
An array of the prospects that were scheduled to attend the tour. This will
include each prospect's id, name, phone, email, and their original
inquiry identifier.
pms_unit_id
The PMS unit identifier.
pms_listing_id
The PMS listing identifier.
uuid
The Showdigs identifier, which can be used in the /listings:{uuid}
API call.
message
A human readable message to describe what happened
Condition report completed
When a condition report is completed.
{
"event_type": "completed_condition_report",
"condition_report_id": 123,
"address": "506 E Howell St, Seattle - E-308",
"timezone": "America/Los_Angeles",
"report_url": "sd.test/9pdYyM",
"cost": "20",
"condition_report_type": "move_in_out",
"inspected_at": "2023-03-18T17:00:00.000Z",
"uuid": "1e840593-2e20-47f1-b7bc-65e96fe4740d",
"message": "A condition report was completed for 506 E Howell St, Seattle - E-308"
}
event_type
The webhook event.
condition_report_id
The Shodigs identifier for the condition report.
address
The address of the property that the report was completed for.
timezone
The timezone the property is in.
report_url
The url of the completed condition report.
cost
This is the amount that was charged to complete the condition report.
Value will be numeric, and will not have any "money" formatting applied.
condition_report_type
The type of condition report that was completed.
Possible values: periodic, move_in_out, vacancy_check
inspected_at
The date and time the condition report was completed at.
uuid
The Showdigs identifier, which can be used in the /listings:{uuid}
API call.
message
A human readable message to describe what happened
Scheduling Widget
You can load Showdigs scheduling widget inside your listing page.

Contact Showdigs support and provide a list of domains you're expecting to load the widget from.
Once feature is enabled for your account, you can embed the widget as an iframe in your site.
<iframe
src="https://lead.showdigs.com/embed/ACCOUNT_ID/INTERNAL_UNIT_ID?name=John Doe&phone=%2b15555551234"
width="100%"
height="600px"
style="border:none;">
</iframe>