Skip to content
Get started

Teams

Delete Invitations
DELETE/teams/{teamId}/invitations
List
GET/teams
Retrieve
GET/teams/{teamId}
Retrieve Limits
GET/teams/{teamId}/limits
Update
PUT/teams/{teamId}
ModelsExpand Collapse
TeamDeleteInvitationsResponse = unknown
TeamListResponse object { teams }
teams: array of object { id, context, createdAt, 10 more }

A list of the teams the user belongs to

id: string

The team ID (example: “eyVcnFJcR92BxBkz7N6g5w”)

context: object { invitationsCount, keysCount, userRole, usersCount }

The context of the team for the current authenticated user

invitationsCount: number

The number of invitations on this team

keysCount: number

The number of API keys on this team

userRole: "admin" or "key" or "member"

The authenticated user’s role for this team

One of the following:
"admin"
"key"
"member"
usersCount: number

The number of users on this team

createdAt: string

The team creation date as an ISO string (example: “2023-02-03T11:19:41.579Z”)

name: string

The team name (example: “Scenario”)

plan: "cu-basic" or "cu-creator" or "cu-max" or 9 more

The team plan

One of the following:
"cu-basic"
"cu-creator"
"cu-max"
"cu-pro"
"cu-pro-q3-25"
"cu-team"
"cu-team-v2"
"enterprise"
"essential"
"free"
"premium"
"pro"
projects: array of object { id, createdAt, name, 4 more }

Projects of the team

id: string
createdAt: string
name: string
updatedAt: string
avatar: optional object { assetId, url }
assetId: optional string

ID of the asset used as thumbnail if provided, otherwise undefined

url: optional string

Signed URL of the assetId or free url if assetId is undefined

disableIpDetection: optional boolean

When true, IP detection is switched off for this project.

qualityGateAutoDetect: optional boolean

Whether Quality Gate auto-detection runs on generation for this project.

type: "personal" or "shared"

The team type

One of the following:
"personal"
"shared"
updatedAt: string

The team update date as an ISO string (example: “2023-02-03T11:19:41.579Z”)

avatar: optional object { assetId, url }

The team’s avatar

assetId: optional string

ID of the asset used as thumbnail if provided, otherwise undefined

url: optional string

Signed URL of the assetId or free url if assetId is undefined

byok: optional object { markupMultiplier, updatedAt, updatedBy }

BYOK pricing override. Admin-only — omitted for non-admin callers.

markupMultiplier: number
updatedAt: optional string

ISO timestamp of the last update. Optional — legacy rows may lack it.

updatedBy: optional string

Human-readable handle of who last updated the markup (display name).

defaultUserMaxConsumption: optional number

Team-wide default max consumption (CU) applied to every member over the billing period, unless overridden per member. Absent when no team-wide default is set.

ipDetectionEnforcement: optional "active-fail-closed" or "active-fail-open" or "disabled"

The IP detection enforcement posture for the team. ‘disabled’: IP detection is not performed. ‘active-fail-open’: IP detection runs; on detector error the request is allowed through. ‘active-fail-closed’: IP detection runs; on detector error the request is blocked.

One of the following:
"active-fail-closed"
"active-fail-open"
"disabled"
qualityGateAutoDetect: optional boolean

Quality Gate auto-detection default for the team.

TeamRetrieveResponse object { team }
team: object { id, createdAt, invitations, 17 more }
id: string

The team ID (example: “eyVcnFJcR92BxBkz7N6g5w”)

createdAt: string

The team creation date as an ISO string (example: “2023-02-03T11:19:41.579Z”)

invitations: array of object { createdAt, email, role, 3 more }

The list of pending invitations

createdAt: string

The user creation date as an ISO string (example: “2023-02-03T11:19:41.579Z”)

email: string

The invited user email (example: “herve@scenario.com”)

role: "admin" or "key" or "member"

The role of the invited user inside the team

One of the following:
"admin"
"key"
"member"
status: "accepted" or "expired" or "pending" or "withdrawn"

The status of the invitation

One of the following:
"accepted"
"expired"
"pending"
"withdrawn"
url: string

The link the invited user opens to accept the invitation, as sent by email

projectIds: optional array of string

The list of project IDs for which the user is invited

keys: array of object { id, apiKeyId, apiKeyStatus, 11 more }

The list of API keys

id: string

The key’s member id (its API user id, apiu_...), taken by the member and usage routes (example: “apiu_eyVcnFJcR92BxBkz7N6g5w”)

apiKeyId: string

