# Iniciar sesión

`POST /v1/login`

**Inicia la sesión y setea la cookie connect.sid que necesitan todas las demás llamadas.**

**Acceso:** pública. No requiere sesión.

## OpenAPI

```json
{
  "openapi": "3.0.3",
  "info": {
    "title": "pymo Gateway API",
    "version": "1.0.0",
    "description": "API del gateway de facturación electrónica (CFE) de pymo. Los métodos y las rutas salen del código del servicio, así que la referencia refleja lo que la API hace hoy."
  },
  "servers": [
    {
      "url": "https://gatewaytest.pymo.uy",
      "description": "Homologación: emite contra la ePrueba de DGI. Es donde se integra."
    },
    {
      "url": "https://gateway.pymo.uy",
      "description": "Producción: los comprobantes son fiscales y no se pueden borrar."
    }
  ],
  "security": [
    {
      "sessionCookie": []
    }
  ],
  "paths": {
    "/v1/login": {
      "post": {
        "operationId": "post_v1_login",
        "summary": "Iniciar sesión",
        "description": "**Inicia la sesión y setea la cookie connect.sid que necesitan todas las demás llamadas.**\n\n**Acceso:** pública. No requiere sesión.",
        "tags": [
          "1 Autenticación"
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "properties": {
                  "email": {
                    "type": "string",
                    "description": "Email de sesión",
                    "example": "usuario@tuempresa.com",
                    "default": "usuario@tuempresa.com"
                  },
                  "password": {
                    "type": "string",
                    "description": "Contraseña de sesión",
                    "example": "tu-contraseña",
                    "default": "tu-contraseña"
                  }
                },
                "required": [
                  "email",
                  "password"
                ]
              },
              "example": {
                "email": "usuario@tuempresa.com",
                "password": "tu-contraseña"
              }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Éxito",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Respuesta"
                },
                "examples": {
                  "Exito": {
                    "value": {
                      "payload": {
                        "email": "e@e.com"
                      },
                      "message": {
                        "code": "LOGGED_IN",
                        "value": "Sessión iniciada correctamente."
                      },
                      "status": "SUCCESS"
                    }
                  }
                }
              }
            }
          }
        },
        "security": [],
        "x-acceso": "publica"
      }
    }
  },
  "components": {
    "schemas": {
      "Respuesta": {
        "type": "object",
        "required": [
          "payload",
          "status"
        ],
        "description": "Envoltorio común a todas las respuestas. **`status` no se deduce del código HTTP**: hay al menos nueve lugares en el gateway que responden `HTTP 200` con `status: \"FAIL\"` (por ejemplo `CFE_NOT_FOUND` y `DGI_COMPANY_NOT_READY_YET`). Un cliente tiene que leer `status`, no el código.",
        "properties": {
          "payload": {
            "description": "Los datos de la respuesta. `{}` cuando el endpoint no devuelve nada.",
            "oneOf": [
              {
                "type": "object"
              },
              {
                "type": "array",
                "items": {}
              }
            ]
          },
          "message": {
            "allOf": [
              {
                "$ref": "#/components/schemas/Mensaje"
              }
            ],
            "description": "Presente cuando la operación tiene algo que decir. Las lecturas simples responden sólo `payload` y `status`."
          },
          "status": {
            "$ref": "#/components/schemas/Estado"
          }
        }
      },
      "Mensaje": {
        "type": "object",
        "required": [
          "code",
          "value"
        ],
        "description": "Código estable y su texto en español. **El código es el contrato, el texto no**: `value` sale de una tabla de traducciones y puede reescribirse sin aviso, así que un cliente ramifica por `code`.",
        "properties": {
          "code": {
            "type": "string",
            "example": "DGI_CFES_RECEIVE_SUCCESS"
          },
          "value": {
            "type": "string",
            "example": "Cfes recibidos correctamente."
          }
        }
      },
      "Estado": {
        "type": "string",
        "enum": [
          "SUCCESS",
          "FAIL"
        ],
        "description": "De las 82 claves de mensaje del gateway, 29 son `SUCCESS` y 53 `FAIL`. Es lo que hay que mirar para saber si la llamada funcionó."
      }
    },
    "securitySchemes": {
      "sessionCookie": {
        "type": "apiKey",
        "in": "cookie",
        "name": "connect.sid",
        "description": "Sesión por cookie de `POST /v1/login`, válida 1 hora. Ver [Autenticación](/autenticacion)."
      }
    }
  }
}
```
