Create a tenant invitation
| 名称 | 位置 | 类型 | 必填 | 说明 |
|---|---|---|---|---|
| Idempotency-Key | header | string | 否 | Optional idempotency key, at most 255 characters (UUIDv4 recommended). A repeated key returns the first response byte-for-byte, including a 5xx. The same key with a different body, or a second in-flight request, returns 409 IDEMPOTENCY_CONFLICT. Keys are unique per tenant and retained for 24 hours. |
{
"type": "object",
"properties": {
"email": {
"type": "string",
"description": "Invitee email. Must include a domain with a real TLD (rejects qa-probe@bad).",
"example": "user+tag@example.com"
},
"role": {
"enum": [
"owner",
"admin",
"researcher",
"billing_admin",
"viewer"
],
"type": "string"
},
"expiresInDays": {
"type": "number",
"minimum": 1,
"maximum": 7,
"description": "Invitation lifetime in days. Omitted defaults to 7 (ADR 0019). Allowed range 1–7."
},
"projectGrants": {
"description": "Project roles applied when the invitee accepts (SCHEMA §10). Collector grants may include orderId and taskId.",
"type": "array",
"items": {
"$ref": "#/components/schemas/InvitationProjectGrantBodyDto"
}
}
},
"required": [
"email",
"role"
]
}| 状态码 | 说明 | Content-Type | Schema |
|---|---|---|---|
| 201 | Success | application/json | object |
| 400 | Bad request. Enumerated catalog codes for this operation. | application/problem+json | union |
| 401 | Authentication failed. A specific TOKEN_* cause is returned only when the presented hash matched a stored row. | application/problem+json | union |
| 403 | Authorization failed. PERMISSION_DENIED on an any-of route lists the alternatives in message. | application/problem+json | union |
| 409 | Conflict. Enumerated catalog codes for this operation. | application/problem+json | union |
| 429 | Authenticated per-principal or per-tenant request budget exceeded. Rate-limit headers appear only on 429. | application/problem+json | union |
{
"type": "object",
"properties": {
"data": {
"$ref": "#/components/schemas/TenantInvitationSummaryDto"
},
"meta": {
"type": "object",
"properties": {
"requestId": {
"type": "string"
}
},
"required": [
"requestId"
]
}
},
"required": [
"data",
"meta"
]
}{
"allOf": [
{
"$ref": "#/components/schemas/ProblemJson"
},
{
"type": "object",
"properties": {
"status": {
"type": "integer",
"enum": [
400
]
},
"code": {
"type": "string",
"enum": [
"BAD_REQUEST",
"IDEMPOTENCY_KEY_INVALID",
"IF_MATCH_INVALID",
"INVITATION_EXPIRED",
"INVITATION_INVALID",
"TENANT_CONTEXT_MISMATCH",
"TENANT_REQUIRED",
"VALIDATION_ERROR"
]
}
}
}
]
}{
"allOf": [
{
"$ref": "#/components/schemas/PublishedAuthProblem"
},
{
"type": "object",
"properties": {
"status": {
"type": "integer",
"enum": [
401
]
},
"code": {
"type": "string",
"enum": [
"TOKEN_MALFORMED",
"TOKEN_NOT_FOUND",
"TOKEN_EXPIRED",
"TOKEN_REVOKED",
"UNAUTHORIZED",
"SESSION_EXPIRED",
"ACTIVATION_REQUIRED",
"MFA_REQUIRED"
]
}
}
}
]
}{
"allOf": [
{
"$ref": "#/components/schemas/PublishedAuthProblem"
},
{
"type": "object",
"properties": {
"status": {
"type": "integer",
"enum": [
403
]
},
"code": {
"type": "string",
"enum": [
"PERMISSION_DENIED",
"PERMISSION_NOT_DECLARED",
"FORBIDDEN",
"MEMBERSHIP_NOT_FOUND",
"MEMBERSHIP_DISABLED",
"MEMBERSHIP_EXPIRED",
"PROJECT_MEMBERSHIP_EXPIRED"
]
}
}
}
]
}{
"allOf": [
{
"$ref": "#/components/schemas/ProblemJson"
},
{
"type": "object",
"properties": {
"status": {
"type": "integer",
"enum": [
409
]
},
"code": {
"type": "string",
"enum": [
"IDEMPOTENCY_CONFLICT",
"INVITATION_ALREADY_ACCEPTED",
"INVITATION_EMAIL_MISMATCH",
"INVITATION_REVOKED"
]
}
}
}
]
}{
"allOf": [
{
"$ref": "#/components/schemas/PublishedAuthProblem"
},
{
"type": "object",
"properties": {
"status": {
"type": "integer",
"enum": [
429
]
},
"code": {
"type": "string",
"enum": [
"RATE_LIMITED"
]
}
}
}
]
}curl -X POST 'https://api.embodiflow.io/v1/tenant-invitations' \
-H 'Authorization: Bearer $EMBODIFLOW_PAT' \
-H 'Content-Type: application/json' \
-d '{}'