The API key id (api_...), taken by the api-keys routes (example: “api_eyVcnFJcR92BxBkz7N6g5w”)

apiKeyStatus: "active" or "inactive"

The status of the API key

One of the following:
"active"
"inactive"
createdAt: string

The API key creation date as an ISO string (example: “2023-02-03T11:19:41.579Z”)

name: string

The API key name (example: “eurv-scenario”)

scope: "project" or "team"

The scope of the API key: ‘project’ for project-scoped keys, ‘team’ for team-scoped keys

One of the following:
"project"
"team"
updatedAt: string

The API key last update date as an ISO string (example: “2023-02-03T11:19:41.579Z”)

authorId: optional string

The member who created the key: a human, or the member id (apiu_...) of the team API key that created it.

consumption: optional number

Consumption (CU) used by this key over the current billing period.

lastUsedAt: optional string

The date the API key was last used to authenticate a request, as an ISO string (example: “2023-02-03T11:19:41.579Z”). Absent if the key has never been used.

maxConsumption: optional number

The key’s effective consumption (CU) cap for the period (per-key override, else the team-wide default). Absent when the key is uncapped.

ownerId: optional string

For a PROJECT key: the project it was created on (the team id on some legacy keys). Absent for team keys.

projects: optional array of object { projectId, role }

For a PROJECT key: the projects it has access to and its role on each. Empty when the key is currently not a member of any (live) project. Absent for team keys.

projectId: string

The project the key has a role on

role: string

The key’s role on this project: a built-in role (admin/editor/reader) or a custom ;-separated scope list (example: "asset.read;model.read").

role: optional string

The key’s role. For a TEAM key: its effective team-plane scopes as a ;-separated list (e.g. "team.read;team.usage.read"). Project keys carry their project-plane role(s) per project in projects instead.

name: string

The team name (example: “Scenario”)

paymentStatus: "failed" or "succeeded"

The paymentStatus for the team

One of the following:
"failed"
"succeeded"
plan: "cu-basic" or "cu-creator" or "cu-max" or 9 more

The team plan

One of the following:
"cu-basic"
"cu-creator"
"cu-max"
"cu-pro"
"cu-pro-q3-25"
"cu-team"
"cu-team-v2"
"enterprise"
"essential"
"free"
"premium"
"pro"
projects: array of object { id, createdAt, name, 4 more }

Projects of the team

id: string
createdAt: string
name: string
updatedAt: string
avatar: optional object { assetId, url }
assetId: optional string

ID of the asset used as thumbnail if provided, otherwise undefined

url: optional string

Signed URL of the assetId or free url if assetId is undefined

disableIpDetection: optional boolean

When true, IP detection is switched off for this project.

qualityGateAutoDetect: optional boolean

Whether Quality Gate auto-detection runs on generation for this project.

searchHost: string

The search host for the team

searchIndexes: object { assets, models, workflows }

The search indexes for the team

assets: object { private, public }
private: string

The private search index for the team

public: string

The public search index for the team

models: object { private, public }
private: string

The private search index for the team

public: string

The public search index for the team

workflows: object { private, public }
private: string

The private search index for the team

public: string

The public search index for the team

type: "personal" or "shared"

The team type

One of the following:
"personal"
"shared"
updatedAt: string

The team update date as an ISO string (example: “2023-02-03T11:19:41.579Z”)

users: array of object { id, createdAt, email, 5 more }

The list of teams members and their role

id: string

The user ID (example: “eyVcnFJcR92BxBkz7N6g5w”)

createdAt: string

The user creation date as an ISO string (example: “2023-02-03T11:19:41.579Z”)

email: string

The user email (example: “herve@scenario.com”)

role: "admin" or "key" or "member"

The role of the user inside the team

One of the following:
"admin"
"key"
"member"
updatedAt: string

The user last update date as an ISO string (example: “2023-02-03T11:19:41.579Z”)

avatar: optional object { assetId, url }

The user’s avatar

assetId: optional string

ID of the asset used as thumbnail if provided, otherwise undefined

url: optional string

Signed URL of the assetId or free url if assetId is undefined

consumption: optional number

Consumption (CU) used by this member over the current billing period.

maxConsumption: optional number

The member’s effective consumption (CU) cap for the period (per-user override, else the team-wide default). Absent when the member is uncapped.

avatar: optional object { assetId, url }

The team’s avatar

assetId: optional string

ID of the asset used as thumbnail if provided, otherwise undefined

url: optional string

Signed URL of the assetId or free url if assetId is undefined

