Table of Contents

User Memberships

View and manage your account memberships. Memberships represent the accounts you have access to.

Overview

Access memberships through cf.User:

public class MembershipService(ICloudflareApiClient cf)
{
    public async Task<IReadOnlyList<Membership>> GetMyAccountsAsync()
    {
        var memberships = new List<Membership>();

        await foreach (var membership in cf.User.ListAllMembershipsAsync())
        {
            memberships.Add(membership);
        }

        return memberships;
    }
}

Listing Memberships

With Pagination

var result = await cf.User.ListMembershipsAsync(
    new ListMembershipsFilters(
        Status: MemberStatus.Accepted,
        Page: 1,
        PerPage: 50
    ));

foreach (var membership in result.Items)
{
    Console.WriteLine($"Account: {membership.Account.Name}");
    Console.WriteLine($"  Status: {membership.Status}");
    Console.WriteLine($"  Roles: {string.Join(", ", membership.Roles.Select(r => r.Name))}");
}

List All Memberships

await foreach (var membership in cf.User.ListAllMembershipsAsync())
{
    Console.WriteLine($"{membership.Account.Name} [{membership.Status}]");
}

Filter by Status

// Get pending invitations
var pending = await cf.User.ListMembershipsAsync(
    new ListMembershipsFilters(Status: MemberStatus.Pending));

foreach (var membership in pending.Items)
{
    Console.WriteLine($"Invitation from: {membership.Account.Name}");
}

Getting Membership Details

var membership = await cf.User.GetMembershipAsync(membershipId);

Console.WriteLine($"Account: {membership.Account.Name}");
Console.WriteLine($"Account ID: {membership.Account.Id}");
Console.WriteLine($"Status: {membership.Status}");
Console.WriteLine($"API Access: {membership.ApiAccessEnabled}");

Console.WriteLine("Roles:");
foreach (var role in membership.Roles)
{
    Console.WriteLine($"  - {role.Name}");
}

Accepting/Rejecting Invitations

Note

Preview: This operation has limited test coverage.

Accept an Invitation

var result = await cf.User.UpdateMembershipAsync(membershipId,
    new UpdateMembershipRequest(MemberStatus.Accepted));

Console.WriteLine($"Accepted invitation to {result.Account.Name}");

Reject an Invitation

var result = await cf.User.UpdateMembershipAsync(membershipId,
    new UpdateMembershipRequest(MemberStatus.Rejected));

Console.WriteLine($"Rejected invitation from {result.Account.Name}");
Warning

Once an invitation is accepted or rejected, its status cannot be changed.

Leaving an Account

Note

Preview: This operation has limited test coverage.

Remove yourself from an account:

await cf.User.DeleteMembershipAsync(membershipId);
Console.WriteLine("Left the account");
Warning

Leaving an account removes your access immediately. You must be re-invited to regain access.

Models Reference

Membership

Property Type Description
Id string Membership identifier
Account MembershipAccount Account information
Status MemberStatus Membership status
Roles IReadOnlyList<AccountRole> Assigned roles
ApiAccessEnabled bool? Whether API access is enabled
Permissions IReadOnlyList<string>? Granted permissions

MembershipAccount

Property Type Description
Id string Account identifier
Name string Account name

MemberStatus (Extensible Enum)

Known Value Description
Pending Invitation awaiting response
Accepted Active membership
Rejected Invitation was rejected

ListMembershipsFilters

Property Type Description
Status MemberStatus? Filter by status
AccountName string? Filter by account name
Page int? Page number (1-based)
PerPage int? Results per page
Order string? Field to order by
Direction ListOrderDirection? Sort direction

Common Patterns

Find Account by Name

public async Task<Membership?> FindAccountByNameAsync(string accountName)
{
    await foreach (var membership in cf.User.ListAllMembershipsAsync())
    {
        if (membership.Account.Name.Contains(accountName, StringComparison.OrdinalIgnoreCase))
        {
            return membership;
        }
    }

    return null;
}

Accept All Pending Invitations

public async Task AcceptAllPendingAsync()
{
    var filters = new ListMembershipsFilters(Status: MemberStatus.Pending);

    await foreach (var membership in cf.User.ListAllMembershipsAsync(filters))
    {
        await cf.User.UpdateMembershipAsync(membership.Id,
            new UpdateMembershipRequest(MemberStatus.Accepted));

        Console.WriteLine($"Accepted: {membership.Account.Name}");
    }
}

List Accounts with Specific Permission

public async Task ListAccountsWithDnsAccessAsync()
{
    Console.WriteLine("Accounts with DNS access:");

    await foreach (var membership in cf.User.ListAllMembershipsAsync())
    {
        if (membership.Status != MemberStatus.Accepted)
            continue;

        var hasDns = membership.Roles.Any(r =>
            r.Permissions?.DnsRecords?.Write == true);

        if (hasDns)
        {
            Console.WriteLine($"  - {membership.Account.Name}");
        }
    }
}

Required Permissions

Permission Scope Level
Memberships User Read (for listing/get)
Memberships User Write (for accept/reject/leave)