> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Negotiate

> Negotiate a SignalR Connection to the PubSub service, as the first step of establishing the connection. Note: SignalR client implementations expect the Hub URL to omit the `/negotiate` portion of this path (ex: HubConnection should be passed a URL that ends in `...playfabapi.com/pubsub`). When starting the connection, SignalR clients will automatically append `/negotiate` to the end of the URL of the hub. The SignalR client will interpret the response object to establish a persistent connection to PubSub. https://learn.microsoft.com/aspnet/core/signalr/dotnet-client#connect-to-a-hub https://github.com/dotnet/aspnetcore/blob/main/src/SignalR/docs/specs/TransportProtocols.md#post-endpoint-basenegotiate-request

Allowed entity token types: title_player_account, game_server

## Error codes

This operation may return the following PlayFab errors:

| Error | Code |
| --- | --- |
| InternalServerError | 1110 |
| InvalidParams | 1000 |
| PubSubFeatureNotEnabledForTitle | 2500 |
| PubSubTooManyRequests | 2501 |
| ServiceUnavailable | 1123 |




## OpenAPI

````yaml post /PubSub/Negotiate
openapi: 3.0.0
info:
  version: '260922'
  title: PlayFab Multiplayer API
  description: >-
    API methods for managing multiplayer servers. API methods for managing
    parties. The lobby service helps players group together to play multiplayer
    games. It is often used as a rendezvous point for players to share
    connection information. The TrueSkill service helps titles to estimate a
    player's skill based on their match results. The player skill values from
    this service are commonly used by a matchmaking service to provide players
    with balanced matches.
  termsOfService: https://playfab.com/terms/
  contact:
    url: https://community.playfab.com/index.html
  license:
    name: Apache 2.0
    url: https://github.com/PlayFab/API_Specs/blob/master/LICENSE
servers:
  - url: https://{titleId}.playfabapi.com
    description: PlayFab title endpoint
    variables:
      titleId:
        default: your_title_id
        description: Your PlayFab title ID (hex).
security: []
tags:
  - name: Lobby
    description: ''
  - name: Matchmaking
    description: Matchmaking APIs
  - name: Matchmaking Admin
    description: Matchmaking Admin APIs
  - name: MultiplayerServer
    description: Multiplayer Server APIs
  - name: PubSub
    description: PlayFab PubSub APIs
  - name: TrueSkill
    description: TrueSkill APIs
  - name: TrueSkill Admin
    description: TrueSkill Admin APIs
paths:
  /PubSub/Negotiate:
    post:
      tags:
        - PubSub
      summary: Negotiate
      description: >
        Negotiate a SignalR Connection to the PubSub service, as the first step
        of establishing the connection. Note: SignalR client implementations
        expect the Hub URL to omit the `/negotiate` portion of this path (ex:
        HubConnection should be passed a URL that ends in
        `...playfabapi.com/pubsub`). When starting the connection, SignalR
        clients will automatically append `/negotiate` to the end of the URL of
        the hub. The SignalR client will interpret the response object to
        establish a persistent connection to PubSub.
        https://learn.microsoft.com/aspnet/core/signalr/dotnet-client#connect-to-a-hub
        https://github.com/dotnet/aspnetcore/blob/main/src/SignalR/docs/specs/TransportProtocols.md#post-endpoint-basenegotiate-request


        Allowed entity token types: title_player_account, game_server


        ## Error codes


        This operation may return the following PlayFab errors:


        | Error | Code |

        | --- | --- |

        | InternalServerError | 1110 |

        | InvalidParams | 1000 |

        | PubSubFeatureNotEnabledForTitle | 2500 |

        | PubSubTooManyRequests | 2501 |

        | ServiceUnavailable | 1123 |
      operationId: Negotiate
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/PubSubNegotiateRequest'
        description: >-
          SignalR clients make this request to initiate their connection to the
          PubSubHub SignalR service. Clients will interpret the response and
          make a persistent websocket connection to the service with the
          details.
      responses:
        '200':
          $ref: '#/components/responses/PubSubNegotiateResult'
        '400':
          $ref: '#/components/responses/ApiErrorWrapper'
      security:
        - EntityToken: []
components:
  schemas:
    PubSubNegotiateRequest:
      description: >-
        SignalR clients make this request to initiate their connection to the
        PubSubHub SignalR service. Clients will interpret the response and make
        a persistent websocket connection to the service with the details.
      type: object
      properties:
        CustomTags:
          description: >-
            The optional custom tags associated with the request (e.g. build
            number, external trace identifiers, etc.).
          type: object
      example: {}
    PubSubNegotiateResult:
      type: object
      properties:
        AccessToken:
          description: The access token for the PubSub Azure SignalR service.
          type: string
        Url:
          description: The Url of the PubSub Azure SignalR endpoint.
          type: string
      example:
        AccessToken: WJkGtFNsLOQgoqV
        Url: >-
          https://pubsub-signalr-dev-wu2-001.service.signalr.net/client/?hub=pubsubhub
    ApiErrorWrapper:
      description: The basic wrapper around every failed API response
      type: object
      properties:
        code:
          description: Numerical HTTP code
          type: integer
        status:
          description: String HTTP code
          type: string
        error:
          description: Playfab error code
          type: string
        errorCode:
          description: Numerical PlayFab error code
          type: integer
        errorMessage:
          description: Description for the PlayFab errorCode
          type: string
        errorDetails:
          description: Detailed description of individual issues with the request object
          type: object
      required:
        - code
        - errorCode
  responses:
    PubSubNegotiateResult:
      description: ''
      content:
        application/json:
          schema:
            type: object
            properties:
              code:
                type: integer
                description: >-
                  The Http status code. If X-ReportErrorAsSuccess header is set
                  to true, this will report the actual http error code.
              status:
                type: string
                description: The Http status code as a string.
              data:
                $ref: '#/components/schemas/PubSubNegotiateResult'
            example:
              code: 200
              status: OK
              data:
                AccessToken: WJkGtFNsLOQgoqV
                Url: >-
                  https://pubsub-signalr-dev-wu2-001.service.signalr.net/client/?hub=pubsubhub
    ApiErrorWrapper:
      description: This is the outer wrapper for all responses with errors
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ApiErrorWrapper'
  securitySchemes:
    EntityToken:
      type: apiKey
      in: header
      name: X-EntityToken
      description: >-
        This API requires an Entity Session Token, available from the Entity
        GetEntityToken method.

````

## Related topics

- [Negotiate](/api-reference/pubsub/negotiate.md)
- [Real-time messages SignalR Hub](/services/playfab/multiplayer/real-time-messages/signalr-hub.md)
- [PartyEndpoint::GetUniqueIdentifier](/services/playfab/multiplayer/networking/reference/classes/PartyEndpoint/methods/partyendpoint_getuniqueidentifier.md)