byok: optional object { markupMultiplier, updatedAt, updatedBy }

BYOK pricing override. Admin-only — omitted for non-admin callers.

markupMultiplier: number
updatedAt: optional string

ISO timestamp of the last update. Optional — legacy rows may lack it.

updatedBy: optional string

Human-readable handle of who last updated the markup (display name).

defaultUserMaxConsumption: optional number

Team-wide default max consumption (CU) applied to every member over the billing period, unless overridden per member. Absent when no team-wide default is set.

ipDetectionEnforcement: optional "active-fail-closed" or "active-fail-open" or "disabled"

The IP detection enforcement posture for the team. ‘disabled’: IP detection is not performed. ‘active-fail-open’: IP detection runs; on detector error the request is allowed through. ‘active-fail-closed’: IP detection runs; on detector error the request is blocked.

One of the following:
"active-fail-closed"
"active-fail-open"
"disabled"
qualityGateAutoDetect: optional boolean

Quality Gate auto-detection default for the team.

settings: optional object { homepage }

Team settings. Returned on GET and PUT /teams/{teamId}, absent from the teams list.

homepage: optional map[unknown]

Published homepage layout.

subscriptionStatus: optional "active" or "inactive" or "paused"

The subscriptionStatus for the team

One of the following:
"active"
"inactive"
"paused"
TeamRetrieveLimitsResponse object { limits, oneShotCreativeUnits, period, 2 more }
limits: object { apiKeys, canvasAssetLayers, canvasAssets, 21 more }

The actual billing limits values related to the plan

apiKeys: number
canvasAssetLayers: number
canvasAssets: number
collections: number
creativeUnits: number

The amount of Compute Units available for the plan

defaultSeats: number
downloadAssets: number
downloadModel: number
inferenceBatchSize: number
maxCooldown: number

The maximum cooldown applied in case of over head

maxTrainingDatasets: number
minCooldown: number

The minimum cooldown applied in case of over head

models: number

The maximum models a project can have (train/upload/copy/transfer/…)

OTPSessions: number
parallelCustomJobs: number
parallelInferences: number
parallelTraining: number
parallelWorkflowRuns: number
premiumGenerationSamples: number
projects: number

The maximum projects a team can have

scalingFactor: number
seats: number
snapshotsRetention: number
upload: number
oneShotCreativeUnits: array of object { amount, createdAt, expiration, 2 more }

The list of one-shot Compute Units

Can be empty if the team has no one-shot Compute Units

amount: number

The Compute Units amount bought

createdAt: string

The creation date of the Compute Units (buy date) ISO string

expiration: string

The expiration date of the Compute Units ISO string

remaining: number

The remaining Compute Units available

updatedAt: string

The last update date of the Compute Units (use date) ISO string

period: object { end, start }

The actual billing period start and end dates ISO strings

end: string
start: string
plan: "cu-basic" or "cu-creator" or "cu-max" or 9 more

The actual plan of the team

One of the following:
"cu-basic"
"cu-creator"
"cu-max"
"cu-pro"
"cu-pro-q3-25"
"cu-team"
"cu-team-v2"
"enterprise"
"essential"
"free"
"premium"
"pro"
values: object { apiKeys, canvasAssets, collections, 3 more }

The current value for each relevant limit in the billing period

apiKeys: number
canvasAssets: number
collections: number
creativeUnits: number
projects: number
seats: number
TeamUpdateResponse object { team }
team: object { id, context, createdAt, 11 more }

The updated team.

id: string

The team ID (example: “eyVcnFJcR92BxBkz7N6g5w”)

context: object { invitationsCount, keysCount, userRole, usersCount }

The context of the team for the current authenticated user

invitationsCount: number

The number of invitations on this team

keysCount: number

The number of API keys on this team

userRole: "admin" or "key" or "member"

The authenticated user’s role for this team

One of the following:
"admin"
"key"
"member"
usersCount: number

The number of users on this team

createdAt: string

The team creation date as an ISO string (example: “2023-02-03T11:19:41.579Z”)

name: string

The team name (example: “Scenario”)

plan: "cu-basic" or "cu-creator" or "cu-max" or 9 more

The team plan

One of the following:
"cu-basic"
"cu-creator"
"cu-max"
"cu-pro"
"cu-pro-q3-25"
"cu-team"
"cu-team-v2"
"enterprise"
"essential"
"free"
"premium"
"pro"
projects: array of object { id, createdAt, name, 4 more }

Projects of the team

