organizations

Invite a member to the organization

Issue a member invite and send its email.

Args: organization_id (int): Identifier of the parent organization. body (CreateOrganizationInviteRequest): Invitee email + role. db (AsyncSession): Request-scoped database session. context (ActiveContext): Resolved caller identity and scope.

Returns: OrganizationInviteResponse: The issued invite (never the token).

post/v1/organizations/{organization_id}/invites/

Request

  • Base URL
    https://api.ethiack.com (the document declares no server; this is the origin it was published from)
  • Auth
    none declared

Path parameters

organization_idinteger required

Request body

emailstring email required
role'owner' | 'admin' | 'analyst' | 'viewer' required

Sub-role within a :data:ActorKind.ORGANIZATION context.

Snake_case wire values are used in the DB, in JWT claims synced from Zitadel, and as components of Cerbos role strings (e.g. "org_admin").

Attributes: OWNER: Full authority over the organization. ADMIN: Administrative authority below the owner. ANALYST: Read and write on engagements, findings, assets. VIEWER: Read-only.

Response

Successful Response

idinteger required
kind'organization' | 'partner' | 'triager' required

Which user kind an account invite grants on redemption.

Doubles as the joined-table-inheritance discriminator: TRIAGER is the base :class:Invite (no grant payload); ORGANIZATION / PARTNER select the typed child.

Attributes: ORGANIZATION: Membership in the invite's organization. PARTNER: Membership in the invite's partner. TRIAGER: The triager kind (platform-scoped, no payload).

emailstring required
status'pending' | 'redeemed' | 'revoked' required

The single terminal-state of an invite's lifecycle.

A live invite is PENDING; it moves once, irreversibly, to exactly one terminal state. Modelling this as one enum (rather than separate per-outcome timestamps) makes "redeemed AND revoked" unrepresentable rather than merely constraint-guarded, and mirrors :class:~phoenix.db.models.pentest_hacker_invite.PentestHackerInviteStatus. Expiry is NOT a member — it is passive and time-derived from expires_at.

Attributes: PENDING: Live and awaiting redemption (paired with a null resolved_at). REDEEMED: Consumed by its invitee. REVOKED: Rescinded by a manager before redemption.

created_atstring date-time required
expires_atstring date-time required
resolved_atstring date-time nullable required
redeemed_by_user_idstring nullable required
expiredboolean required
liveboolean required
organization_idinteger required
role'owner' | 'admin' | 'analyst' | 'viewer' required

Sub-role within a :data:ActorKind.ORGANIZATION context.

Snake_case wire values are used in the DB, in JWT claims synced from Zitadel, and as components of Cerbos role strings (e.g. "org_admin").

Attributes: OWNER: Full authority over the organization. ADMIN: Administrative authority below the owner. ANALYST: Read and write on engagements, findings, assets. VIEWER: Read-only.

Changes

No recorded changes to this operation across all 1 revision of this API.