Team
Members, roles, invites.
8 endpoints.
GET /v1/team/membersPATCH /v1/team/members/{membership_id}DELETE /v1/team/members/{membership_id}GET /v1/team/invitesPOST /v1/team/invitesDELETE /v1/team/invites/{invite_id}POST /v1/team/invites/lookupPOST /v1/team/invites/accept
GET
/v1/team/membersTeam Members List
Needs a key or a dashboard session
Responses
- 200Successful Response
MemberOut[]
PATCH
/v1/team/members/{membership_id}Team Members Update
Needs a key or a dashboard session
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
membership_id | path | string | yes |
Request body application/json MemberUpdate
| Name | Type | Required | Description |
|---|---|---|---|
role | "owner" | "admin" | "editor" | "viewer" | yes |
Responses
- 200Successful Response
MemberOut
DELETE
/v1/team/members/{membership_id}Team Members Remove
Needs a key or a dashboard session
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
membership_id | path | string | yes |
Responses
- 200Successful Response
Deleted
GET
/v1/team/invitesTeam Invites List
Needs a key or a dashboard session
Responses
- 200Successful Response
InviteOut[]
POST
/v1/team/invitesTeam Invites Create
Needs a key or a dashboard session
Request body application/json InviteCreate
| Name | Type | Required | Description |
|---|---|---|---|
email | string (email) | yes | |
role | "admin" | "editor" | "viewer" | yes |
Responses
- 201Successful Response
InviteOut
DELETE
/v1/team/invites/{invite_id}Team Invites Revoke
Needs a key or a dashboard session
Parameters
| Name | In | Type | Required | Description |
|---|---|---|---|---|
invite_id | path | string | yes |
Responses
- 200Successful Response
Deleted
POST
/v1/team/invites/lookupInvite page: the store and role of a valid invite token (no sign-in)
No key needed
Request body application/json TokenRequest
| Name | Type | Required | Description |
|---|---|---|---|
token | string | yes | min length 20 · max length 200 |
Responses
- 200Successful Response
InviteLookup
POST
/v1/team/invites/acceptTeam Invites Accept
Needs a key or a dashboard session
Request body application/json TokenRequest
| Name | Type | Required | Description |
|---|---|---|---|
token | string | yes | min length 20 · max length 200 |
Responses
- 200Successful Response
TenantOut
Data shapes on this page
MemberOut
| Name | Type | Required | Description |
|---|---|---|---|
id | string | yes | |
user_id | string | yes | |
email | string | yes | |
name | string | null | yes | |
role | "owner" | "admin" | "editor" | "viewer" | yes | |
created_at | string (date-time) | yes |
MemberUpdate
| Name | Type | Required | Description |
|---|---|---|---|
role | "owner" | "admin" | "editor" | "viewer" | yes |
Deleted
| Name | Type | Required | Description |
|---|---|---|---|
deleted | boolean | no | default true |
id | string | yes |
InviteOut
| Name | Type | Required | Description |
|---|---|---|---|
id | string | yes | |
email | string | yes | |
role | "owner" | "admin" | "editor" | "viewer" | yes | |
expires_at | string (date-time) | yes | |
created_at | string (date-time) | yes |
InviteCreate
| Name | Type | Required | Description |
|---|---|---|---|
email | string (email) | yes | |
role | "admin" | "editor" | "viewer" | yes |
TokenRequest
| Name | Type | Required | Description |
|---|---|---|---|
token | string | yes | min length 20 · max length 200 |
InviteLookup
What the invite page shows before sign-in (m17). Only for a valid, unused invite token.
| Name | Type | Required | Description |
|---|---|---|---|
store_name | string | yes | |
inviter_display_name | string | null | no | The inviter's name; never their email. None when they set no name. |
role | "admin" | "editor" | "viewer" | yes | |
expires_at | string (date-time) | yes | |
email_masked | string | yes | The invited address, masked: "s***@example.com". |
TenantOut
| Name | Type | Required | Description |
|---|---|---|---|
id | string | yes | |
slug | string | yes | |
name | string | yes | |
status | "pending_payment" | "trialing" | "active" | "past_due" | "suspended" | "canceled" | "deleted" | yes | pending_payment = a store without a plan: before its free trial or first payment, or after its free trial ended unpaid (see billing_state) |
plan_code | string | null | yes | The store's plan. null = no plan yet (billing_state trial_available, no_trial or trial_ended). |
billing_state | "trial_available" | "no_trial" | "trialing" | "trial_ended" | "paid" | "exempt" | no | trial_available: no plan; the 14-day free trial (no card) starts with the first search made with a public key. no_trial: no plan, and the owner already used the free trial on a store: choose a plan to go live. trialing: the free trial runs until trial_ends_at. trial_ended: the free trial ended unpaid; public keys answer 402 until a plan is chosen. paid: the store has a paid plan (see status). exempt: an internal store that billing never stops.default "paid" |
default_locale | string | yes | |
locales | string[] | yes | |
currency | string | yes | |
vertical | "general" | "electronics" | "fashion" | "beauty" | "grocery" | "home" | "toys" | "health" | "sports" | "books" | no | Store type: picks the word lists search uses. `general` = many kinds of products: the shared words of every store type, without words two types read differently. Set it with PATCH /v1/settings {"vertical": ...}.default "general" |
vertical_source | "default" | "auto" | "owner" | no | Where `vertical` came from: default (not set), auto (SeekGist guessed it from the catalog; checked again on full syncs), owner (chosen in settings; never changed by the guess).default "default" |
auto_detail | VerticalGuess | null | no | The last catalog check, when source is auto. |
trial_ends_at | string (date-time) | null | no | |
sync | SyncHealth | no | |
created_at | string (date-time) | yes |
VerticalGuess
The catalog check behind an automatic store type (`vertical_source: auto`).
| Name | Type | Required | Description |
|---|---|---|---|
vertical | "general" | "electronics" | "fashion" | "beauty" | "grocery" | "home" | "toys" | "health" | "sports" | "books" | yes | What the check decided: a store type, or general (no clear winner). |
leading | "general" | "electronics" | "fashion" | "beauty" | "grocery" | "home" | "toys" | "health" | "sports" | "books" | null | no | The most common store type among the products. |
share | number | yes | Share (0..1) of the checked products with a type that have the leading type. |
products_checked | integer | yes | |
products_decided | integer | yes | Checked products whose category or name points to one store type. |
checked_at | string (date-time) | null | no |
SyncHealth
The store's automatic product sync: when the last one came, and whether it has stopped.
| Name | Type | Required | Description |
|---|---|---|---|
last_sync_at | string (date-time) | null | no | The last automatic product sync: POST /v1/products/batch with a secret key (store modules, SDKs, your own server), a store app webhook or a connector pull sync. Dashboard file imports do not count. |
last_full_sync_at | string (date-time) | null | no | The last full sync (POST /v1/products/batch with sync_complete: true). |
stale | boolean | no | true: the store has done a full sync, but no automatic sync came for more than 26 hours (its daily job has probably stopped). Never true for a store without a full sync.default false |