> ## Documentation Index
> Fetch the complete documentation index at: https://bifrost-dev.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# Add project members

> Adds users to the roster. The call is create-only: a user already on the
roster keeps their existing membership and caps.

On a project with `split_policy: equal` the addition shrinks every
member's slice of every cap, so a rate limit that cannot be divided into
whole units for the resulting roster is refused before anything is
written, and the recalculation is queued and reported as
`redivision_job_id`.


<Note>
  This endpoint is available in [Bifrost Enterprise](https://www.getmaxim.ai/bifrost/enterprise) only.
</Note>


## OpenAPI

````yaml /openapi/openapi.json post /api/governance/projects/{project_id}/members
openapi: 3.1.0
info:
  title: Bifrost API
  description: >
    Bifrost HTTP Transport API for AI model inference and gateway management.


    This API provides a unified interface for interacting with multiple AI
    providers

    including OpenAI, Anthropic, Bedrock, Gemini, and more through a single API,

    along with comprehensive management APIs for configuring and monitoring the
    gateway.


    ## API Structure


    ### Unified Inference API (`/v1/*`)

    The primary API using Bifrost's unified format. Model parameters use the
    format

    `provider/model` (e.g., `openai/gpt-4`, `anthropic/claude-3-opus`).


    ### Async Inference API (`/v1/async/*`)

    Submit inference requests for asynchronous execution. Returns a job ID
    immediately

    and allows polling for results. Supports all inference types except batches,
    files,

    and containers.


    ### Provider Integration APIs

    Native provider-format APIs for drop-in compatibility:

    - `/openai/*` - OpenAI-compatible API

    - `/anthropic/*` - Anthropic-compatible API

    - `/genai/*` - Google GenAI (Gemini) compatible API

    - `/bedrock/*` - AWS Bedrock compatible API

    - `/cohere/*` - Cohere compatible API


    ### Framework Integration APIs

    Multi-provider proxy endpoints for AI frameworks:

    - `/litellm/*` - LiteLLM proxy with all provider formats

    - `/langchain/*` - LangChain compatible endpoints

    - `/pydanticai/*` - PydanticAI compatible endpoints


    ### Management APIs (`/api/*`)

    APIs for managing and monitoring the Bifrost gateway:

    - `/api/config` - Configuration management

    - `/api/providers` - Provider and API key management

    - `/api/plugins` - Plugin management

    - `/api/governance/*` - Virtual keys, teams, customers, budgets, rate
    limits, routing rules, and pricing overrides

    - `/api/logs` - Log search and analytics

    - `/api/mcp/*` - MCP (Model Context Protocol) client management

    - `/api/session/*` - Authentication and session management

    - `/api/cache/*` - Cache management

    - `/health` - Health check endpoint


    ## Fallbacks

    Requests can include fallback models that will be tried if the primary model
    fails.
  version: 1.0.0
  contact:
    name: Contact Us
    url: https://getmaxim.ai/bifrost
  license:
    name: Apache 2.0
    url: https://opensource.org/licenses/Apache-2.0
servers:
  - url: '{baseUrl}'
    description: Your Bifrost instance
    variables:
      baseUrl:
        default: http://localhost:8080
        description: Base URL of your Bifrost instance (e.g. https://bifrost.mycompany.com)
security:
  - BearerAuth: []
  - BasicAuth: []
  - ApiKeyAuth: []
tags:
  - name: Models
    description: Model listing and information
  - name: Chat Completions
    description: Chat-based text generation
  - name: Text Completions
    description: Text completion generation
  - name: Responses
    description: OpenAI Responses API compatible endpoints
  - name: OCR
    description: Optical character recognition for documents and images
  - name: Rerank
    description: Document reranking by relevance to a query
  - name: Embeddings
    description: Text embedding generation
  - name: Images
    description: Image generations, editing, and variations
  - name: Videos
    description: Video generation and management
  - name: Audio
    description: Speech synthesis and transcription
  - name: Count Tokens
    description: Token counting utilities
  - name: Batch
    description: Batch processing operations
  - name: Files
    description: File management operations
  - name: Containers
    description: Container management operations
  - name: Async Jobs
    description: Asynchronous job submission and retrieval endpoints
  - name: Realtime
    description: Realtime WebSocket and WebRTC endpoints
  - name: OpenAI Integration
    description: OpenAI-compatible API endpoints (/openai/*)
  - name: Azure Integration
    description: Azure OpenAI integration endpoints
  - name: Anthropic Integration
    description: Anthropic-compatible API endpoints (/anthropic/*)
  - name: GenAI Integration
    description: Google GenAI (Gemini) compatible API endpoints (/genai/*)
  - name: Bedrock Integration
    description: AWS Bedrock compatible API endpoints (/bedrock/*)
  - name: Cohere Integration
    description: Cohere compatible API endpoints (/cohere/*)
  - name: LiteLLM Integration
    description: LiteLLM proxy endpoints with multi-provider support (/litellm/*)
  - name: LangChain Integration
    description: LangChain compatible endpoints with multi-provider support (/langchain/*)
  - name: PydanticAI Integration
    description: >-
      PydanticAI compatible endpoints with multi-provider support
      (/pydanticai/*)
  - name: Health
    description: Health check endpoints
  - name: Configuration
    description: Configuration management endpoints
  - name: Session
    description: Session and authentication endpoints
  - name: Providers
    description: Provider management endpoints
  - name: Plugins
    description: Plugin management endpoints
  - name: MCP
    description: Model Context Protocol endpoints
  - name: Governance
    description: Virtual keys, teams, and customers management
  - name: Routing
    description: Routing rules and complexity analyzer configuration
  - name: Logging
    description: Log search and management endpoints
  - name: Cache
    description: Cache management endpoints
  - name: Vault
    description: Vault secret management endpoints
  - name: Skills
    description: Skills Repository management, marketplace, and download endpoints
  - name: Audit Logs
    description: >-
      CADF-compliant audit log search, export, and signature verification
      endpoints
  - name: Webhooks
    description: Webhook endpoint management and signed async-job delivery history
  - name: Notifications
    description: >-
      Role-targeted dashboard notifications, delivered over the dashboard
      WebSocket
paths:
  /api/governance/projects/{project_id}/members:
    post:
      tags:
        - Projects
      summary: Add project members
      description: |
        Adds users to the roster. The call is create-only: a user already on the
        roster keeps their existing membership and caps.

        On a project with `split_policy: equal` the addition shrinks every
        member's slice of every cap, so a rate limit that cannot be divided into
        whole units for the resulting roster is refused before anything is
        written, and the recalculation is queued and reported as
        `redivision_job_id`.
      operationId: addProjectMembers
      parameters:
        - name: project_id
          in: path
          required: true
          schema:
            type: string
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              description: >-
                Create-only. A user already on the roster keeps their existing
                membership and caps, and the entry for them is discarded.
              required:
                - members
              properties:
                members:
                  type: array
                  minItems: 1
                  items:
                    type: object
                    description: >-
                      A user on a project's roster. Members are users, never
                      keys or teams: a key authenticates a request, and the user
                      behind it is who belongs to a project.
                    required:
                      - user_id
                    properties:
                      id:
                        type: string
                        readOnly: true
                        description: >-
                          The membership row id, which is the `{member_id}` of
                          the member routes.
                      user_id:
                        type: string
                        description: >-
                          Immutable after creation. Changing it is a remove and
                          an add.
                      budget_shares:
                        type: array
                        items:
                          type: object
                          description: >-
                            One member's cap on a budget the project holds. The
                            share is a second cap, not a replacement: the budget
                            it slices still caps the whole, and whichever binds
                            first refuses the request.
                          required:
                            - source_budget_id
                          properties:
                            id:
                              type: string
                              readOnly: true
                            project_id:
                              type: string
                              readOnly: true
                            user_id:
                              type: string
                              readOnly: true
                            source_budget_id:
                              type: string
                              description: >-
                                The budget being sliced. Must be one the project
                                holds, at any tier.
                            budget_id:
                              type: string
                              readOnly: true
                              description: >-
                                The derived governance budget that enforces the
                                slice.
                            share_value:
                              type: number
                              description: >-
                                The authored figure. A percent share must be
                                greater than 0 and at most 100; an amount share
                                must be greater than 0. Null on every slice
                                derived by an equal split.
                            share_type:
                              type: string
                              enum:
                                - percent
                                - amount
                              description: >-
                                Whether a member's authored share is a
                                percentage of the source cap or an absolute
                                figure. Budget shares must state this
                                explicitly; a rate-limit share left blank
                                settles to `amount`.
                            budget:
                              readOnly: true
                              allOf:
                                - type: object
                                  description: >-
                                    A spend cap on a project, on a provider
                                    inside it, or on a model under that
                                    provider. On an update, restating `id` pairs
                                    the declaration with its stored row so
                                    accumulated spend and the window anchor
                                    carry over; omit `id` to create a new cap.
                                  required:
                                    - max_limit
                                    - reset_duration
                                  properties:
                                    id:
                                      type: string
                                      description: >-
                                        Omit to create. Restate to update in
                                        place. An id the project does not hold
                                        is refused.
                                    max_limit:
                                      type: number
                                      minimum: 0
                                      description: Cap in dollars.
                                    reset_duration:
                                      type: string
                                      description: >-
                                        Reset window as a number and a unit, for
                                        example `30s`, `5m`, `1h`, `1d`, `1w`,
                                        `1M`, `1Q`, `1Y`. Only day-or-longer
                                        windows can be calendar-aligned.
                                      example: 1M
                                    reset_config:
                                      type: object
                                      description: >-
                                        Window settings the reset duration
                                        cannot express. Only valid when
                                        `reset_duration` is quarterly (`1Q`).
                                      properties:
                                        quarter_start_month:
                                          type: integer
                                          minimum: 1
                                          maximum: 12
                                          description: >-
                                            First month of Q1 as 1-12. Omitted means
                                            January. Only the value modulo 3 changes
                                            the reset dates, so January, April, July
                                            and October all reset on calendar
                                            quarters.
                                      additionalProperties: false
                                    current_usage:
                                      type: number
                                      readOnly: true
                                      description: Spend recorded in the current window.
                                    last_reset:
                                      type: string
                                      format: date-time
                                      readOnly: true
                                    override_amount:
                                      type: number
                                      readOnly: true
                                      description: >-
                                        Operator top-up added to `max_limit`
                                        while active. Projects have no endpoint
                                        that sets one; the field is reported for
                                        completeness.
                                    override_mode:
                                      type: string
                                      readOnly: true
                                    override_cycles_remaining:
                                      type: integer
                                      readOnly: true
                                    override_cycles_total:
                                      type: integer
                                      readOnly: true
                                    override_anchor_reset:
                                      type: string
                                      format: date-time
                                      readOnly: true
                                    config_hash:
                                      type: string
                                      readOnly: true
                                    created_at:
                                      type: string
                                      format: date-time
                                      readOnly: true
                                    updated_at:
                                      type: string
                                      format: date-time
                                      readOnly: true
                              description: The derived budget row, with its own usage.
                            created_at:
                              type: string
                              format: date-time
                              readOnly: true
                            updated_at:
                              type: string
                              format: date-time
                              readOnly: true
                      rate_limit_shares:
                        type: array
                        items:
                          type: object
                          description: >-
                            One member's cap on a rate limit the project holds.
                            The token and request dimensions are authored
                            independently, so a member may hold a percentage of
                            tokens and a flat count of requests.
                          required:
                            - source_rate_limit_id
                          properties:
                            id:
                              type: string
                              readOnly: true
                            project_id:
                              type: string
                              readOnly: true
                            user_id:
                              type: string
                              readOnly: true
                            source_rate_limit_id:
                              type: string
                              description: >-
                                The rate limit being sliced. Must be one the
                                project holds, at any tier.
                            rate_limit_id:
                              type: string
                              readOnly: true
                              description: >-
                                The derived governance rate limit that enforces
                                the slice.
                            token_share:
                              type: integer
                              description: >-
                                Authored token share. Requires the source to cap
                                tokens. A percent share that comes to no whole
                                tokens is refused.
                            token_share_type:
                              allOf:
                                - type: string
                                  enum:
                                    - percent
                                    - amount
                                  description: >-
                                    Whether a member's authored share is a
                                    percentage of the source cap or an absolute
                                    figure. Budget shares must state this
                                    explicitly; a rate-limit share left blank
                                    settles to `amount`.
                              description: >-
                                Settles to `amount` when a token share is given
                                without one.
                            request_share:
                              type: integer
                              description: >-
                                Authored request share. Requires the source to
                                cap requests. A percent share that comes to no
                                whole requests is refused.
                            request_share_type:
                              allOf:
                                - type: string
                                  enum:
                                    - percent
                                    - amount
                                  description: >-
                                    Whether a member's authored share is a
                                    percentage of the source cap or an absolute
                                    figure. Budget shares must state this
                                    explicitly; a rate-limit share left blank
                                    settles to `amount`.
                              description: >-
                                Settles to `amount` when a request share is
                                given without one.
                            rate_limit:
                              readOnly: true
                              allOf:
                                - type: object
                                  description: >-
                                    A token and request rate limit on a project,
                                    on a provider inside it, or on a model under
                                    that provider. The two dimensions run
                                    independent windows, and a cap is enforced
                                    only together with its window.
                                  properties:
                                    id:
                                      type: string
                                      description: >-
                                        Omit to create. Restate to update in
                                        place.
                                    token_max_limit:
                                      type: integer
                                      minimum: 0
                                      description: >-
                                        Maximum tokens per window. Requires
                                        `token_reset_duration`. On a project
                                        with `split_policy: equal`, a cap below
                                        the member count is refused, since a
                                        slice is a whole number of tokens.
                                    token_reset_duration:
                                      type: string
                                      example: 1h
                                    request_max_limit:
                                      type: integer
                                      minimum: 0
                                      description: >-
                                        Maximum requests per window. Requires
                                        `request_reset_duration`. Subject to the
                                        same lower bound under `split_policy:
                                        equal`.
                                    request_reset_duration:
                                      type: string
                                      example: 1h
                                    token_current_usage:
                                      type: integer
                                      readOnly: true
                                    token_last_reset:
                                      type: string
                                      format: date-time
                                      readOnly: true
                                    request_current_usage:
                                      type: integer
                                      readOnly: true
                                    request_last_reset:
                                      type: string
                                      format: date-time
                                      readOnly: true
                                    config_hash:
                                      type: string
                                      readOnly: true
                                    created_at:
                                      type: string
                                      format: date-time
                                      readOnly: true
                                    updated_at:
                                      type: string
                                      format: date-time
                                      readOnly: true
                              description: >-
                                The derived rate limit row, with its own
                                counters.
                            created_at:
                              type: string
                              format: date-time
                              readOnly: true
                            updated_at:
                              type: string
                              format: date-time
                              readOnly: true
                      user_name:
                        type: string
                        readOnly: true
                      user_email:
                        type: string
                        readOnly: true
                      created_at:
                        type: string
                        format: date-time
                        readOnly: true
                      updated_at:
                        type: string
                        format: date-time
                        readOnly: true
              additionalProperties: false
      responses:
        '201':
          description: Members added
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    example: 2 member(s) added
                    description: >-
                      Counts the entries submitted, including any already on the
                      roster.
                  redivision_job_id:
                    type: string
                    description: >-
                      Present only on a project with `split_policy: equal`,
                      whose every member's slice of every cap is recalculated in
                      the background.
        '400':
          description: Bad request
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BifrostError'
        '404':
          description: Project not found
        '500':
          description: Internal server error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/BifrostError'
      security:
        - ManagementBearerAuth: []
components:
  schemas:
    BifrostError:
      type: object
      description: Error response from Bifrost
      properties:
        event_id:
          type: string
        type:
          type: string
        is_bifrost_error:
          type: boolean
        status_code:
          type: integer
        error:
          $ref: '#/components/schemas/ErrorField'
        extra_fields:
          $ref: '#/components/schemas/BifrostErrorExtraFields'
    ErrorField:
      type: object
      properties:
        type:
          type: string
        code:
          type: string
        message:
          type: string
        param:
          type: string
        event_id:
          type: string
    BifrostErrorExtraFields:
      type: object
      properties:
        provider:
          $ref: '#/components/schemas/ModelProvider'
        model_requested:
          type: string
        request_type:
          type: string
    ModelProvider:
      type: string
      description: AI model provider identifier
      enum:
        - anthropic
        - azure
        - bedrock
        - bedrock_mantle
        - cerebras
        - cohere
        - deepseek
        - gemini
        - groq
        - mistral
        - ollama
        - opencode-go
        - opencode-zen
        - openai
        - parasail
        - perplexity
        - sgl
        - vertex
        - openrouter
        - elevenlabs
        - huggingface
        - nebius
        - xai
        - replicate
        - vllm
        - runway
        - runware
        - fireworks
        - sarvam
        - wafer
        - databricks
  securitySchemes:
    BearerAuth:
      type: http
      scheme: bearer
      description: >
        Bearer token authentication. Use your provider API key or Bifrost
        authentication token.

        Virtual keys (prefixed with `sk-bf-`) can also be passed here.
    BasicAuth:
      type: http
      scheme: basic
      description: |
        Basic authentication using username and password.
    ApiKeyAuth:
      type: apiKey
      in: header
      name: x-api-key
      description: |
        API key authentication via the `x-api-key` header.
        Virtual keys (prefixed with `sk-bf-`) can also be passed here.
    ManagementBearerAuth:
      type: http
      scheme: bearer
      description: >
        Management API authentication for `/api/*` endpoints. Use the
        `Authorization` header with `Bearer <API key>`.

        Virtual keys, dashboard/user/session tokens, and `x-api-key` headers are
        not supported on management APIs.

````