Skip to main content
Resend Invite
Refreshes a pending invitation — sets expiresAt = now + 14 days and resends the email. Valid on any pending invite, including one past expiresAt (resend = refresh a lapsed invite). A terminal invite (accepted/declined/revoked) → 409. Requires the invite capability (or owner).
Resend emits no webhook — the status stays pending, so there is no lifecycle transition.
Requires workspaces.inviteAcceptUrl on the project, exactly as Create Invite does — resending an email that has nowhere to deep-link is equally pointless. Without it this endpoint returns 409 workspace/missing-invite-accept-url and the invitation’s expiresAt is left untouched. See Project settings.

Path Parameters

string
required
The workspace UUID.
string
required
The invitation UUID.

Body Parameters

string
Service/master keys only — the user to act as. Enforced: the invite capability (or ownership) is required of the named user. Omit it to act as the app itself (unbounded). See Acting on behalf of a user.

Response

Returns the refreshed WorkspaceInvitation object.

Error Responses

Returned when no invitation with that id exists on this workspace — including when the id belongs to a different workspace’s invitation.
A project misconfiguration, not a bad request. The row is not touched — expiresAt is unchanged and no email is sent. Set workspaces.inviteAcceptUrl and retry.
The invitation is accepted, declined, or revoked. Note an invitation merely past its expiresAt is not terminal — resending one is the documented purpose of this endpoint.
Every path id on the workspaces bundle is checked for UUID shape before the route runs, so a malformed one is a plain 400 rather than a 500 from the database.
Every workspaces endpoint declares its fields exactly, and a top-level field it does not declare is refused rather than ignored — in the request body and in the query string alike, for every caller. Two or more at once are named together: Unrecognized keys: "onBehalfOf", "impersonate". An offender in the query string carries workspace/invalid-query instead. Send only the fields documented above, plus actingUserId and projectId, which every workspaces route accepts. See Shapes the server rejects.
Returned when a service/master key sends a body with a Content-Type other than application/json and no actingUserId was read. Sublay parses only application/json, so the actor inside such a body is discarded and the request would fall through to the unbounded path. fetch() sends text/plain;charset=UTF-8 when you pass a stringified body and set no headers — set the header. An empty JSON body and a bodiless request both pass. See Shapes the server rejects.
See also: useResendWorkspaceInvite · Project settings