id: string
createdAt: string
name: string
updatedAt: string
avatar: optional object { assetId, url }
assetId: optional string

ID of the asset used as thumbnail if provided, otherwise undefined

url: optional string

Signed URL of the assetId or free url if assetId is undefined

disableIpDetection: optional boolean

When true, IP detection is switched off for this project.

qualityGateAutoDetect: optional boolean

Whether Quality Gate auto-detection runs on generation for this project.

type: "personal" or "shared"

The team type

One of the following:
"personal"
"shared"
updatedAt: string

The team update date as an ISO string (example: “2023-02-03T11:19:41.579Z”)

avatar: optional object { assetId, url }

The team’s avatar

assetId: optional string

ID of the asset used as thumbnail if provided, otherwise undefined

url: optional string

Signed URL of the assetId or free url if assetId is undefined

byok: optional object { markupMultiplier, updatedAt, updatedBy }

BYOK pricing override. Admin-only — omitted for non-admin callers.

markupMultiplier: number
updatedAt: optional string

ISO timestamp of the last update. Optional — legacy rows may lack it.

updatedBy: optional string

Human-readable handle of who last updated the markup (display name).

defaultUserMaxConsumption: optional number

Team-wide default max consumption (CU) applied to every member over the billing period, unless overridden per member. Absent when no team-wide default is set.

ipDetectionEnforcement: optional "active-fail-closed" or "active-fail-open" or "disabled"

The IP detection enforcement posture for the team. ‘disabled’: IP detection is not performed. ‘active-fail-open’: IP detection runs; on detector error the request is allowed through. ‘active-fail-closed’: IP detection runs; on detector error the request is blocked.

One of the following:
"active-fail-closed"
"active-fail-open"
"disabled"
qualityGateAutoDetect: optional boolean

Quality Gate auto-detection default for the team.

settings: optional object { homepage }

Team settings.

homepage: optional map[unknown]

Published homepage layout.

TeamsBrief

Delete
DELETE/teams/{teamId}/brief
Retrieve
GET/teams/{teamId}/brief
Update
PUT/teams/{teamId}/brief
ModelsExpand Collapse
BriefDeleteResponse object { deleted }
deleted: boolean
BriefRetrieveResponse object { brief }
brief: object { id, body, createdAt, 7 more }

A brand-style / project-rules / campaign-context brief stored at one scope.

id: string

Stable identifier derived from level + scopeId

body: string

Free-text brief: brand style, rules, campaign context

createdAt: string

ISO-8601 creation timestamp

createdBy: string

User id that last wrote the brief

enabled: boolean

Whether the brief is applied during verification

level: "project" or "team"

Scope this brief applies to: team or project

One of the following:
"project"
"team"
referenceAssetIds: array of string

Reference assets the verifier compares the image against

scopeId: string

The id of the team or project that owns this brief

updatedAt: string

ISO-8601 last-update timestamp

sensitivity: optional "high" or "low" or "medium"

Threshold strictness applied when verifying against this scope

One of the following:
"high"
"low"
"medium"
BriefUpdateResponse object { brief }
brief: object { id, body, createdAt, 7 more }

A brand-style / project-rules / campaign-context brief stored at one scope.

id: string

Stable identifier derived from level + scopeId

body: string

Free-text brief: brand style, rules, campaign context

createdAt: string

ISO-8601 creation timestamp

createdBy: string

User id that last wrote the brief

enabled: boolean

Whether the brief is applied during verification

level: "project" or "team"

Scope this brief applies to: team or project

One of the following:
"project"
"team"
referenceAssetIds: array of string

Reference assets the verifier compares the image against

scopeId: string

The id of the team or project that owns this brief

updatedAt: string

ISO-8601 last-update timestamp

sensitivity: optional "high" or "low" or "medium"

Threshold strictness applied when verifying against this scope

One of the following:
"high"
"low"
"medium"

TeamsIP Filters

Create
POST/teams/{teamId}/ip-filters
Delete
DELETE/teams/{teamId}/ip-filters/{filterId}
Draft Instruction
POST/teams/{teamId}/ip-filters/draft-instruction
List
GET/teams/{teamId}/ip-filters
Update
PUT/teams/{teamId}/ip-filters/{filterId}
ModelsExpand Collapse
IPFilterCreateResponse object { filter }
filter: unknown

The created custom filter, including its enabled state

IPFilterDeleteResponse object { deleted }
deleted: boolean

True when the filter was deleted

IPFilterDraftInstructionResponse object { instruction }
instruction: string

