Audience: This article is for all API enpoints that are available for accounts with a Business+ tier. Every endpoint below is authenticated with an API key and scoped to your company.
The company "De Vries Plumbing" in the documentation below is to our knowledge a fictional company.
Before you start
You will need to go to My Business once you are signed in and go to the "Team & Access" Tab to generate a API key. You can have up to 5 API keys, Each key has a life time of 6 months after creation.
Things worthy of note:
- Base URL:
https://selectedwithtrust.com - All paths are prefixed with:
/api/v1/public - Auth header:
X-API-Key: swt_xxxxxxxx… - Content type for writes:
application/json - Downgraded tier: If you downgrade your subscription your API will stop working you will get a
403 TIER_REQUIRED
Env. Setings
You can export these values to use in your environment:
PowerShell
$BaseUrl = "https://selectedwithtrust.com"
$Headers = @{ "X-API-Key" = "swt_your_key_here" }Bash
export SWT_BASE="https://selectedwithtrust.com"
export SWT_KEY="swt_your_key_here"Python 3 (uses requests - pip install requests)
import requests
BASE = "https://selectedwithtrust.com"
KEY = "swt_your_key_here"
session = requests.Session()
session.headers.update({"X-API-Key": KEY})Endpoint reference
Get the company name
GET /api/v1/public/businessesReturns the business linked to your API key.
PowerShell
Invoke-RestMethod -Uri "$BaseUrl/api/v1/public/businesses" -Headers $HeadersBash
curl -s "$SWT_BASE/api/v1/public/businesses" -H "X-API-Key: $SWT_KEY"Python3
r = session.get(f"{BASE}/api/v1/public/businesses")
print(r.json())Example Response
{
"businesses": [
{
"id": "b0a1c2d3-e4f5-6789-abcd-ef0123456789",,
"name": ""De Vries Plumbing",
"type": "plumber",
"city": "Amsterdam",
"rating": 4.7,
"reviewCount": 128,
"isVerified": true,
"subscriptionTier": "business_plus",
"availabilityStatus": "open",
"createdAt": "2025-01-14T10:00:00.000Z"
}
],
"pagination": { "page": 1, "limit": 1, "total": 1 }
}Get company details:
GET /api/v1/public/businesses/{id}
Full profile including contact details and active services. The {id} must match your own business public_id (UUID) — requesting another business returns 403 SCOPE_VIOLATION.
Example response
{
"business": {
"id": "b0a1c2d3-e4f5-6789-abcd-ef0123456789",
"name": "De Vries Plumbing",
"type": "plumber",
"email": "hello@devries.example",
"phone": "+31 20 123 4567",
"address": "Keizersgracht 100",
"city": "Amsterdam",
"stateProvince": "Noord-Holland",
"postalCode": "1015 CW",
"country": "Netherlands",
"website": "https://devries.example",
"description": "Family-run plumbing since 1998.",
"rating": 4.7,
"reviewCount": 128,
"isVerified": true,
"availabilityStatus": "open",
"services": [
{
"id": "5e6f7a8b-9c0d-1e2f-3a4b-5c6d7e8f9a0b",
"name": "Emergency call-out",
"description": "24/7 leak response",
"priceFrom": 95.0,
"priceTo": 180.0,
"priceUnit": "per visit"
}
],
"createdAt": "2025-01-14T10:00:00.000Z"
}
}List reviews for your company
GET /api/v1/public/businesses/{id}/reviews
Displaying these on your site without using the Selected With trust is in violation of our Terms and Services, this API endpoint if your your internal tooling only.
Approved reviews only, paginated. Same scope rule as above ({id} must be yours).
| Query param | Type | Default | Notes |
|---|---|---|---|
page |
integer | 1 |
Page number |
limit |
integer | 20 |
Max 50 |
sort |
string | newest |
newest, oldest, highest, lowest |
PowerShell
$q = @{ page = 1; limit = 20; sort = "highest" }
Invoke-RestMethod -Uri "$BaseUrl/api/v1/public/businesses/b0a1c2d3-e4f5-6789-abcd-ef0123456789/reviews" -Headers $Headers -Body $q
Bash
curl -s -G "$SWT_BASE/api/v1/public/businesses/b0a1c2d3-e4f5-6789-abcd-ef0123456789/reviews" \
-H "X-API-Key: $SWT_KEY" \
--data-urlencode "page=1" \
--data-urlencode "limit=20" \
--data-urlencode "sort=highest"
Python 3
r = session.get(
f"{BASE}/api/v1/public/businesses/b0a1c2d3-e4f5-6789-abcd-ef0123456789/reviews",
params={"page": 1, "limit": 20, "sort": "highest"},
)
print(r.json())
Example Response
{
"reviews": [
{
"id": "1a2b3c4d-5e6f-7a8b-9c0d-1e2f3a4b5c6d",
"rating": 5,
"title": "Fast and tidy",
"comment": "Fixed a burst pipe within the hour.",
"isVerified": true,
"authorUsername": "marieke_a",
"createdAt": "2026-05-30T14:21:00.000Z"
}
],
"pagination": { "page": 1, "limit": 20, "total": 128 }
}List your job postings
GET /api/v1/public/jobs
Active job postings for your business, with optional filters.
| Query param | Type | Default | Notes |
|---|---|---|---|
q |
string | — | Matches title or description |
city |
string | — | Matches the posting location |
type |
string | — | Employment type, e.g. full-time |
page |
integer | 1 |
Page number |
limit |
integer | 20 |
Max 100 |
PowerShell
$q = @{ q = "engineer"; city = "Amsterdam"; type = "full-time"; limit = 50 }
Invoke-RestMethod -Uri "$BaseUrl/api/v1/public/jobs" -Headers $Headers -Body $q
Bash
curl -s -G "$SWT_BASE/api/v1/public/jobs" \
-H "X-API-Key: $SWT_KEY" \
--data-urlencode "q=engineer" \
--data-urlencode "city=Amsterdam" \
--data-urlencode "type=full-time" \
--data-urlencode "limit=50"
Python 3
r = session.get(
f"{BASE}/api/v1/public/jobs",
params={"q": "engineer", "city": "Amsterdam", "type": "full-time", "limit": 50},
)
print(r.json())
Example response
{
"jobs": [
{
"id": "9f8e7d6c-5b4a-3f2e-1d0c-9b8a7f6e5d4c",
"title": "Senior Plumbing Engineer",
"businessName": "De Vries Plumbing",
"location": "Amsterdam",
"employmentType": "full-time",
"salaryMin": 42000,
"salaryMax": 56000,
"postedAt": "2026-06-01T08:00:00.000Z"
}
],
"pagination": { "page": 1, "limit": 50, "total": 1 }
}
Page-view analytics (last 30 days)
GET /api/v1/public/my/analytics
Total views, unique visitors and a per-day breakdown for the trailing 30 days.
PowerShell
Invoke-RestMethod -Uri "$BaseUrl/api/v1/public/my/analytics" -Headers $Headers
Bash
curl -s "$SWT_BASE/api/v1/public/my/analytics" -H "X-API-Key: $SWT_KEY"
Python 3
r = session.get(f"{BASE}/api/v1/public/my/analytics")
print(r.json())
Example response
{
"totalViews": 1840,
"uniqueVisitors": 1203,
"dailyViews": [
{ "date": "2026-06-10", "views": 64, "unique": 51 },
{ "date": "2026-06-11", "views": 72, "unique": 58 }
]
}
Update your business profile
PUT /api/v1/public/my/profile
Partial update — send only the fields you want to change. Omitted fields are left untouched. Text fields are stripped of HTML server-side.
| Field | Type | Max length | Notes |
|---|---|---|---|
name |
string | 255 | |
description |
string | 3000 | |
phone |
string | 50 | |
website |
string | 255 | |
address |
string | 500 | |
city |
string | 100 | |
postalCode |
string | 20 | |
country |
string | 100 | |
availabilityStatus |
string | — | One of open, busy, full, closed |
Copy-paste JSON body
{
"name": "De Vries Plumbing",
"description": "Family-run plumbing since 1998. Now offering bathroom installs.",
"phone": "+31 20 123 4567",
"website": "https://devries.example",
"address": "Keizersgracht 100",
"city": "Amsterdam",
"postalCode": "1015 CW",
"country": "Netherlands",
"availabilityStatus": "open"
}
PowerShell
$body = @{
description = "Family-run plumbing since 1998. Now offering bathroom installs."
availabilityStatus = "busy"
} | ConvertTo-Json
Invoke-RestMethod -Uri "$BaseUrl/api/v1/public/my/profile" -Method Put `
-Headers $Headers -ContentType "application/json" -Body $body
Bash
curl -s -X PUT "$SWT_BASE/api/v1/public/my/profile" \
-H "X-API-Key: $SWT_KEY" \
-H "Content-Type: application/json" \
-d '{
"description": "Family-run plumbing since 1998. Now offering bathroom installs.",
"availabilityStatus": "busy"
}'
Python 3
r = session.put(
f"{BASE}/api/v1/public/my/profile",
json={
"description": "Family-run plumbing since 1998. Now offering bathroom installs.",
"availabilityStatus": "busy",
},
)
print(r.json())
Example response
{
"business": {
"id": "b0a1c2d3-e4f5-6789-abcd-ef0123456789",
"name": "De Vries Plumbing",
"description": "Family-run plumbing since 1998. Now offering bathroom installs.",
"phone": "+31 20 123 4567",
"website": "https://devries.example",
"address": "Keizersgracht 100",
"city": "Amsterdam",
"postalCode": "1015 CW",
"country": "Netherlands",
"availabilityStatus": "busy",
"updatedAt": "2026-06-12T09:45:00.000Z"
}
}
Get opening hours
GET /api/v1/public/my/hours
Returns one object per configured day. dayOfWeek is 1 = Monday … 7 = Sunday.
PowerShell
Invoke-RestMethod -Uri "$BaseUrl/api/v1/public/my/hours" -Headers $Headers
Bash
curl -s "$SWT_BASE/api/v1/public/my/hours" -H "X-API-Key: $SWT_KEY"
Python 3
r = session.get(f"{BASE}/api/v1/public/my/hours")
print(r.json())
Example response
{
"hours": [
{ "dayOfWeek": 1, "isClosed": false, "openTime": "09:00", "closeTime": "17:30", "breakStart": "12:30", "breakEnd": "13:00" },
{ "dayOfWeek": 7, "isClosed": true, "openTime": null, "closeTime": null, "breakStart": null, "breakEnd": null }
]
}
Replace opening hours
PUT /api/v1/public/my/hours
Full replace. Send an array of 1–7 day objects; this overwrites all stored hours. For open days, openTime and closeTime are required in HH:MM 24-hour format. Breaks are optional. For isClosed: true days, leave the times null.
Copy-paste JSON body (a full Mon–Sun week)
{
"hours": [
{ "dayOfWeek": 1, "isClosed": false, "openTime": "09:00", "closeTime": "17:30", "breakStart": "12:30", "breakEnd": "13:00" },
{ "dayOfWeek": 2, "isClosed": false, "openTime": "09:00", "closeTime": "17:30" },
{ "dayOfWeek": 3, "isClosed": false, "openTime": "09:00", "closeTime": "17:30" },
{ "dayOfWeek": 4, "isClosed": false, "openTime": "09:00", "closeTime": "20:00" },
{ "dayOfWeek": 5, "isClosed": false, "openTime": "09:00", "closeTime": "17:30" },
{ "dayOfWeek": 6, "isClosed": false, "openTime": "10:00", "closeTime": "14:00" },
{ "dayOfWeek": 7, "isClosed": true }
]
}
PowerShell
$body = @{
hours = @(
@{ dayOfWeek = 1; isClosed = $false; openTime = "09:00"; closeTime = "17:30" }
@{ dayOfWeek = 6; isClosed = $false; openTime = "10:00"; closeTime = "14:00" }
@{ dayOfWeek = 7; isClosed = $true }
)
} | ConvertTo-Json -Depth 5
Invoke-RestMethod -Uri "$BaseUrl/api/v1/public/my/hours" -Method Put `
-Headers $Headers -ContentType "application/json" -Body $body
Bash
curl -s -X PUT "$SWT_BASE/api/v1/public/my/hours" \
-H "X-API-Key: $SWT_KEY" \
-H "Content-Type: application/json" \
-d '{
"hours": [
{ "dayOfWeek": 1, "isClosed": false, "openTime": "09:00", "closeTime": "17:30" },
{ "dayOfWeek": 6, "isClosed": false, "openTime": "10:00", "closeTime": "14:00" },
{ "dayOfWeek": 7, "isClosed": true }
]
}'
Python 3
r = session.put(
f"{BASE}/api/v1/public/my/hours",
json={
"hours": [
{"dayOfWeek": 1, "isClosed": False, "openTime": "09:00", "closeTime": "17:30"},
{"dayOfWeek": 6, "isClosed": False, "openTime": "10:00", "closeTime": "14:00"},
{"dayOfWeek": 7, "isClosed": True},
]
},
)
print(r.json())
Send batch review invitations
POST /api/v1/public/my/review-invitations
Emails up to 50 customers a one-time review link. Rate limited to 5 requests per hour per key. Each invitee needs an email; name is optional. Invalid emails are skipped and reported in the errors array rather than failing the whole batch.
Copy-paste JSON body
{
"invitees": [
{ "email": "customer1@example.com", "name": "Anna Bakker" },
{ "email": "customer2@example.com", "name": "Tom de Jong" },
{ "email": "customer3@example.com" }
]
}
PowerShell
$body = @{
invitees = @(
@{ email = "customer1@example.com"; name = "Anna Bakker" }
@{ email = "customer2@example.com"; name = "Tom de Jong" }
)
} | ConvertTo-Json -Depth 5
Invoke-RestMethod -Uri "$BaseUrl/api/v1/public/my/review-invitations" -Method Post `
-Headers $Headers -ContentType "application/json" -Body $body
Bash
curl -s -X POST "$SWT_BASE/api/v1/public/my/review-invitations" \
-H "X-API-Key: $SWT_KEY" \
-H "Content-Type: application/json" \
-d '{
"invitees": [
{ "email": "customer1@example.com", "name": "Anna Bakker" },
{ "email": "customer2@example.com", "name": "Tom de Jong" }
]
}'
Python 3
r = session.post(
f"{BASE}/api/v1/public/my/review-invitations",
json={
"invitees": [
{"email": "customer1@example.com", "name": "Anna Bakker"},
{"email": "customer2@example.com", "name": "Tom de Jong"},
]
},
)
print(r.json())
Example response
{
"sent": 2,
"errors": [
{ "email": "not-an-email", "reason": "Invalid email address" }
]
}
Errors
All errors are JSON with an error message and, where useful, a machine-readable code.
| HTTP | code |
Meaning |
|---|---|---|
401 |
MISSING_API_KEY |
No X-API-Key header, or it doesn't start with swt_ |
401 |
INVALID_API_KEY |
Key is unknown, revoked, or older than 6 months |
403 |
TIER_REQUIRED |
The business is not on the Business+ tier |
403 |
SCOPE_VIOLATION |
You requested a business id that isn't yours |
404 |
RESOURCE_NOT_FOUND |
The business exists but isn't approved/visible |
400 |
— | Validation error — the error message says what to fix |
429 |
— | Rate limit exceeded (see X-RateLimit-Limit response header) |
Example error
{ "error": "API access requires a Business+ subscription", "code": "TIER_REQUIRED" }
A robust client checks the status code before parsing:
r = session.get(f"{BASE}/api/v1/public/my/analytics")
if r.status_code == 200:
data = r.json()
else:
err = r.json()
print(f"[{r.status_code}] {err.get('code', '')}: {err['error']}")
Quick reference
| Method | Path | Purpose |
|---|---|---|
| GET | /api/v1/public/businesses |
Your business summary |
| GET | /api/v1/public/businesses/{id} |
Full profile + services |
| GET | /api/v1/public/businesses/{id}/reviews |
Approved reviews (paginated) |
| GET | /api/v1/public/jobs |
Your job postings (filterable) |
| GET | /api/v1/public/my/analytics |
30-day page views |
| PUT | /api/v1/public/my/profile |
Update company details |
| GET | /api/v1/public/my/hours |
Read opening hours |
| PUT | /api/v1/public/my/hours |
Replace opening hours |
| POST | /api/v1/public/my/review-invitations |
Batch review invites (≤50, 5/hr) |
Every endpoint is authenticated with X-API-Key, scoped to one business, and returns JSON. Happy building.