Team

Invite a colleague (preview, then confirm)

Owner or admin. Always creates a pending invite and emails it, even when the address already has a posterly account (it joins at their next sign-in if they do not click the link). The email subject names the inviter (their name with their email address, or just their email address) and the workspace. Admin seats are dashboard-only over the API. The invite counts toward the plan seat limit while pending. The workspace owner is emailed about every API team change, naming the API key. Two steps. Without confirm: true the call returns 200 with requires_confirmation, a plain-language preview and a short-lived preview_id, and changes nothing. Show the preview to the user; after they approve, repeat the call with confirm: true and the preview_id. If anything changed in between, the confirm answers 409 preview_stale and changes nothing (a safeguard for the user, not a security control: every rule is checked again on confirm). Access: an API key that a person granted "Manage team" in /dashboard/api (members:read and members:write). Browser sessions are refused with api_key_required; the scopes can never be requested through POST /api/v1/api-keys. ChatGPT, Claude and other OAuth connections hold both scopes implicitly (when their grant includes accounts:write) but may call this endpoint only while the person is an owner or admin of the workspace; otherwise 403 team_management_requires_admin. A key bound to another workspace, or a caller who is not a member, gets 404; a caller whose seat was removed gets 403 workspace_access_revoked. Repeats: the same email, role and brands answers 200 already_invited and sends nothing unless resend: true. A current member answers 409 already_member (use PATCH). Send an Idempotency-Key header on the confirm call to make retries safe. Limits (previews count): 10 invite requests per workspace and 30 per user per 24 hours, and 3 emails per address per workspace per 24 hours. Confirmed invites are processed one at a time per workspace so two parallel calls cannot both take the last seat. Error codes: api_key_required, insufficient_scope, insufficient_role, team_management_requires_admin (403, OAuth connection below admin), admin_role_dashboard_only, plan_required, subscription_required (402), seat_limit_reached (403, with seats_used and seat_limit), validation_error, cannot_invite_self, invalid_brand_ids, preview_required, preview_stale (409), already_member (409), invite_in_progress (409), idempotency_key_reused (409), rate_limited / recipient_rate_limited (429), temporarily_unavailable (503).

post/api/v1/workspaces/{workspaceId}/members

Request

  • Base URL: https://www.poster.ly
  • URL: https://www.poster.ly/api/v1/workspaces/{workspaceId}/members
  • Auth: HTTP bearer

Path parameters

workspaceIdstring uuid required

Workspace ID (from whoami).

Headers

Idempotency-Keystring

Optional. Replays the stored response for a repeated confirm call for 24 hours.

Request body

emailstring email required
role'publisher' | 'editor' | 'viewer' required

Admin seats are dashboard-only: admin answers 403 admin_role_dashboard_only.

brand_idsstring[]

Limit the seat to these brands. Empty or omitted means every brand.

resendboolean

Email an unchanged pending invite again (capped at 3 emails per address per workspace per 24 hours).

confirmboolean

Omit (or false) for a preview. true, with preview_id, to act.

preview_idstring

From the preview response. Required with confirm: true.

Example request

{
  "email": "sam@agency.com",
  "role": "editor",
  "brand_ids": []
}

Response

Preview (nothing changed), or already_invited (nothing sent).

OR

Example response

{
  "requires_confirmation": true,
  "preview": {
    "action": "invite",
    "summary": "Send an invite email to sam@agency.com to join the workspace as Editor. It counts toward your 10 seats (4 in use now).",
    "email": "sam@agency.com",
    "role": "editor",
    "previous_role": null,
    "brand_ids": [],
    "previous_brand_ids": null,
    "sends_email": true,
    "counts_toward_seats": true,
    "seats_used": 4,
    "seat_limit": 10
  },
  "preview_id": "mp1.1790000900000.q3v9...",
  "preview_expires_at": "2026-09-23T12:15:00.000Z",
  "next_step": "Nothing has changed yet. Show this preview to the user and, only after they explicitly approve, call again with confirm: true and this preview_id."
}

Changes

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