Drafted natural-language detection instruction derived from the reference assets

IPFilterListResponse object { filters }
filters: array of unknown

Built-in and custom IP-detection filters for the team, each with its enabled state

IPFilterUpdateResponse object { filter }
filter: unknown

The updated filter, including its enabled state

TeamsMembers

Create
POST/teams/{teamId}/members
Delete
DELETE/teams/{teamId}/members/{memberId}
Update
PUT/teams/{teamId}/members/{memberId}
ModelsExpand Collapse
MemberCreateResponse object { team }
team: object { id, context, createdAt, 10 more }
id: string

The team ID (example: “eyVcnFJcR92BxBkz7N6g5w”)

context: object { invitationsCount, keysCount, userRole, usersCount }

The context of the team for the current authenticated user

invitationsCount: number

The number of invitations on this team

keysCount: number

The number of API keys on this team

userRole: "admin" or "key" or "member"

The authenticated user’s role for this team

One of the following:
"admin"
"key"
"member"
usersCount: number

The number of users on this team

createdAt: string

The team creation date as an ISO string (example: “2023-02-03T11:19:41.579Z”)

name: string

The team name (example: “Scenario”)

plan: "cu-basic" or "cu-creator" or "cu-max" or 9 more

The team plan

One of the following:
"cu-basic"
"cu-creator"
"cu-max"
"cu-pro"
"cu-pro-q3-25"
"cu-team"
"cu-team-v2"
"enterprise"
"essential"
"free"
"premium"
"pro"
projects: array of object { id, createdAt, name, 4 more }

Projects of the team

id: string
createdAt: string
name: string
updatedAt: string
avatar: optional object { assetId, url }
assetId: optional string

ID of the asset used as thumbnail if provided, otherwise undefined

url: optional string

Signed URL of the assetId or free url if assetId is undefined

disableIpDetection: optional boolean

When true, IP detection is switched off for this project.

qualityGateAutoDetect: optional boolean

Whether Quality Gate auto-detection runs on generation for this project.

type: "personal" or "shared"

The team type

One of the following:
"personal"
"shared"
updatedAt: string

The team update date as an ISO string (example: “2023-02-03T11:19:41.579Z”)

avatar: optional object { assetId, url }

The team’s avatar

assetId: optional string

ID of the asset used as thumbnail if provided, otherwise undefined

url: optional string

Signed URL of the assetId or free url if assetId is undefined

byok: optional object { markupMultiplier, updatedAt, updatedBy }

BYOK pricing override. Admin-only — omitted for non-admin callers.

markupMultiplier: number
updatedAt: optional string

ISO timestamp of the last update. Optional — legacy rows may lack it.

updatedBy: optional string

Human-readable handle of who last updated the markup (display name).

defaultUserMaxConsumption: optional number

Team-wide default max consumption (CU) applied to every member over the billing period, unless overridden per member. Absent when no team-wide default is set.

ipDetectionEnforcement: optional "active-fail-closed" or "active-fail-open" or "disabled"

The IP detection enforcement posture for the team. ‘disabled’: IP detection is not performed. ‘active-fail-open’: IP detection runs; on detector error the request is allowed through. ‘active-fail-closed’: IP detection runs; on detector error the request is blocked.

One of the following:
"active-fail-closed"
"active-fail-open"
"disabled"
qualityGateAutoDetect: optional boolean

Quality Gate auto-detection default for the team.

MemberDeleteResponse = unknown
MemberUpdateResponse = unknown

TeamsWatermark

Delete
DELETE/teams/{teamId}/watermark
Delete Logo
DELETE/teams/{teamId}/watermark/logo
Preview
POST/teams/{teamId}/watermark/preview
Retrieve
GET/teams/{teamId}/watermark
Update
PUT/teams/{teamId}/watermark
Update Logo
PUT/teams/{teamId}/watermark/logo
ModelsExpand Collapse
WatermarkDeleteResponse object { deleted }
deleted: boolean
WatermarkDeleteLogoResponse object { watermark }
watermark: object { id, createdAt, createdBy, 14 more }

Forced-watermark configuration stored at one scope.

id: string

Stable identifier derived from level + scopeId

createdAt: string

ISO-8601 creation timestamp

createdBy: string

User id that last wrote the configuration

enabled: boolean

Whether the watermark is enforced on assets generated in this scope. A disabled project configuration falls back to its team’s.

level: "project" or "team"

Scope this configuration applies to: team or project

One of the following:
"project"
"team"
opacity: number

