Team
20 endpoints. Each needs an API key or OAuth token with the scope shown; the key already names its store, so paths start at /v1/store. Generated from the live contract; also in openapi.json.
Members, pending invites, custom roles and your own access
/v1/store/teamOr name the store: GET /v1/stores/{storeId}/team
Response TeamOverview
membersTeamMember[]requiredinvitesTeamInvite[]requiredrolesCustomRole[]requiredyouStoreAccessrequired
Example
curl "https://api.shopfa.st/v1/store/team" \
-H "Authorization: Bearer $SHOPFAST_API_KEY"const res = await fetch('https://api.shopfa.st/v1/store/team', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
},
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"GET",
"https://api.shopfa.st/v1/store/team",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/team", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
res, err := http.DefaultClient.Do(req)Try it with your key
Invite someone by email. The link works for 7 days.
/v1/store/team/invitesOr name the store: POST /v1/stores/{storeId}/team/invites
Body
emailstringrequiredassignmentobjectrequiredrole"admin" | "staff" | "support" | "finance" | "custom"requiredcustomRoleIdrole_… | nullrequired
departmentstring | nulltagsstring[]expiresInHoursinteger | null
Response InviteMemberResponse
inviteTeamInviterequiredacceptUrlstringrequired
Example
curl -X POST "https://api.shopfa.st/v1/store/team/invites" \
-H "Authorization: Bearer $SHOPFAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"email": "[email protected]",
"assignment": {
"role": "admin",
"customRoleId": "role_0123456789abcdefghjk"
},
"department": null,
"tags": [],
"expiresInHours": null
}'const res = await fetch('https://api.shopfa.st/v1/store/team/invites', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"email": "[email protected]",
"assignment": {
"role": "admin",
"customRoleId": "role_0123456789abcdefghjk"
},
"department": null,
"tags": [],
"expiresInHours": null
}),
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"POST",
"https://api.shopfa.st/v1/store/team/invites",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
json={
"email": "[email protected]",
"assignment": {
"role": "admin",
"customRoleId": "role_0123456789abcdefghjk"
},
"department": None,
"tags": [],
"expiresInHours": None
},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/team/invites", strings.NewReader(`{
"email": "[email protected]",
"assignment": {
"role": "admin",
"customRoleId": "role_0123456789abcdefghjk"
},
"department": null,
"tags": [],
"expiresInHours": null
}`))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)Try it with your key
Send the invite again with a new link and a fresh 7 days
/v1/store/team/invites/{inviteId}/resendOr name the store: POST /v1/stores/{storeId}/team/invites/{inviteId}/resend
Parameters
inviteIdinv_…pathrequired
Response ResendInviteResponse
inviteTeamInviterequiredacceptUrlstringrequired
Example
curl -X POST "https://api.shopfa.st/v1/store/team/invites/inv_0123456789abcdefghjk/resend" \
-H "Authorization: Bearer $SHOPFAST_API_KEY"const res = await fetch('https://api.shopfa.st/v1/store/team/invites/inv_0123456789abcdefghjk/resend', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
},
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"POST",
"https://api.shopfa.st/v1/store/team/invites/inv_0123456789abcdefghjk/resend",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/team/invites/inv_0123456789abcdefghjk/resend", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
res, err := http.DefaultClient.Do(req)Try it with your key
Cancel a pending invite
/v1/store/team/invites/{inviteId}Or name the store: DELETE /v1/stores/{storeId}/team/invites/{inviteId}
Parameters
inviteIdinv_…pathrequired
Response TeamOverview
membersTeamMember[]requiredinvitesTeamInvite[]requiredrolesCustomRole[]requiredyouStoreAccessrequired
Example
curl -X DELETE "https://api.shopfa.st/v1/store/team/invites/inv_0123456789abcdefghjk" \
-H "Authorization: Bearer $SHOPFAST_API_KEY"const res = await fetch('https://api.shopfa.st/v1/store/team/invites/inv_0123456789abcdefghjk', {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
},
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"DELETE",
"https://api.shopfa.st/v1/store/team/invites/inv_0123456789abcdefghjk",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("DELETE", "https://api.shopfa.st/v1/store/team/invites/inv_0123456789abcdefghjk", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
res, err := http.DefaultClient.Do(req)Try it with your key
Change a member's role (the owner's role changes only through a transfer)
/v1/store/team/members/{userId}/roleOr name the store: PUT /v1/stores/{storeId}/team/members/{userId}/role
Parameters
userIdstringpathrequired
Body
role"admin" | "staff" | "support" | "finance" | "custom"requiredcustomRoleIdrole_… | nullrequired
Response TeamOverview
membersTeamMember[]requiredinvitesTeamInvite[]requiredrolesCustomRole[]requiredyouStoreAccessrequired
Example
curl -X PUT "https://api.shopfa.st/v1/store/team/members/string/role" \
-H "Authorization: Bearer $SHOPFAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"role": "admin",
"customRoleId": "role_0123456789abcdefghjk"
}'const res = await fetch('https://api.shopfa.st/v1/store/team/members/string/role', {
method: 'PUT',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"role": "admin",
"customRoleId": "role_0123456789abcdefghjk"
}),
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"PUT",
"https://api.shopfa.st/v1/store/team/members/string/role",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
json={
"role": "admin",
"customRoleId": "role_0123456789abcdefghjk"
},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("PUT", "https://api.shopfa.st/v1/store/team/members/string/role", strings.NewReader(`{
"role": "admin",
"customRoleId": "role_0123456789abcdefghjk"
}`))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)Try it with your key
Turn Use AI on or off for a teammate (Ask AI, the AI builder and theme AI spend the store's AI credits). Only the owner
/v1/store/team/members/{userId}/aiOr name the store: PUT /v1/stores/{storeId}/team/members/{userId}/ai
Parameters
userIdstringpathrequired
Body
enabledbooleanrequired
Response TeamOverview
membersTeamMember[]requiredinvitesTeamInvite[]requiredrolesCustomRole[]requiredyouStoreAccessrequired
Example
curl -X PUT "https://api.shopfa.st/v1/store/team/members/string/ai" \
-H "Authorization: Bearer $SHOPFAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"enabled": false
}'const res = await fetch('https://api.shopfa.st/v1/store/team/members/string/ai', {
method: 'PUT',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"enabled": false
}),
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"PUT",
"https://api.shopfa.st/v1/store/team/members/string/ai",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
json={
"enabled": False
},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("PUT", "https://api.shopfa.st/v1/store/team/members/string/ai", strings.NewReader(`{
"enabled": false
}`))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)Try it with your key
Remove someone from the team and end their access at once
/v1/store/team/members/{userId}Or name the store: DELETE /v1/stores/{storeId}/team/members/{userId}
Parameters
userIdstringpathrequired
Response TeamOverview
membersTeamMember[]requiredinvitesTeamInvite[]requiredrolesCustomRole[]requiredyouStoreAccessrequired
Example
curl -X DELETE "https://api.shopfa.st/v1/store/team/members/string" \
-H "Authorization: Bearer $SHOPFAST_API_KEY"const res = await fetch('https://api.shopfa.st/v1/store/team/members/string', {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
},
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"DELETE",
"https://api.shopfa.st/v1/store/team/members/string",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("DELETE", "https://api.shopfa.st/v1/store/team/members/string", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
res, err := http.DefaultClient.Do(req)Try it with your key
Leave this store (owners transfer ownership first)
/v1/store/team/leaveOr name the store: POST /v1/stores/{storeId}/team/leave
Response Ok
okbooleanrequired
Example
curl -X POST "https://api.shopfa.st/v1/store/team/leave" \
-H "Authorization: Bearer $SHOPFAST_API_KEY"const res = await fetch('https://api.shopfa.st/v1/store/team/leave', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
},
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"POST",
"https://api.shopfa.st/v1/store/team/leave",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/team/leave", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
res, err := http.DefaultClient.Do(req)Try it with your key
Owner only: make another member the owner. You become an admin.
/v1/store/team/transferOr name the store: POST /v1/stores/{storeId}/team/transfer
Body
userIdstringrequiredpasswordstringrequired
Response TeamOverview
membersTeamMember[]requiredinvitesTeamInvite[]requiredrolesCustomRole[]requiredyouStoreAccessrequired
Example
curl -X POST "https://api.shopfa.st/v1/store/team/transfer" \
-H "Authorization: Bearer $SHOPFAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"userId": "string",
"password": "string"
}'const res = await fetch('https://api.shopfa.st/v1/store/team/transfer', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"userId": "string",
"password": "string"
}),
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"POST",
"https://api.shopfa.st/v1/store/team/transfer",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
json={
"userId": "string",
"password": "string"
},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/team/transfer", strings.NewReader(`{
"userId": "string",
"password": "string"
}`))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)Try it with your key
Create a custom role from the permission matrix
/v1/store/team/rolesOr name the store: POST /v1/stores/{storeId}/team/roles
Body
namestringrequireddescriptionstringrequiredpermissions"catalog:read" | "catalog:write" | "orders:read" | "orders:write" | "customers:read" | "customers:write" | "disputes:read" | "disputes:write" | "reviews:read" | "reviews:write" | "marketing:read" | "marketing:write" | "analytics:read" | "analytics:write" | "storefront:read" | "storefront:write" | "payments:read" | "payments:write" | "finance:read" | "finance:write" | "team:read" | "team:write" | "settings:read" | "settings:write" | "discord:read" | "discord:write" | "fraud:read" | "fraud:write" | "developers:read" | "developers:write" | "audit:read" | "audit:write" | "support:read" | "support:write" | "ai:read" | "ai:write"[]required
Response CustomRole
idRoleIdrequirednamestringrequireddescriptionstringrequiredpermissionsStorePermission[]requiredmemberCountintegerrequiredupdatedAtTimestamprequired
Example
curl -X POST "https://api.shopfa.st/v1/store/team/roles" \
-H "Authorization: Bearer $SHOPFAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "string",
"description": "string",
"permissions": [
"catalog:read"
]
}'const res = await fetch('https://api.shopfa.st/v1/store/team/roles', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string",
"description": "string",
"permissions": [
"catalog:read"
]
}),
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"POST",
"https://api.shopfa.st/v1/store/team/roles",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
json={
"name": "string",
"description": "string",
"permissions": [
"catalog:read"
]
},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/team/roles", strings.NewReader(`{
"name": "string",
"description": "string",
"permissions": [
"catalog:read"
]
}`))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)Try it with your key
Edit a custom role. Members with it get the new permissions on their next request.
/v1/store/team/roles/{roleId}Or name the store: PUT /v1/stores/{storeId}/team/roles/{roleId}
Parameters
roleIdrole_…pathrequired
Body
namestringrequireddescriptionstringrequiredpermissions"catalog:read" | "catalog:write" | "orders:read" | "orders:write" | "customers:read" | "customers:write" | "disputes:read" | "disputes:write" | "reviews:read" | "reviews:write" | "marketing:read" | "marketing:write" | "analytics:read" | "analytics:write" | "storefront:read" | "storefront:write" | "payments:read" | "payments:write" | "finance:read" | "finance:write" | "team:read" | "team:write" | "settings:read" | "settings:write" | "discord:read" | "discord:write" | "fraud:read" | "fraud:write" | "developers:read" | "developers:write" | "audit:read" | "audit:write" | "support:read" | "support:write" | "ai:read" | "ai:write"[]required
Response CustomRole
idRoleIdrequirednamestringrequireddescriptionstringrequiredpermissionsStorePermission[]requiredmemberCountintegerrequiredupdatedAtTimestamprequired
Example
curl -X PUT "https://api.shopfa.st/v1/store/team/roles/role_0123456789abcdefghjk" \
-H "Authorization: Bearer $SHOPFAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "string",
"description": "string",
"permissions": [
"catalog:read"
]
}'const res = await fetch('https://api.shopfa.st/v1/store/team/roles/role_0123456789abcdefghjk', {
method: 'PUT',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string",
"description": "string",
"permissions": [
"catalog:read"
]
}),
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"PUT",
"https://api.shopfa.st/v1/store/team/roles/role_0123456789abcdefghjk",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
json={
"name": "string",
"description": "string",
"permissions": [
"catalog:read"
]
},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("PUT", "https://api.shopfa.st/v1/store/team/roles/role_0123456789abcdefghjk", strings.NewReader(`{
"name": "string",
"description": "string",
"permissions": [
"catalog:read"
]
}`))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)Try it with your key
Delete a custom role nobody has
/v1/store/team/roles/{roleId}Or name the store: DELETE /v1/stores/{storeId}/team/roles/{roleId}
Parameters
roleIdrole_…pathrequired
Response TeamOverview
membersTeamMember[]requiredinvitesTeamInvite[]requiredrolesCustomRole[]requiredyouStoreAccessrequired
Example
curl -X DELETE "https://api.shopfa.st/v1/store/team/roles/role_0123456789abcdefghjk" \
-H "Authorization: Bearer $SHOPFAST_API_KEY"const res = await fetch('https://api.shopfa.st/v1/store/team/roles/role_0123456789abcdefghjk', {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
},
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"DELETE",
"https://api.shopfa.st/v1/store/team/roles/role_0123456789abcdefghjk",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("DELETE", "https://api.shopfa.st/v1/store/team/roles/role_0123456789abcdefghjk", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
res, err := http.DefaultClient.Do(req)Try it with your key
Access policies, member attributes and the team's two-factor and invite settings
/v1/store/team/accessOr name the store: GET /v1/stores/{storeId}/team/access
Response TeamAccessOverview
policiesAccessPolicy[]requiredsettingsTeamAccessSettingsrequiredattributesMemberAttributes[]requireddepartmentsstring[]requiredtagsstring[]required
Example
curl "https://api.shopfa.st/v1/store/team/access" \
-H "Authorization: Bearer $SHOPFAST_API_KEY"const res = await fetch('https://api.shopfa.st/v1/store/team/access', {
method: 'GET',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
},
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"GET",
"https://api.shopfa.st/v1/store/team/access",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("GET", "https://api.shopfa.st/v1/store/team/access", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
res, err := http.DefaultClient.Do(req)Try it with your key
Add an access policy (allow policies are owner-only)
/v1/store/team/policiesOr name the store: POST /v1/stores/{storeId}/team/policies
Body
namestringrequireddescriptionstringeffect"allow" | "deny"requiredenabledbooleansubjectsobjectrequiredeveryonebooleanroles"admin" | "staff" | "support" | "finance" | "custom"[]customRoleIdsrole_…[]userIdsusr_…[]departmentsstring[]tagsstring[]
permissions"catalog:read" | "catalog:write" | "orders:read" | "orders:write" | "customers:read" | "customers:write" | "disputes:read" | "disputes:write" | "reviews:read" | "reviews:write" | "marketing:read" | "marketing:write" | "analytics:read" | "analytics:write" | "storefront:read" | "storefront:write" | "payments:read" | "payments:write" | "finance:read" | "finance:write" | "team:read" | "team:write" | "settings:read" | "settings:write" | "discord:read" | "discord:write" | "fraud:read" | "fraud:write" | "developers:read" | "developers:write" | "audit:read" | "audit:write" | "support:read" | "support:write" | "ai:read" | "ai:write" | string[]requiredconditionsobjectrequiredop"all" | "any"requiredconditionsobject[]requiredattribute"actor.department" | "actor.tags" | "actor.two_factor" | "actor.via_api_key" | "actor.role" | "actor.member_days" | "context.hour" | "context.weekday" | "context.ip" | "context.country" | "resource.type" | "product.type" | "product.tags" | "product.collections" | "product.price" | "product.status" | "order.total" | "order.country" | "order.status" | "order.product_types" | "order.collections" | "order.test" | "customer.country" | "store.country" | "store.region"requiredop"eq" | "neq" | "gt" | "gte" | "lt" | "lte" | "between" | "in" | "not_in" | "contains" | "starts_with" | "ends_with" | "in_cidr" | "not_in_cidr" | "is_true" | "is_false" | "contains_any" | "contains_none" | "is_known" | "is_unknown"requiredvaluenumber | string | string[] | nullvalue2number
groupsobject[]op"all" | "any"requiredconditionsobject[]required
Response AccessPolicy
namestringrequireddescriptionstringrequiredeffectPolicyEffectrequiredenabledbooleanrequiredsubjectsPolicySubjectsrequiredpermissionsPermissionPattern[]requiredconditionsPolicyGrouprequiredidAccessPolicyIdrequiredcreatedBystringrequiredcreatedAtTimestamprequiredupdatedAtTimestamprequired
Example
curl -X POST "https://api.shopfa.st/v1/store/team/policies" \
-H "Authorization: Bearer $SHOPFAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "string",
"description": "",
"effect": "allow",
"enabled": true,
"subjects": {},
"permissions": [
"catalog:read"
],
"conditions": {
"op": "all",
"conditions": [
{
"attribute": "actor.department",
"op": "eq"
}
]
}
}'const res = await fetch('https://api.shopfa.st/v1/store/team/policies', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string",
"description": "",
"effect": "allow",
"enabled": true,
"subjects": {},
"permissions": [
"catalog:read"
],
"conditions": {
"op": "all",
"conditions": [
{
"attribute": "actor.department",
"op": "eq"
}
]
}
}),
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"POST",
"https://api.shopfa.st/v1/store/team/policies",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
json={
"name": "string",
"description": "",
"effect": "allow",
"enabled": True,
"subjects": {},
"permissions": [
"catalog:read"
],
"conditions": {
"op": "all",
"conditions": [
{
"attribute": "actor.department",
"op": "eq"
}
]
}
},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/team/policies", strings.NewReader(`{
"name": "string",
"description": "",
"effect": "allow",
"enabled": true,
"subjects": {},
"permissions": [
"catalog:read"
],
"conditions": {
"op": "all",
"conditions": [
{
"attribute": "actor.department",
"op": "eq"
}
]
}
}`))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)Try it with your key
Change an access policy
/v1/store/team/policies/{policyId}Or name the store: PUT /v1/stores/{storeId}/team/policies/{policyId}
Parameters
policyIdpol_…pathrequired
Body
namestringrequireddescriptionstringeffect"allow" | "deny"requiredenabledbooleansubjectsobjectrequiredeveryonebooleanroles"admin" | "staff" | "support" | "finance" | "custom"[]customRoleIdsrole_…[]userIdsusr_…[]departmentsstring[]tagsstring[]
permissions"catalog:read" | "catalog:write" | "orders:read" | "orders:write" | "customers:read" | "customers:write" | "disputes:read" | "disputes:write" | "reviews:read" | "reviews:write" | "marketing:read" | "marketing:write" | "analytics:read" | "analytics:write" | "storefront:read" | "storefront:write" | "payments:read" | "payments:write" | "finance:read" | "finance:write" | "team:read" | "team:write" | "settings:read" | "settings:write" | "discord:read" | "discord:write" | "fraud:read" | "fraud:write" | "developers:read" | "developers:write" | "audit:read" | "audit:write" | "support:read" | "support:write" | "ai:read" | "ai:write" | string[]requiredconditionsobjectrequiredop"all" | "any"requiredconditionsobject[]requiredattribute"actor.department" | "actor.tags" | "actor.two_factor" | "actor.via_api_key" | "actor.role" | "actor.member_days" | "context.hour" | "context.weekday" | "context.ip" | "context.country" | "resource.type" | "product.type" | "product.tags" | "product.collections" | "product.price" | "product.status" | "order.total" | "order.country" | "order.status" | "order.product_types" | "order.collections" | "order.test" | "customer.country" | "store.country" | "store.region"requiredop"eq" | "neq" | "gt" | "gte" | "lt" | "lte" | "between" | "in" | "not_in" | "contains" | "starts_with" | "ends_with" | "in_cidr" | "not_in_cidr" | "is_true" | "is_false" | "contains_any" | "contains_none" | "is_known" | "is_unknown"requiredvaluenumber | string | string[] | nullvalue2number
groupsobject[]op"all" | "any"requiredconditionsobject[]required
Response AccessPolicy
namestringrequireddescriptionstringrequiredeffectPolicyEffectrequiredenabledbooleanrequiredsubjectsPolicySubjectsrequiredpermissionsPermissionPattern[]requiredconditionsPolicyGrouprequiredidAccessPolicyIdrequiredcreatedBystringrequiredcreatedAtTimestamprequiredupdatedAtTimestamprequired
Example
curl -X PUT "https://api.shopfa.st/v1/store/team/policies/pol_0123456789abcdefghjk" \
-H "Authorization: Bearer $SHOPFAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"name": "string",
"description": "",
"effect": "allow",
"enabled": true,
"subjects": {},
"permissions": [
"catalog:read"
],
"conditions": {
"op": "all",
"conditions": [
{
"attribute": "actor.department",
"op": "eq"
}
]
}
}'const res = await fetch('https://api.shopfa.st/v1/store/team/policies/pol_0123456789abcdefghjk', {
method: 'PUT',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"name": "string",
"description": "",
"effect": "allow",
"enabled": true,
"subjects": {},
"permissions": [
"catalog:read"
],
"conditions": {
"op": "all",
"conditions": [
{
"attribute": "actor.department",
"op": "eq"
}
]
}
}),
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"PUT",
"https://api.shopfa.st/v1/store/team/policies/pol_0123456789abcdefghjk",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
json={
"name": "string",
"description": "",
"effect": "allow",
"enabled": True,
"subjects": {},
"permissions": [
"catalog:read"
],
"conditions": {
"op": "all",
"conditions": [
{
"attribute": "actor.department",
"op": "eq"
}
]
}
},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("PUT", "https://api.shopfa.st/v1/store/team/policies/pol_0123456789abcdefghjk", strings.NewReader(`{
"name": "string",
"description": "",
"effect": "allow",
"enabled": true,
"subjects": {},
"permissions": [
"catalog:read"
],
"conditions": {
"op": "all",
"conditions": [
{
"attribute": "actor.department",
"op": "eq"
}
]
}
}`))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)Try it with your key
Delete an access policy
/v1/store/team/policies/{policyId}Or name the store: DELETE /v1/stores/{storeId}/team/policies/{policyId}
Parameters
policyIdpol_…pathrequired
Response Ok
okbooleanrequired
Example
curl -X DELETE "https://api.shopfa.st/v1/store/team/policies/pol_0123456789abcdefghjk" \
-H "Authorization: Bearer $SHOPFAST_API_KEY"const res = await fetch('https://api.shopfa.st/v1/store/team/policies/pol_0123456789abcdefghjk', {
method: 'DELETE',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
},
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"DELETE",
"https://api.shopfa.st/v1/store/team/policies/pol_0123456789abcdefghjk",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("DELETE", "https://api.shopfa.st/v1/store/team/policies/pol_0123456789abcdefghjk", nil)
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
res, err := http.DefaultClient.Do(req)Try it with your key
What a member (or a role) could do, here and now or in a given context, with every policy explained
/v1/store/team/simulateOr name the store: POST /v1/stores/{storeId}/team/simulate
Body
userIdusr_… | nullassignmentobject | nulldepartmentstring | nulltagsstring[] | nulltwoFactorbooleanviaApiKeybooleanpermission"catalog:read" | "catalog:write" | "orders:read" | "orders:write" | "customers:read" | "customers:write" | "disputes:read" | "disputes:write" | "reviews:read" | "reviews:write" | "marketing:read" | "marketing:write" | "analytics:read" | "analytics:write" | "storefront:read" | "storefront:write" | "payments:read" | "payments:write" | "finance:read" | "finance:write" | "team:read" | "team:write" | "settings:read" | "settings:write" | "discord:read" | "discord:write" | "fraud:read" | "fraud:write" | "developers:read" | "developers:write" | "audit:read" | "audit:write" | "support:read" | "support:write" | "ai:read" | "ai:write" | nullendpointstring | nullresourceobject | nullattributesobjectcontextobjecthourinteger | nullweekdayinteger | nullipstring | nullcountrystring | null
policiesobject[] | null
Response AccessSimulationResult
subjectobjectrequirednamestringrequiredroleNamestringrequireddepartmentstringrequiredtagsstring[]requiredtwoFactorbooleanrequired
attributesAttributeSnapshotrequireddecisionAccessDecision | nullrequiredmatrixobject[]requiredpermissionStorePermissionrequiredallowedbooleanrequireddecidedByAccessDecidedByrequiredpolicystringrequired
Example
curl -X POST "https://api.shopfa.st/v1/store/team/simulate" \
-H "Authorization: Bearer $SHOPFAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"userId": null,
"assignment": null,
"department": null,
"tags": null,
"twoFactor": null,
"viaApiKey": false,
"permission": null,
"endpoint": null,
"resource": null,
"attributes": {},
"context": {
"hour": null,
"weekday": null,
"ip": null,
"country": null
},
"policies": null
}'const res = await fetch('https://api.shopfa.st/v1/store/team/simulate', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"userId": null,
"assignment": null,
"department": null,
"tags": null,
"twoFactor": null,
"viaApiKey": false,
"permission": null,
"endpoint": null,
"resource": null,
"attributes": {},
"context": {
"hour": null,
"weekday": null,
"ip": null,
"country": null
},
"policies": null
}),
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"POST",
"https://api.shopfa.st/v1/store/team/simulate",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
json={
"userId": None,
"assignment": None,
"department": None,
"tags": None,
"twoFactor": None,
"viaApiKey": False,
"permission": None,
"endpoint": None,
"resource": None,
"attributes": {},
"context": {
"hour": None,
"weekday": None,
"ip": None,
"country": None
},
"policies": None
},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/team/simulate", strings.NewReader(`{
"userId": null,
"assignment": null,
"department": null,
"tags": null,
"twoFactor": null,
"viaApiKey": false,
"permission": null,
"endpoint": null,
"resource": null,
"attributes": {},
"context": {
"hour": null,
"weekday": null,
"ip": null,
"country": null
},
"policies": null
}`))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)Try it with your key
Which roles need two-factor sign-in, and how long invite links work
/v1/store/team/access-settingsOr name the store: PUT /v1/stores/{storeId}/team/access-settings
Body
require2faRoles"admin" | "staff" | "support" | "finance" | role_…[]requiredinviteExpiryHoursintegerrequired
Response TeamAccessSettings
require2faRolesRoleKey[]requiredinviteExpiryHoursintegerrequired
Example
curl -X PUT "https://api.shopfa.st/v1/store/team/access-settings" \
-H "Authorization: Bearer $SHOPFAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"require2faRoles": [
"admin"
],
"inviteExpiryHours": 1
}'const res = await fetch('https://api.shopfa.st/v1/store/team/access-settings', {
method: 'PUT',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"require2faRoles": [
"admin"
],
"inviteExpiryHours": 1
}),
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"PUT",
"https://api.shopfa.st/v1/store/team/access-settings",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
json={
"require2faRoles": [
"admin"
],
"inviteExpiryHours": 1
},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("PUT", "https://api.shopfa.st/v1/store/team/access-settings", strings.NewReader(`{
"require2faRoles": [
"admin"
],
"inviteExpiryHours": 1
}`))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)Try it with your key
Set a teammate's department and tags (used by access policies)
/v1/store/team/members/{userId}/attributesOr name the store: PUT /v1/stores/{storeId}/team/members/{userId}/attributes
Parameters
userIdusr_…pathrequired
Body
departmentstring | nullrequiredtagsstring[]required
Response MemberAttributes
userIdUserIdrequireddepartmentstring | nullrequiredtagsstring[]required
Example
curl -X PUT "https://api.shopfa.st/v1/store/team/members/usr_0123456789abcdefghjk/attributes" \
-H "Authorization: Bearer $SHOPFAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"department": "string",
"tags": [
"string"
]
}'const res = await fetch('https://api.shopfa.st/v1/store/team/members/usr_0123456789abcdefghjk/attributes', {
method: 'PUT',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"department": "string",
"tags": [
"string"
]
}),
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"PUT",
"https://api.shopfa.st/v1/store/team/members/usr_0123456789abcdefghjk/attributes",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
json={
"department": "string",
"tags": [
"string"
]
},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("PUT", "https://api.shopfa.st/v1/store/team/members/usr_0123456789abcdefghjk/attributes", strings.NewReader(`{
"department": "string",
"tags": [
"string"
]
}`))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)Try it with your key
Invite up to 200 people at once, each with a role and the same attributes
/v1/store/team/invites/bulkOr name the store: POST /v1/stores/{storeId}/team/invites/bulk
Body
departmentstring | nulltagsstring[]expiresInHoursinteger | nullentriesobject[]requiredemailstringrequiredassignmentobject | null
assignmentobjectrequiredrole"admin" | "staff" | "support" | "finance" | "custom"requiredcustomRoleIdrole_… | nullrequired
Response BulkInviteResult
invitedTeamInvite[]requiredskippedobject[]requiredemailstringrequiredreasonstringrequired
Example
curl -X POST "https://api.shopfa.st/v1/store/team/invites/bulk" \
-H "Authorization: Bearer $SHOPFAST_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"department": null,
"tags": [],
"expiresInHours": null,
"entries": [
{
"email": "[email protected]"
}
],
"assignment": {
"role": "admin",
"customRoleId": "role_0123456789abcdefghjk"
}
}'const res = await fetch('https://api.shopfa.st/v1/store/team/invites/bulk', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.SHOPFAST_API_KEY}`,
'Content-Type': 'application/json',
},
body: JSON.stringify({
"department": null,
"tags": [],
"expiresInHours": null,
"entries": [
{
"email": "[email protected]"
}
],
"assignment": {
"role": "admin",
"customRoleId": "role_0123456789abcdefghjk"
}
}),
});
if (!res.ok) throw new Error((await res.json()).detail);
const data = await res.json();import os, requests
res = requests.request(
"POST",
"https://api.shopfa.st/v1/store/team/invites/bulk",
headers={"Authorization": f"Bearer {os.environ['SHOPFAST_API_KEY']}"},
json={
"department": None,
"tags": [],
"expiresInHours": None,
"entries": [
{
"email": "[email protected]"
}
],
"assignment": {
"role": "admin",
"customRoleId": "role_0123456789abcdefghjk"
}
},
)
res.raise_for_status()
data = res.json()req, _ := http.NewRequest("POST", "https://api.shopfa.st/v1/store/team/invites/bulk", strings.NewReader(`{
"department": null,
"tags": [],
"expiresInHours": null,
"entries": [
{
"email": "[email protected]"
}
],
"assignment": {
"role": "admin",
"customRoleId": "role_0123456789abcdefghjk"
}
}`))
req.Header.Set("Authorization", "Bearer "+os.Getenv("SHOPFAST_API_KEY"))
req.Header.Set("Content-Type", "application/json")
res, err := http.DefaultClient.Do(req)