Members

Create a new member

Creates a new member on the site. Only email is required — all other fields are optional.

The email is normalized to lowercase and trimmed. New members are created with status 'active' and verified 'false'. If accessGroupIds is provided, the member is atomically assigned to those access groups during creation. Scope-managed groups cannot be specified and will return 403.

Returns the created member with their full profile including access group memberships. Returns 409 Conflict if a member with the same email already exists on this site.

POST /members

Create a new member

curl --request POST \
  --url 'https://api.sotion.so/api/v1/members' \
  --header 'Authorization: Bearer YOUR_SECRET_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
  "key": "value"
}'
{
  "data": {
    "id": "<uuid>",
    "email": "<email>",
    "displayName": "<string>",
    "status": "active",
    "verified": true,
    "paid": true,
    "registeredAt": "<date-time>",
    "lastLoginAt": "<date-time>",
    "createdAt": "<date-time>",
    "updatedAt": "<date-time>",
    "accessGroups": [
      {}
    ]
  }
}

Member created.

Authorizations

  • Authorization string required header

    Per-site API key (prefix: so_...). Each key is scoped to exactly one Sotion site — the site context is determined entirely by the key. No site ID is needed in any URL. Pass as: Authorization: Bearer so_...

Request Body

application/json
  • email string (email) required

    Email address for the new member. Will be normalized to lowercase and trimmed. Must be unique per site.

  • displayName string nullable

    Optional display name for the member.

  • paid boolean default

    Whether to mark the member as a paying customer. Defaults to false. Default: false.

  • accessGroupIds[] string (uuid) array

    UUIDs of custom access groups to assign the member to during creation. Groups are assigned atomically. Scope-managed groups are not allowed and will return 403.

Response

application/json
  • Location string response header

    URL of the created member.

  • X-RateLimit-Limit integer response header

    Maximum requests allowed in the current window.

  • X-RateLimit-Remaining integer response header

    Requests remaining in the current window.

  • X-RateLimit-Reset integer response header

    Unix timestamp (seconds) when the rate limit window resets.

  • X-Request-Id string (uuid) response header

    Unique request identifier for support and debugging.

  • data allOf
    + Show Child Attributes
    • id string (uuid) allOf

      Unique identifier (UUID) for the member.

    • email string (email) allOf

      Member's email address (normalized to lowercase).

    • displayName string allOfnullable

      Display name shown to the member, null if not set.

    • status string enum allOfenum

      'active' means the member can access the site. 'blocked' means the member is denied access. Allowed values: active, blocked.

    • verified boolean allOfnullable

      Whether the member has verified their email by clicking a login link. Null if unknown.

    • paid boolean allOfnullable

      Whether this member is marked as a paying customer. Set manually or via the API.

    • registeredAt string (date-time) allOfnullable

      When the member first registered (clicked a login link or was added).

    • lastLoginAt string (date-time) allOfnullable

      When the member last logged in via a login link.

    • createdAt string (date-time) allOfnullable

      When the member record was created.

    • updatedAt string (date-time) allOfnullable

      When the member record was last modified.

    • accessGroups[] object allOfarray

      List of access groups this member belongs to. Only included in getMember and createMember responses, NOT in listMembers.

      + Show Child Attributes
      • id string (uuid)

        UUID of the access group.

      • name string

        Name of the access group.