Mark opacity, 0.05 (barely visible) to 1 (opaque)

placement: "bottom-left" or "bottom-right" or "center" or 3 more

Where the mark sits on the image

One of the following:
"bottom-left"
"bottom-right"
"center"
"tiled"
"top-left"
"top-right"
rotation: number

Mark rotation in degrees, -90 to 90. 0 is horizontal.

scale: number

Mark width as a fraction of the image width

scopeId: string

The id of the team or project that owns this configuration

spacing: number

Gap between repetitions, as a fraction of the mark’s own size. Tiled placement only; 0 repeats the mark edge to edge.

updatedAt: string

ISO-8601 last-update timestamp

version: number

Bumped on every write.

deletedAt: optional string

Set when the configuration has been deleted.

logoIsOpaque: optional boolean

Whether the stored logo has no transparency at all.

Recorded at upload so the UI can warn without decoding the image again: an opaque logo draws its whole rectangle, which a rotated tiled mark turns into a very visible diamond.

logoKey: optional string

Where the uploaded logo lives, when one is set.

text: optional string

Text rendered as the mark, when no logo is set

WatermarkPreviewResponse object { image }

Response of the watermark preview routes.

image: string

The sample image with the mark drawn on it, base64-encoded.

WatermarkRetrieveResponse object { watermark }
watermark: object { id, createdAt, createdBy, 14 more }

Forced-watermark configuration stored at one scope.

id: string

Stable identifier derived from level + scopeId

createdAt: string

ISO-8601 creation timestamp

createdBy: string

User id that last wrote the configuration

enabled: boolean

Whether the watermark is enforced on assets generated in this scope. A disabled project configuration falls back to its team’s.

level: "project" or "team"

Scope this configuration applies to: team or project

One of the following:
"project"
"team"
opacity: number

Mark opacity, 0.05 (barely visible) to 1 (opaque)

placement: "bottom-left" or "bottom-right" or "center" or 3 more

Where the mark sits on the image

One of the following:
"bottom-left"
"bottom-right"
"center"
"tiled"
"top-left"
"top-right"
rotation: number

Mark rotation in degrees, -90 to 90. 0 is horizontal.

scale: number

Mark width as a fraction of the image width

scopeId: string

The id of the team or project that owns this configuration

spacing: number

Gap between repetitions, as a fraction of the mark’s own size. Tiled placement only; 0 repeats the mark edge to edge.

updatedAt: string

ISO-8601 last-update timestamp

version: number

Bumped on every write.

deletedAt: optional string

Set when the configuration has been deleted.

logoIsOpaque: optional boolean

Whether the stored logo has no transparency at all.

Recorded at upload so the UI can warn without decoding the image again: an opaque logo draws its whole rectangle, which a rotated tiled mark turns into a very visible diamond.

logoKey: optional string

Where the uploaded logo lives, when one is set.

text: optional string

Text rendered as the mark, when no logo is set

WatermarkUpdateResponse object { watermark }
watermark: object { id, createdAt, createdBy, 14 more }

Forced-watermark configuration stored at one scope.

id: string

Stable identifier derived from level + scopeId

createdAt: string

ISO-8601 creation timestamp

createdBy: string

User id that last wrote the configuration

enabled: boolean

Whether the watermark is enforced on assets generated in this scope. A disabled project configuration falls back to its team’s.

level: "project" or "team"

Scope this configuration applies to: team or project

One of the following:
"project"
"team"
opacity: number

Mark opacity, 0.05 (barely visible) to 1 (opaque)

placement: "bottom-left" or "bottom-right" or "center" or 3 more

Where the mark sits on the image

One of the following:
"bottom-left"
"bottom-right"
"center"
"tiled"
"top-left"
"top-right"
rotation: number

Mark rotation in degrees, -90 to 90. 0 is horizontal.

scale: number

Mark width as a fraction of the image width

scopeId: string

The id of the team or project that owns this configuration

spacing: number

Gap between repetitions, as a fraction of the mark’s own size. Tiled placement only; 0 repeats the mark edge to edge.

updatedAt: string

ISO-8601 last-update timestamp

version: number

Bumped on every write.

deletedAt: optional string

Set when the configuration has been deleted.

logoIsOpaque: optional boolean

Whether the stored logo has no transparency at all.

Recorded at upload so the UI can warn without decoding the image again: an opaque logo draws its whole rectangle, which a rotated tiled mark turns into a very visible diamond.

logoKey: optional string

Where the uploaded logo lives, when one is set.

text: optional string

