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

# Endpoint de token: intercanvi de codi i renovació | Didit

> POST /token/ intercanvia un codi d'autorització PKCE o rota un refresh token. Reutilitzar un refresh token revoca la sessió a Didit.

> [!WARNING]
>
> L'autenticació és nova. Aquests endpoints els serveix l'emissor de la teva aplicació, com ara `https://<name>.auth.didit.me`, i mai no accepten la teva clau d'API de Didit.

Un token de refresc només funciona una vegada. Si tornes a enviar un token de refresc ja utilitzat, es revoca tota la sessió; per això, fes un sol refresc alhora per a cada sessió i substitueix els tres tokens al mateix temps. Consulta [Tokens de refresc](https://docs.didit.me/ca/authentication/tokens-and-jwks.md#tokens-de-renovació).


## OpenAPI

````yaml ca/openapi-authentication.json POST /token/
openapi: 3.0.3
info:
  title: Didit Authentication API
  version: 1.0.0
  description: >-
    Els endpoints adreçats al servidor de Didit Authentication, el producte
    d'inici de sessió per als usuaris finals de la teva aplicació.
    Authentication és **nou** i arriba a producció en el llançament del
    2026-11-01.


    ## URL base


    Cada aplicació és el seu propi emissor d'OpenID Connect, i cada endpoint
    següent se serveix a l'arrel d'aquest emissor:


    - `https://<name>.auth.didit.me` per a una aplicació de producció, o
    `https://<name>.sandbox.auth.didit.me` per a una aplicació de sandbox.

    - El teu propi domini personalitzat, un cop estigui actiu. Aleshores
    substitueix l'amfitrió per defecte com a emissor: els nous tokens l'anomenen
    a `iss`, el descobriment hi apunta i la clau publicable canvia. Els tokens
    d'accés emesos sota l'amfitrió per defecte fallen a `/session/`, `/step-up/`
    i `/monitoring-token/` fins que es renoven.


    Producció i sandbox són aplicacions separades, de manera que són emissors
    separats amb claus separades. La clau publicable és `pk_live_` (producció) o
    `pk_test_` (sandbox) seguida de la codificació base64url sense farciment de
    l'emissor, sense barra final: descodifica-la per trobar l'emissor. És un
    identificador públic, no una credencial.


    Els mateixos endpoints JSON també se serveixen sota
    `https://apx.didit.me/auth/v2/authentication/{application_id}/`. Els tokens
    sempre anomenen l'emissor anterior, independentment de quina adreça els hagi
    emès.


    ## Credencials


    Aquests endpoints mai accepten la teva clau d'API de Didit ni un token de
    consola.


    - El descobriment, el JWKS i `POST /token/` no requereixen cap credencial.
    Els clients són públics: no hi ha cap secret de client, i un codi
    d'autorització està vinculat al seu verificador PKCE (`S256`). `client_id`
    és el teu ID d'aplicació.

    - `/session/`, `/step-up/` i `/monitoring-token/` requereixen el token
    d'accés de la persona: `Authorization: Bearer <access_token>`. Cada crida
    satisfactòria compta com a activitat a la sessió, de manera que reinicia el
    temps d'espera per inactivitat de la sessió.


    ## Cossos de sol·licitud


    Tots els endpoints que accepten un cos admeten cossos en JSON, codificats
    com a formulari i multipart. Aquest document descriu JSON, a més de la
    codificació com a formulari per a `POST /token/` tal com l'envien els
    clients OAuth. Un camp que l'endpoint no accepta rep `400 {"<field>":
    "unknown_field"}`.


    ## Tokens


    - **Token d'accés**: un JWT ES256 amb la capçalera `typ: at+jwt`, vàlid
    durant un màxim de 5 minuts i mai més temps que la seva sessió.
    Reclamacions: `AccessTokenClaims`.

    - **Token d'ID**: un JWT ES256 amb la capçalera `typ: JWT`. Reclamacions:
    `IDTokenClaims`. Mai s'accepta com a token d'accés.

    - **Token de renovació**: una cadena aleatòria que rota a cada ús. Enviar un
    token de renovació ja utilitzat revoca la sessió.


    Verifica un token amb les claus de `GET /.well-known/jwks.json`: l'algorisme
    ha de ser `ES256`, `typ` ha de coincidir amb el tipus de token, `iss` ha de
    ser igual a l'emissor que vas configurar i `aud` ha de ser el teu ID
    d'aplicació. La verificació fora de línia detecta una sessió revocada només
    un cop el seu token d'accés caduca; `GET /session/` és la comprovació
    instantània.


    ## Errors


    | Cos | Quan |

    | --- | --- |

    | `{"error": "<code>"}` | Errors de `POST /token/`, tots amb estat `400`,
    amb l'estructura de cos de la [secció 5.2 de la RFC
    6749](https://www.rfc-editor.org/rfc/rfc6749#section-5.2): `invalid_grant`,
    `invalid_client` i `mfa_required` de Didit. Errors de servei:
    `temporarily_unavailable`, `monitoring_unavailable`, `monitoring_disabled`.
    |

    | `{"<field>": ["<message>"]}` o `{"<field>": "<code>"}` | Un camp de la
    sol·licitud ha fallat la validació. `non_field_errors` fa referència a una
    regla entre camps, i `unknown_field` a un camp que l'endpoint no accepta. |

    | `{"detail": "<message>"}` | `401` (`invalid_token`), `403`
    (`origin_not_allowed`), `404` (aplicació o autenticació reforçada
    desconegudes) i `429` (límit de freqüència). També `400` per a un cos que no
    es pot analitzar (`JSON parse error - ...`), `405` per a un mètode que
    l'endpoint no ofereix i `415` per a un `Content-Type` no compatible. |


    Un `401` també inclou `WWW-Authenticate: Bearer`, i un `429` inclou
    `Retry-After` en segons.


    Hi ha dues denegacions que no són JSON. Una adreça que no sigui un emissor
    es denega abans d'arribar a aquests endpoints, per exemple amb un `404` buit
    per a un nom `*.auth.didit.me` no utilitzat. Un `step_up_id` que no sigui un
    UUID rep una pàgina `404`.


    ## Límits de freqüència


    Una sol·licitud ha de superar dues capes.


    **Límits d'endpoint**, comptats per adreça IP de client, per aplicació i per
    endpoint:


    - El descobriment i el JWKS: 1,200 sol·licituds per minut i 12,000 per hora.

    - La resta d'endpoints: 30 sol·licituds per minut i 300 per hora. `GET` i
    `DELETE /session/` comparteixen un mateix recompte.


    En superar un límit: `429 {"detail": "Too many requests from this IP
    address. Please wait before trying again. Expected available in 60
    seconds."}`, o `3600 seconds` per al límit per hora.


    **Protecció contra bots**, a cada `POST` i `DELETE`. Els seus dipòsits es
    comparteixen entre totes les sol·licituds `POST` i `DELETE` de l'aplicació,
    inclosos els passos d'inici de sessió allotjats, i es recarreguen
    contínuament:


    - 60 sol·licituds per minut per adreça IP de client.

    - 30 sol·licituds per minut per dispositiu, per a les sol·licituds que
    identifiquen el seu dispositiu, com fan els SDK de navegador i natius.

    - 3,000 sol·licituds per minut per a tota l'aplicació, entre totes les
    adreces IP. Les renovacions de tokens (`POST /token/` amb
    `grant_type=refresh_token`) utilitzen un dipòsit propi: 6,000 per minut per
    a tota l'aplicació.


    En superar un dipòsit: `429 {"detail": "rate_limited Expected available in N
    seconds."}` (`1 second.` quan N és 1). El dipòsit per IP abasta diversos
    endpoints, de manera que una sola adreça que combini crides de tokens,
    autenticació reforçada i tancament de sessió pot buidar-lo abans d'arribar a
    cap límit d'endpoint. El dipòsit de l'aplicació compta cada client de
    l'aplicació, navegadors inclosos.


    Totes dues capes responen abans que s'executi l'endpoint, de manera que una
    sol·licitud que hagi rebut un `429` no s'ha executat: reintenta-la després
    del temps indicat a `Retry-After`, inclosa una renovació.


    ## Sol·licituds de navegador


    Una sol·licitud que porti una capçalera `Origin` ha de provenir d'un dels
    orígens propis de l'aplicació o dels seus orígens permesos, o rebrà un `403
    origin_not_allowed`. Les sol·licituds de servidor a servidor no envien cap
    `Origin`.


    ## No cobert aquí


    Aquestes rutes serveixen les pàgines allotjades, els SDK de navegador i
    natius, i agents d'IA. No formen part del contracte de servidor, i els SDK
    de servidor no les criden:


    - Passos d'inici de sessió: `POST /authorize/`, `POST /password/`,
    `/email/*`, `/phone/*`, `/password-reset/*`, `/passkeys/*`, `/mfa/*`,
    `/social/*` i `/protection/complete/`.

    - Pàgines allotjades i crides de retorn: `/sign-in`, `/magic`, `/invite`,
    `/reset`, `/verify/`, `/sso/*`, `/wallet/callback/`, `/logo/` i els fitxers
    d'associació d'aplicacions natives sota `/.well-known/`.

    - Accés d'agents: `/agents/*` i `/grants/`, incloent-hi `GET
    /agents/session/`, la comprovació en directe per al token d'accés d'un agent
    d'IA. L'accés d'agents no forma part d'aquesta versió del contracte.

    - L'API de gestió de la consola per a Authentication, que requereix sessions
    de consola.


    Els esdeveniments d'Authentication encara no es lliuren com a webhooks, de
    manera que aquest document no defineix cap webhook.
servers:
  - url: https://{issuer}
    description: 'L''emissor de la teva aplicació: el seu origen d''inici de sessió.'
    variables:
      issuer:
        default: your-app.auth.didit.me
        description: >-
          L'amfitrió de l'emissor: `<name>.auth.didit.me` (producció),
          `<name>.sandbox.auth.didit.me` (sandbox) o el teu domini personalitzat
          actiu.
security: []
tags:
  - name: Issuer
    description: Claus de descobriment i de signatura, per verificar tokens.
  - name: Tokens
    description: El codi d'autorització i els permisos de renovació.
  - name: Sessions
    description: Comprova i finalitza la sessió associada a un token d'accés.
  - name: Step-ups
    description: Verificació abans d'una acció sensible.
  - name: Monitoring
    description: >-
      Credencials del dispositiu per a esdeveniments de monitoratge de
      transaccions.
paths:
  /token/:
    post:
      tags:
        - Tokens
      summary: Bescanvia un codi o tokens de renovació
      description: >-
        L'endpoint de tokens, per a ambdues concessions.


        - `authorization_code` bescanvia el codi que ha rebut el teu
        `redirect_uri` per un token d'accés, d'identificació i d'actualització.
        El codi funciona una vegada, durant 60 segons, amb el verificador PKCE i
        el `redirect_uri` exacte del seu inici de sessió. Quan l'aplicació
        permet una sessió per persona, el bescanvi tanca les altres sessions de
        la persona.

        - `refresh_token` retorna un nou token d'accés, d'identificació i
        d'actualització, i el token d'actualització que has enviat deixa de
        funcionar. **Tornar a enviar un token d'actualització utilitzat revoca
        la sessió** i retorna `invalid_grant`, de manera que executa una sola
        actualització alhora per sessió i substitueix tots tres tokens alhora.
        Si una actualització falla amb `400` o no rep resposta, torna a iniciar
        la sessió en lloc de reintentar-ho: un reintent després d'una
        actualització que s'ha completat satisfactòriament és una reutilització.
        Un `429` es respon abans que s'executi l'actualització, de manera que és
        segur reintentar-ho després de `Retry-After`. Un `503` significa que
        l'actualització no s'ha produït i el token d'actualització encara
        funciona: reintenta-ho amb retrocés.


        El cos pot ser JSON o codificat com a formulari.
      operationId: authentication_token
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/TokenRequest'
            examples:
              AuthorizationCode:
                summary: Bescanvia el codi d'autorització
                value:
                  grant_type: authorization_code
                  code: Vb0bVt4CLlr8ZL0kE5mAxv8gS6R0rW3hYqC1pN7dJ2s
                  code_verifier: dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
                  redirect_uri: https://app.example.com/auth/callback
              RefreshToken:
                summary: Actualitza els tokens
                value:
                  grant_type: refresh_token
                  refresh_token: >-
                    N4yZTl6y24YKYq77X_SOrBn1q2Lit81WBQMOay7dq_IVfTnxyY8ZGcJk-6-fcmWW
          application/x-www-form-urlencoded:
            schema:
              $ref: '#/components/schemas/TokenRequest'
      responses:
        '200':
          description: Nous tokens per a la sessió.
          headers:
            Cache-Control:
              description: >-
                Sempre `no-store`: no emmagatzemis mai aquesta resposta a la
                memòria cau.
              schema:
                type: string
                example: no-store
            Pragma:
              description: Sempre `no-cache`.
              schema:
                type: string
                example: no-cache
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/TokenResponse'
              examples:
                Tokens:
                  summary: Tokens per a una sessió nova
                  value:
                    access_token: >-
                      eyJhbGciOiJFUzI1NiIsImtpZCI6ImtfOHNKMmRRdlgwbkxyNVRmWWIzSGtQdyIsInR5cCI6ImF0K2p3dCJ9.eyJpc3MiOiJodHRwczovL3lvdXItYXBwLmF1dGguZGlkaXQubWUiLCJhdWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQiLCJzdWIiOiIxYzlkOGI4OC0xYmZmLTQzZDEtYWQ3YS04OGIyYmMwMDI0ZTkiLCJzaWQiOiJjOWFiZjZjYy0yZDY0LTRiZjItYjMxZS1hNGQwOWEwNzBhYjEiLCJqdGkiOiJSZ3F1NzE3OWUtbGhKMGJ2VmVELVlnIiwiaWF0IjoxNzkyMjMzNjc0LCJleHAiOjE3OTIyMzM5NzQsInZlbmRvcl9kYXRhIjoidXNlci00MiIsIm9yZyI6bnVsbCwidmVyaWZpZWQiOnt9LCJhbXIiOlsicGFzc3dvcmQiXSwiYWN0IjpudWxsLCJjbGllbnRfaWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQifQ.AxrqN8Pm-Op-3OayZk8HcvlFQZhozRiOvQ0SgQsGgrz4UNeJlUEeSlq9B8WcYUuM8naRaY5kQt_TUofnsYcyYQ
                    id_token: >-
                      eyJhbGciOiJFUzI1NiIsImtpZCI6ImtfOHNKMmRRdlgwbkxyNVRmWWIzSGtQdyIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL3lvdXItYXBwLmF1dGguZGlkaXQubWUiLCJhdWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQiLCJzdWIiOiIxYzlkOGI4OC0xYmZmLTQzZDEtYWQ3YS04OGIyYmMwMDI0ZTkiLCJzaWQiOiJjOWFiZjZjYy0yZDY0LTRiZjItYjMxZS1hNGQwOWEwNzBhYjEiLCJqdGkiOiJNTHRPNHM4SHItQnJrcDd2NTlPV0Z3IiwiaWF0IjoxNzkyMjMzNjc0LCJleHAiOjE3OTIyMzM5NzQsInZlbmRvcl9kYXRhIjoidXNlci00MiIsIm9yZyI6bnVsbCwidmVyaWZpZWQiOnt9LCJhbXIiOlsicGFzc3dvcmQiXSwiYWN0IjpudWxsLCJhdXRoX3RpbWUiOjE3OTIyMzM2NzQsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJlbWFpbCI6InBlcnNvbkBleGFtcGxlLmNvbSIsIm5vbmNlIjoibi0wUzZfV3pBMk1qIn0.avhfDFp_aUV5_1ssYzwDcIA7H6Waf19P0bn5GCg25FhLIZBGIlwc8HiUPGj1j26r21OkP4FQnS_jM1Ho3dHtKQ
                    refresh_token: >-
                      N4yZTl6y24YKYq77X_SOrBn1q2Lit81WBQMOay7dq_IVfTnxyY8ZGcJk-6-fcmWW
                    token_type: Bearer
                    expires_in: 299
                    session_id: c9abf6cc-2d64-4bf2-b31e-a4d09a070ab1
        '400':
          description: >-
            La concessió ha fallat. `invalid_grant`: el codi o el token de
            renovació és desconegut, ja s'ha utilitzat o ha caducat; el
            verificador PKCE o `redirect_uri` no coincideixen, o la
            `redirect_uri` ja no està registrada; la persona ha estat bloquejada
            o el seu correu electrònic ja no està verificat; la sessió ha
            finalitzat o ja no compleix la teva política de MFA; o bé, en el cas
            d'un codi, has desactivat el mètode d'inici de sessió d'on provenia.
            Desactivar un mètode no atura la renovació de les sessions que ja
            s'hagin iniciat. `invalid_client`: `client_id` no és l'ID de la teva
            aplicació. `mfa_required`: l'inici de sessió no complia la teva
            política de MFA. Els errors de camp indiquen un camp absent o no
            vàlid. Un cos que no es pugui analitzar rep un missatge de `detail`.
          headers:
            Cache-Control:
              description: >-
                Sempre `no-store`: no emmagatzemis mai aquesta resposta a la
                memòria cau.
              schema:
                type: string
                example: no-store
            Pragma:
              description: Sempre `no-cache`.
              schema:
                type: string
                example: no-cache
          content:
            application/json:
              schema:
                anyOf:
                  - $ref: '#/components/schemas/OAuthError'
                  - $ref: '#/components/schemas/FieldErrors'
                  - $ref: '#/components/schemas/Detail'
              examples:
                InvalidGrant:
                  summary: Codi o token de refresc rebutjat
                  value:
                    error: invalid_grant
                InvalidClient:
                  summary: client_id incorrecte
                  value:
                    error: invalid_client
                MfaRequired:
                  summary: No es compleix la política de MFA
                  value:
                    error: mfa_required
                MissingFields:
                  summary: Una concessió sense els seus camps obligatoris
                  value:
                    non_field_errors:
                      - invalid_request
                UnknownGrant:
                  summary: grant_type no admès
                  value:
                    grant_type:
                      - '"password" is not a valid choice.'
                UnknownField:
                  summary: Un camp que l'endpoint no accepta
                  value:
                    foo: unknown_field
                MalformedBody:
                  summary: Un cos JSON que no es pot analitzar
                  value:
                    detail: >-
                      JSON parse error - Expecting property name enclosed in
                      double quotes: line 1 column 2 (char 1)
        '403':
          $ref: '#/components/responses/OriginNotAllowed'
        '404':
          $ref: '#/components/responses/ApplicationNotFound'
        '429':
          $ref: '#/components/responses/RateLimited'
        '503':
          $ref: '#/components/responses/TemporarilyUnavailable'
      security:
        - {}
components:
  schemas:
    TokenRequest:
      description: >-
        Una de les dues concessions, triada mitjançant `grant_type`. L'endpoint
        accepta els camps de totes dues concessions i valida cada camp que rep,
        de manera que una actualització que també contingui un `code_verifier`
        mal format rep un error de camp. Envia només els camps de la teva
        concessió; qualsevol altre camp rep `unknown_field`.
      oneOf:
        - $ref: '#/components/schemas/AuthorizationCodeGrantRequest'
        - $ref: '#/components/schemas/RefreshTokenGrantRequest'
      discriminator:
        propertyName: grant_type
        mapping:
          authorization_code: '#/components/schemas/AuthorizationCodeGrantRequest'
          refresh_token: '#/components/schemas/RefreshTokenGrantRequest'
    TokenResponse:
      type: object
      description: >-
        Tokens per a una sessió. Substitueix tots tres alhora després d'una
        actualització.
      required:
        - access_token
        - id_token
        - refresh_token
        - token_type
        - expires_in
        - session_id
      properties:
        access_token:
          type: string
          description: >-
            JWT ES256, capçalera `typ: at+jwt`. Envia'l com a `Authorization:
            Bearer <access_token>`. Reclamacions: `AccessTokenClaims`.
          example: >-
            eyJhbGciOiJFUzI1NiIsImtpZCI6ImtfOHNKMmRRdlgwbkxyNVRmWWIzSGtQdyIsInR5cCI6ImF0K2p3dCJ9.eyJpc3MiOiJodHRwczovL3lvdXItYXBwLmF1dGguZGlkaXQubWUiLCJhdWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQiLCJzdWIiOiIxYzlkOGI4OC0xYmZmLTQzZDEtYWQ3YS04OGIyYmMwMDI0ZTkiLCJzaWQiOiJjOWFiZjZjYy0yZDY0LTRiZjItYjMxZS1hNGQwOWEwNzBhYjEiLCJqdGkiOiJSZ3F1NzE3OWUtbGhKMGJ2VmVELVlnIiwiaWF0IjoxNzkyMjMzNjc0LCJleHAiOjE3OTIyMzM5NzQsInZlbmRvcl9kYXRhIjoidXNlci00MiIsIm9yZyI6bnVsbCwidmVyaWZpZWQiOnt9LCJhbXIiOlsicGFzc3dvcmQiXSwiYWN0IjpudWxsLCJjbGllbnRfaWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQifQ.AxrqN8Pm-Op-3OayZk8HcvlFQZhozRiOvQ0SgQsGgrz4UNeJlUEeSlq9B8WcYUuM8naRaY5kQt_TUofnsYcyYQ
          x-didit-jwt:
            header: '#/components/schemas/AccessTokenHeader'
            claims: '#/components/schemas/AccessTokenClaims'
        id_token:
          type: string
          description: >-
            JWT ES256, capçalera `typ: JWT`, perquè la teva aplicació pugui
            llegir qui ha iniciat la sessió. No l'enviïs mai com a token
            d'accés. Reclamacions: `IDTokenClaims`.
          example: >-
            eyJhbGciOiJFUzI1NiIsImtpZCI6ImtfOHNKMmRRdlgwbkxyNVRmWWIzSGtQdyIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJodHRwczovL3lvdXItYXBwLmF1dGguZGlkaXQubWUiLCJhdWQiOiI3YjBhNmMyZS0zZjQxLTRjOWEtOGQ1NS0xZTJmM2E0YjVjNmQiLCJzdWIiOiIxYzlkOGI4OC0xYmZmLTQzZDEtYWQ3YS04OGIyYmMwMDI0ZTkiLCJzaWQiOiJjOWFiZjZjYy0yZDY0LTRiZjItYjMxZS1hNGQwOWEwNzBhYjEiLCJqdGkiOiJNTHRPNHM4SHItQnJrcDd2NTlPV0Z3IiwiaWF0IjoxNzkyMjMzNjc0LCJleHAiOjE3OTIyMzM5NzQsInZlbmRvcl9kYXRhIjoidXNlci00MiIsIm9yZyI6bnVsbCwidmVyaWZpZWQiOnt9LCJhbXIiOlsicGFzc3dvcmQiXSwiYWN0IjpudWxsLCJhdXRoX3RpbWUiOjE3OTIyMzM2NzQsImVtYWlsX3ZlcmlmaWVkIjp0cnVlLCJlbWFpbCI6InBlcnNvbkBleGFtcGxlLmNvbSIsIm5vbmNlIjoibi0wUzZfV3pBMk1qIn0.avhfDFp_aUV5_1ssYzwDcIA7H6Waf19P0bn5GCg25FhLIZBGIlwc8HiUPGj1j26r21OkP4FQnS_jM1Ho3dHtKQ
          x-didit-jwt:
            header: '#/components/schemas/IDTokenHeader'
            claims: '#/components/schemas/IDTokenClaims'
        refresh_token:
          type: string
          description: >-
            D'un sol ús. És vàlida fins que finalitza la sessió, i cada
            actualització en retorna una de nova.
          example: N4yZTl6y24YKYq77X_SOrBn1q2Lit81WBQMOay7dq_IVfTnxyY8ZGcJk-6-fcmWW
        token_type:
          type: string
          enum:
            - Bearer
        expires_in:
          type: integer
          minimum: 0
          maximum: 300
          description: >-
            Segons fins que el token d'accés caduqui: com a màxim 300, menys si
            la sessió finalitza abans.
          example: 299
        session_id:
          type: string
          format: uuid
          description: >-
            La sessió a la qual pertanyen aquests tokens, el mateix valor que
            l'afirmació `sid`.
          example: c9abf6cc-2d64-4bf2-b31e-a4d09a070ab1
    OAuthError:
      title: OAuth error
      type: object
      description: Un error d'OAuth (RFC 6749, secció 5.2) o un error de servei.
      required:
        - error
      properties:
        error:
          type: string
          example: invalid_grant
    FieldErrors:
      title: Field errors
      type: object
      description: >-
        Errors de validació per camp. Un valor és una llista de missatges o un
        sol codi (`unknown_field`, `invalid_redirect_uri`). `non_field_errors`
        conté regles globals entre camps.
      additionalProperties:
        oneOf:
          - type: string
          - type: array
            items:
              type: string
    Detail:
      type: object
      required:
        - detail
      properties:
        detail:
          type: string
          example: invalid_token
    AuthorizationCodeGrantRequest:
      title: Authorization code grant
      type: object
      description: >-
        Bescanvia el codi d'autorització de la teva redirecció per tokens. El
        codi funciona una sola vegada, durant 60 segons.
      required:
        - grant_type
        - code
        - code_verifier
        - redirect_uri
      properties:
        grant_type:
          type: string
          enum:
            - authorization_code
        code:
          type: string
          maxLength: 128
          description: >-
            El paràmetre de consulta `code` que ha rebut el teu `redirect_uri`.
            Comprova l'`state` del callback abans d'intercanviar-lo.
          example: Vb0bVt4CLlr8ZL0kE5mAxv8gS6R0rW3hYqC1pN7dJ2s
        code_verifier:
          type: string
          minLength: 43
          maxLength: 128
          pattern: ^[A-Za-z0-9._~-]{43,128}$
          description: >-
            El verificador PKCE el resum S256 del qual era el `code_challenge`
            de l'inici de sessió.
          example: dBjftJeZ4CVP-mB92K27uhbUJU1p1r_wW1gFWFOEjXk
        redirect_uri:
          type: string
          maxLength: 2048
          description: >-
            El `redirect_uri` exacte amb què es va iniciar la sessió. Encara ha
            de ser un dels URI de redirecció de l'aplicació.
          example: https://app.example.com/auth/callback
        client_id:
          type: string
          maxLength: 64
          description: >-
            Opcional. Quan s'envia, ha de coincidir amb l'ID de la teva
            aplicació, o la sol·licitud fallarà amb `invalid_client`.
          example: 7b0a6c2e-3f41-4c9a-8d55-1e2f3a4b5c6d
        scope:
          type: string
          maxLength: 512
          description: >-
            Opcional i acceptat des de clients estàndard d'OpenID Connect. Mai
            amplia el que s'ha concedit en iniciar sessió.
          example: openid email
    RefreshTokenGrantRequest:
      title: Refresh token grant
      type: object
      description: >-
        Intercanvia un token de refresc per nous tokens d'accés, d'ID i de
        refresc. El token de refresc funciona una sola vegada: enviar-lo de nou
        revoca la sessió, així que executa un refresc a la vegada per a una
        sessió.
      required:
        - grant_type
        - refresh_token
      properties:
        grant_type:
          type: string
          enum:
            - refresh_token
        refresh_token:
          type: string
          maxLength: 128
          description: El `refresh_token` de la resposta de token anterior.
          example: N4yZTl6y24YKYq77X_SOrBn1q2Lit81WBQMOay7dq_IVfTnxyY8ZGcJk-6-fcmWW
        client_id:
          type: string
          maxLength: 64
          description: >-
            Opcional. Quan s'envia, ha de coincidir amb l'ID de la teva
            aplicació, o la sol·licitud fallarà amb `invalid_client`.
          example: 7b0a6c2e-3f41-4c9a-8d55-1e2f3a4b5c6d
        scope:
          type: string
          maxLength: 512
          description: >-
            Opcional i acceptat des de clients estàndard d'OpenID Connect. Una
            actualització mai amplia el contingut de la sessió.
          example: openid email
  responses:
    OriginNotAllowed:
      description: >-
        La sol·licitud incloïa un `Origin` que no és el de la mateixa aplicació
        ni figura entre els seus orígens permesos. Les sol·licituds de servidor
        no envien cap `Origin`.
      headers:
        Cache-Control:
          description: >-
            Sempre `no-store`: no emmagatzemis mai aquesta resposta a la memòria
            cau.
          schema:
            type: string
            example: no-store
        Pragma:
          description: Sempre `no-cache`.
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Detail'
          examples:
            OriginNotAllowed:
              summary: Origen no permès
              value:
                detail: origin_not_allowed
    ApplicationNotFound:
      description: >-
        L'adreça pertany a una aplicació, però Authentication no hi està actiu;
        a l'adreça `apx.didit.me`, l'ID d'aplicació és desconegut. Una adreça
        que no pertany a cap aplicació es rebutja abans d'arribar a l'endpoint,
        i aquesta resposta no és JSON.
      headers:
        Cache-Control:
          description: >-
            Sempre `no-store`: no emmagatzemis mai aquesta resposta a la memòria
            cau.
          schema:
            type: string
            example: no-store
        Pragma:
          description: Sempre `no-cache`.
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Detail'
          examples:
            ApplicationNotFound:
              summary: Aplicació desconeguda
              value:
                detail: No Configuration matches the given query.
    RateLimited:
      description: >-
        Massa sol·licituds des d'aquesta adreça IP per a aquest endpoint o, en
        un `POST` o `DELETE`, un dipòsit de protecció contra bots està buit. No
        s'ha executat res: espera els segons indicats a `Retry-After` i torna-ho
        a provar.
      headers:
        Retry-After:
          description: Segons que cal esperar abans de reintentar.
          schema:
            type: integer
            example: 60
        Cache-Control:
          description: >-
            Sempre `no-store`: no emmagatzemis mai aquesta resposta a la memòria
            cau.
          schema:
            type: string
            example: no-store
        Pragma:
          description: Sempre `no-cache`.
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Detail'
          examples:
            RateLimited:
              summary: Límit de l'endpoint
              value:
                detail: >-
                  Too many requests from this IP address. Please wait before
                  trying again. Expected available in 60 seconds.
            BotProtection:
              summary: Límit de protecció contra bots (POST i DELETE)
              value:
                detail: rate_limited Expected available in 2 seconds.
    TemporarilyUnavailable:
      description: >-
        Un servei del qual depèn la sol·licitud no està disponible temporalment.
        Torna-ho a provar amb esperes progressives.
      headers:
        Cache-Control:
          description: >-
            Sempre `no-store`: no emmagatzemis mai aquesta resposta a la memòria
            cau.
          schema:
            type: string
            example: no-store
        Pragma:
          description: Sempre `no-cache`.
          schema:
            type: string
            example: no-cache
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/OAuthError'
          examples:
            TemporarilyUnavailable:
              summary: Reintenta-ho més tard
              value:
                error: temporarily_unavailable

````

This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.