{
  "info": {
    "name": "OTP Login - API Frontend",
    "description": "Import nativo Postman. Ogni request usa POST {{baseUrl}}/?action=<nome>",
    "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
  },
  "variable": [
    {
      "key": "baseUrl",
      "value": "https://testgm.quotidiano.net"
    }
  ],
  "item": [
    {
      "name": "QN",
      "item": [
        {
          "name": "QNLogin",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"identifier\": \"3331234567\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=QNLogin",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "QNLogin"
                }
              ]
            },
            "description": "Da email/telefono fino a step OTP telefono (#14), OTP email (#33) o password (#60).\nURL reale: `POST /?action=QNLogin`\n"
          }
        },
        {
          "name": "QNVerifyOtp",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"otp_code\": \"123456\",\n  \"flow\": \"phone\",\n  \"phone\": \"3331234567\",\n  \"stay_logged_in\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=QNVerifyOtp",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "QNVerifyOtp"
                }
              ]
            },
            "description": "Verifica OTP. Login completo → `next_step: 90` + token.\nPer `flow: phone_register` conferma anche DOI Piano.\nURL reale: `POST /?action=QNVerifyOtp`\n"
          }
        },
        {
          "name": "QNRegister",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"new@mail.it\",\n  \"phone\": \"3331234567\",\n  \"consents\": {\n    \"terms_conditions\": true\n  },\n  \"otp\": true,\n  \"flow\": \"phone_register\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=QNRegister",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "QNRegister"
                }
              ]
            },
            "description": "Register + eventuale OTP email. `otp: true|false` controlla l’invio.\nURL reale: `POST /?action=QNRegister`\n"
          }
        },
        {
          "name": "QNAddPhone",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"phone\": \"3331234567\",\n  \"uid\": \"PNI...\",\n  \"email\": \"user@mail.it\",\n  \"flow\": \"email_add_phone\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=QNAddPhone",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "QNAddPhone"
                }
              ]
            },
            "description": "Step #61–#62: unicità telefono + OTP SMS.\nErrore `phone_taken` se già registrato.\nURL reale: `POST /?action=QNAddPhone`\n"
          }
        },
        {
          "name": "QNUpdateProfile",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"uid\": \"PNI...\",\n  \"first_name\": \"Luca\",\n  \"last_name\": \"Rossi\",\n  \"stay_logged_in\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=QNUpdateProfile",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "QNUpdateProfile"
                }
              ]
            },
            "description": "update_profile + access_token. Imposta cookie `__utp`.\nCheck unicità `otp_phone` prima del save.\nURL reale: `POST /?action=QNUpdateProfile`\n"
          }
        }
      ]
    },
    {
      "name": "OTP",
      "item": [
        {
          "name": "otp_generate",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"uid\": \"3331234567\",\n  \"phone\": \"3331234567\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=otp_generate",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "otp_generate"
                }
              ]
            },
            "description": "Genera e invia OTP (email e/o SMS). Cooldown `resend_cooldown_seconds`.\nURL reale: `POST /?action=otp_generate`\n"
          }
        },
        {
          "name": "verify_otp",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"3331234567\",\n  \"otp_code\": \"123456\",\n  \"is_registration\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=verify_otp",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "verify_otp"
                }
              ]
            },
            "description": "Verifica OTP locale. Con `is_registration` + `uid` conferma DOI Piano.\nURL reale: `POST /?action=verify_otp`\n"
          }
        },
        {
          "name": "otp_verify_local",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"uid\": \"3331234567\",\n  \"otp_code\": \"123456\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=otp_verify_local",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "otp_verify_local"
                }
              ]
            },
            "description": "Solo test: verifica OTP in DB senza DOI/sessione.\nURL reale: `POST /?action=otp_verify_local`\n"
          }
        }
      ]
    },
    {
      "name": "Piano",
      "item": [
        {
          "name": "search_user",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"phone\": \"3331234567\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=search_user",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "search_user"
                }
              ]
            },
            "description": "Cerca utente per telefono (`otp_phone`). URL reale: `POST /?action=search_user`"
          }
        },
        {
          "name": "get_user_email",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"user@example.com\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=get_user_email",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "get_user_email"
                }
              ]
            },
            "description": "Lookup utente per email. URL reale: `POST /?action=get_user_email`"
          }
        },
        {
          "name": "get_user",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"uid\": \"PNIxxxx\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=get_user",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "get_user"
                }
              ]
            },
            "description": "Profilo ridotto per uid. URL reale: `POST /?action=get_user`"
          }
        },
        {
          "name": "login",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"user@example.com\",\n  \"stay_logged_in\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=login",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "login"
                }
              ]
            },
            "description": "Login Piano. Senza password = passwordless; con password = ramo email.\nURL reale: `POST /?action=login`\n"
          }
        },
        {
          "name": "register",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"user@example.com\",\n  \"phone\": \"3331234567\",\n  \"consents\": {\n    \"terms_conditions\": true\n  },\n  \"send_otp\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=register",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "register"
                }
              ]
            },
            "description": "Registrazione passwordless. `send_otp: false` salta l’OTP.\nURL reale: `POST /?action=register`\n"
          }
        },
        {
          "name": "update_profile",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"uid\": \"PNIxxxx\",\n  \"first_name\": \"Luca\",\n  \"last_name\": \"Rossi\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=update_profile",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "update_profile"
                }
              ]
            },
            "description": "Aggiorna identity e/o custom fields. Check `phone_taken` su `otp_phone`.\nURL reale: `POST /?action=update_profile`\n"
          }
        },
        {
          "name": "doi_confirm",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"uid\": \"PNIxxxx\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=doi_confirm",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "doi_confirm"
                }
              ]
            },
            "description": "Imposta DOI email CONFIRMED. URL reale: `POST /?action=doi_confirm`"
          }
        },
        {
          "name": "access_token",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"uid\": \"PNIxxxx\",\n  \"stay_logged_in\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=access_token",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "access_token"
                }
              ]
            },
            "description": "Emette access token Piano e cookie `__utp`.\nURL reale: `POST /?action=access_token`\n"
          }
        },
        {
          "name": "refresh_token",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"refresh_token\": \"RF...\",\n  \"stay_logged_in\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=refresh_token",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "refresh_token"
                }
              ]
            },
            "description": "Refresh OAuth via Piano identity/token (`grant_type=refresh_token`).\nURL reale: `POST /?action=refresh_token`\n"
          }
        },
        {
          "name": "user_access_list",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"access_token\": \"eyJ...\"\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=user_access_list",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "user_access_list"
                }
              ]
            },
            "description": "Lista risorse accessibili (Piano user/access/list).\nToken da body, cookie `__utp` o header Bearer.\nURL reale: `POST /?action=user_access_list`\n"
          }
        }
      ]
    },
    {
      "name": "Newsletter",
      "item": [
        {
          "name": "newsletter_subscribe",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"email\": \"user@mail.it\",\n  \"selections\": [\n    {\n      \"feed\": \"qn\",\n      \"mlid\": \"3832\"\n    }\n  ]\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=newsletter_subscribe",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "newsletter_subscribe"
                }
              ]
            },
            "description": "Iscrizione ESP. Preferito `selections[]` multi-testata.\nURL reale: `POST /?action=newsletter_subscribe`\n"
          }
        },
        {
          "name": "newsletter_feed",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"all\": true\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=newsletter_feed",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "newsletter_feed"
                }
              ]
            },
            "description": "Feed newsletter. `all: true` (o senza feed) → 4 feed + `items[]`.\nURL reale: `POST /?action=newsletter_feed`\n"
          }
        }
      ]
    },
    {
      "name": "Recommendations",
      "item": [
        {
          "name": "recommendations",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{\n  \"url\": \"https://www.quotidiano.net/articolo\",\n  \"toptrend\": false\n}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=recommendations",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "recommendations"
                }
              ]
            },
            "description": "Contenuti suggeriti Cxense.\n- url opzionale (home vs article)\n- toptrend opzionale (default false)\n- widget: home | article | home_toptrend | article_toptrend\nURL reale: `POST /?action=recommendations`\n"
          }
        }
      ]
    },
    {
      "name": "Debug",
      "item": [
        {
          "name": "test_mail",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=test_mail",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "test_mail"
                }
              ]
            },
            "description": "Test SMTP diagnostico. URL reale: `POST /?action=test_mail`"
          }
        },
        {
          "name": "test_sms",
          "request": {
            "method": "POST",
            "header": [
              {
                "key": "Content-Type",
                "value": "application/json"
              }
            ],
            "body": {
              "mode": "raw",
              "raw": "{}",
              "options": {
                "raw": {
                  "language": "json"
                }
              }
            },
            "url": {
              "raw": "{{baseUrl}}/?action=test_sms",
              "host": [
                "{{baseUrl}}"
              ],
              "path": [
                ""
              ],
              "query": [
                {
                  "key": "action",
                  "value": "test_sms"
                }
              ]
            },
            "description": "Test gateway SMS. URL reale: `POST /?action=test_sms`"
          }
        }
      ]
    }
  ]
}