Text rendered as the mark, when no logo is set

WatermarkUpdateLogoResponse object { watermark }
watermark: object { id, createdAt, createdBy, 14 more }

Forced-watermark configuration stored at one scope.

id: string

Stable identifier derived from level + scopeId

createdAt: string

ISO-8601 creation timestamp

createdBy: string

User id that last wrote the configuration

enabled: boolean

Whether the watermark is enforced on assets generated in this scope. A disabled project configuration falls back to its team’s.

level: "project" or "team"

Scope this configuration applies to: team or project

One of the following:
"project"
"team"
opacity: number

Mark opacity, 0.05 (barely visible) to 1 (opaque)

placement: "bottom-left" or "bottom-right" or "center" or 3 more

Where the mark sits on the image

One of the following:
"bottom-left"
"bottom-right"
"center"
"tiled"
"top-left"
"top-right"
rotation: number

Mark rotation in degrees, -90 to 90. 0 is horizontal.

scale: number

Mark width as a fraction of the image width

scopeId: string

The id of the team or project that owns this configuration

spacing: number

Gap between repetitions, as a fraction of the mark’s own size. Tiled placement only; 0 repeats the mark edge to edge.

updatedAt: string

ISO-8601 last-update timestamp

version: number

Bumped on every write.

deletedAt: optional string

Set when the configuration has been deleted.

logoIsOpaque: optional boolean

Whether the stored logo has no transparency at all.

Recorded at upload so the UI can warn without decoding the image again: an opaque logo draws its whole rectangle, which a rotated tiled mark turns into a very visible diamond.

logoKey: optional string

Where the uploaded logo lives, when one is set.

text: optional string

Text rendered as the mark, when no logo is set

TeamsWebhook Endpoints

Create
POST/teams/{teamId}/webhook-endpoints
Delete
DELETE/teams/{teamId}/webhook-endpoints/{webhookEndpointId}
List
GET/teams/{teamId}/webhook-endpoints
Update
PUT/teams/{teamId}/webhook-endpoints/{webhookEndpointId}
ModelsExpand Collapse
WebhookEndpointCreateResponse object { webhookEndpoint }
webhookEndpoint: object { id, createdAt, enabled, 9 more }

The creation response, and the only one that carries the secret: it is generated once and never returned again, so a client that loses it has to recreate the endpoint.

id: string

The ID of the webhook endpoint

createdAt: string

The date and time the webhook endpoint was created

enabled: boolean

Whether the webhook is enabled

enabledEvents: array of "*" or "asset.download.completed" or "asset.download.created" or 16 more

The events that trigger the webhook. [’*’] indicates that all events are enabled

One of the following:
"*"
"asset.download.completed"
"asset.download.created"
"asset.download.failed"
"generation.completed"
"generation.created"
"generation.failed"
"inference.cancelled"
"inference.completed"
"inference.created"
"inference.failed"
"model.download.completed"
"model.download.created"
"model.download.failed"
"model.training.cancelled"
"model.training.completed"
"model.training.failed"
"model.training.started"
"team.credit.threshold.crossed"
nbFailedCalls: number

The number of calls to the webhook endpoint that have failed

nbTotalCalls: number

The number of calls to the webhook endpoint

ownerId: string

The ID of the owner of the webhook endpoint: a project id for job lifecycle events, a team id for alert events

ownerType: "project" or "team"

Whether the owner is a project or a team. Required to tell them apart: a project created before the team/project split shares its team’s id

One of the following:
"project"
"team"
secret: string

The endpoint’s secret, used to generate webhook signatures

updatedAt: string

The date and time the webhook endpoint was updated

url: string

The URL of the webhook endpoint

description: optional string

A description of the webhook endpoint

WebhookEndpointDeleteResponse = unknown
WebhookEndpointListResponse object { webhookEndpoints }
webhookEndpoints: array of object { id, createdAt, enabled, 8 more }

A list of the team webhooks

id: string

The ID of the webhook endpoint

createdAt: string

The date and time the webhook endpoint was created

enabled: boolean

Whether the webhook is enabled

enabledEvents: array of "*" or "asset.download.completed" or "asset.download.created" or 16 more

The events that trigger the webhook. [’*’] indicates that all events are enabled

One of the following:
"*"
"asset.download.completed"
"asset.download.created"
"asset.download.failed"
"generation.completed"
"generation.created"
"generation.failed"
"inference.cancelled"
"inference.completed"
"inference.created"
"inference.failed"
"model.download.completed"
"model.download.created"
"model.download.failed"
"model.training.cancelled"
"model.training.completed"
"model.training.failed"
"model.training.started"
"team.credit.threshold.crossed"
nbFailedCalls: number

