---
title: "Invite a user to join an organization"
method: POST
path: "/v1beta/organizations/{organization_id}/invites"
tags: ["Invites"]
---

# Invite a user to join an organization

`POST /v1beta/organizations/{organization_id}/invites`

Creates an invitation and sends an email to the specified address. Returns FAILED_PRECONDITION if the email belongs to an existing organization member. Idempotency: If a PENDING invitation already exists for this email, the existing invitation is resent with a new token and refreshed expiration. Expired or revoked invitations are ignored - a new invitation is created.

## Path parameters

- `organization_id` string, required — Organization to invite the user to. Pattern: org_[0-9a-hjkmnp-tv-z]{26}

## Request body

- object — CreateOrganizationInviteRequest contains the data needed to create an invitation.
  - `email` string, email, required — Email address of the recipient.
  - `idempotency_key` string, nullable — Reserved for future use. Currently, idempotency is based on email matching: if a PENDING invitation exists for the same email in this organization, that invitation is resent rather than creating a duplicate.
  - `message` string, nullable — Optional custom message from the sender (max 2000 bytes to support ~500 multibyte characters).

## Response `200`

Success

- CreateOrganizationInviteResponse — CreateOrganizationInviteResponse contains the created invitation.
  - `invite` OrganizationInvite, required — OrganizationInvite represents an invitation to join an organization. accepted_fields_consistency // accepted_at and accepted_by must both be set or both be unset
    - `accepted_at` string, date-time — When the invitation was accepted (if accepted).
    - `accepted_by` User — User represents a human user account. Returned by GetUser (endpoint deferred).
      - `email` string, email, required
      - `family_name` string, nullable — Family name (last name) of the user.
      - `given_name` string, nullable — Given name (first name) of the user.
      - `id` string, required
      - `name` string, required — Display name of the user.
      - `profile_image_url` string, nullable — URL of the user's profile image.
    - `created_at` string, date-time, required — When the invitation was created.
    - `email` string, email, required — Email address of the recipient.
    - `expires_at` string, date-time, required — When the invitation expires.
    - `id` string, required — Unique identifier for the invitation.
    - `message` string, nullable — Custom message from sender to recipient (if provided). Max 2000 bytes to support ~500 multibyte characters.
    - `organization_id` string, required — Organization the invitation is for.
    - `sender` User, required — User represents a human user account. Returned by GetUser (endpoint deferred).
      - `email` string, email, required
      - `family_name` string, nullable — Family name (last name) of the user.
      - `given_name` string, nullable — Given name (first name) of the user.
      - `id` string, required
      - `name` string, required — Display name of the user.
      - `profile_image_url` string, nullable — URL of the user's profile image.
    - `status` 'pending' | 'accepted' | 'expired' | 'revoked', required

## Other responses

- `400` — Invalid request parameters
- `401` — Authentication failed - missing or invalid API key
- `403` — Authorization failed - valid key but insufficient permissions
- `404` — Resource not found
- `429` — Too many requests
- `500` — Internal server error

---

[API](https://skmtc.net/factify-inc/apis/factify-api.md) · [All operations](https://skmtc.net/factify-inc/apis/factify-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/factify-inc/factify-api/revisions/8baabdfb82bf/schema)