The number of calls to the webhook endpoint that have failed

nbTotalCalls: number

The number of calls to the webhook endpoint

ownerId: string

The ID of the owner of the webhook endpoint: a project id for job lifecycle events, a team id for alert events

ownerType: "project" or "team"

Whether the owner is a project or a team. Required to tell them apart: a project created before the team/project split shares its team’s id

One of the following:
"project"
"team"
updatedAt: string

The date and time the webhook endpoint was updated

url: string

The URL of the webhook endpoint

description: optional string

A description of the webhook endpoint

WebhookEndpointUpdateResponse object { webhookEndpoint }
webhookEndpoint: object { id, createdAt, enabled, 8 more }
id: string

The ID of the webhook endpoint

createdAt: string

The date and time the webhook endpoint was created

enabled: boolean

Whether the webhook is enabled

enabledEvents: array of "*" or "asset.download.completed" or "asset.download.created" or 16 more

The events that trigger the webhook. [’*’] indicates that all events are enabled

One of the following:
"*"
"asset.download.completed"
"asset.download.created"
"asset.download.failed"
"generation.completed"
"generation.created"
"generation.failed"
"inference.cancelled"
"inference.completed"
"inference.created"
"inference.failed"
"model.download.completed"
"model.download.created"
"model.download.failed"
"model.training.cancelled"
"model.training.completed"
"model.training.failed"
"model.training.started"
"team.credit.threshold.crossed"
nbFailedCalls: number

The number of calls to the webhook endpoint that have failed

nbTotalCalls: number

The number of calls to the webhook endpoint

ownerId: string

The ID of the owner of the webhook endpoint: a project id for job lifecycle events, a team id for alert events

ownerType: "project" or "team"

Whether the owner is a project or a team. Required to tell them apart: a project created before the team/project split shares its team’s id

One of the following:
"project"
"team"
updatedAt: string

The date and time the webhook endpoint was updated

url: string

The URL of the webhook endpoint

description: optional string

A description of the webhook endpoint

TeamsWebhook EndpointsEvents

List
GET/teams/{teamId}/webhook-endpoints/{webhookEndpointId}/events
Retrieve
GET/teams/{teamId}/webhook-endpoints/{webhookEndpointId}/events/{eventId}
ModelsExpand Collapse
EventListResponse object { items, nextPaginationToken }
items: array of object { id, endpointId, status, 2 more }

A list of the team webhook events

id: string
endpointId: string
status: "created" or "failed" or "retrying" or "success"
One of the following:
"created"
"failed"
"retrying"
"success"
type: "*" or "asset.download.completed" or "asset.download.created" or 16 more

Every event a webhook endpoint can subscribe to: a project endpoint takes the job lifecycle events, a team endpoint takes the alert events.

One of the following:
"*"
"asset.download.completed"
"asset.download.created"
"asset.download.failed"
"generation.completed"
"generation.created"
"generation.failed"
"inference.cancelled"
"inference.completed"
"inference.created"
"inference.failed"
"model.download.completed"
"model.download.created"
"model.download.failed"
"model.training.cancelled"
"model.training.completed"
"model.training.failed"
"model.training.started"
"team.credit.threshold.crossed"
updatedAt: string
nextPaginationToken: optional string

A token to query the next page of events

EventRetrieveResponse object { webhookEvent }
webhookEvent: object { id, attempts, createdAt, 6 more }
id: string
attempts: array of object { responseStatusCode, sentAt }
responseStatusCode: number
sentAt: string
createdAt: string
endpointId: string
payload: unknown
sentAt: string
status: "created" or "failed" or "retrying" or "success"
One of the following:
"created"
"failed"
"retrying"
"success"
type: "*" or "asset.download.completed" or "asset.download.created" or 16 more

Every event a webhook endpoint can subscribe to: a project endpoint takes the job lifecycle events, a team endpoint takes the alert events.

One of the following:
"*"
"asset.download.completed"
"asset.download.created"
"asset.download.failed"
"generation.completed"
"generation.created"
"generation.failed"
"inference.cancelled"
"inference.completed"
"inference.created"
"inference.failed"
"model.download.completed"
"model.download.created"
"model.download.failed"
"model.training.cancelled"
"model.training.completed"
"model.training.failed"
"model.training.started"
"team.credit.threshold.crossed"
updatedAt: string