Protocollo HTTP di messaggistica Firebase Cloud

Questo documento fornisce un riferimento per la sintassi HTTP utilizzata per passare messaggi dal server delle applicazioni alle app client tramite Firebase Cloud Messaging.

Quando utilizzi il protocollo HTTP legacy, il server delle applicazioni deve indirizzare tutte le richieste HTTP a questo endpoint:

https://fcm.googleapis.com/fcm/send

I parametri e le opzioni disponibili rientrano nelle seguenti ampie categorie:

Sintassi del messaggio downstream

Questa sezione fornisce la sintassi per l'invio di messaggi downstream e l'interpretazione delle risposte HTTP da Firebase Cloud Messaging.

Messaggi HTTP downstream (JSON)

La tabella seguente elenca le destinazioni, le opzioni e il payload per i messaggi HTTP JSON.

Tabella 1. Destinazioni, opzioni e payload per i messaggi HTTP downstream (JSON).

Parametro Utilizzo Descrizione
Obiettivi
to Facoltativo, stringa

Questo parametro specifica il destinatario di un messaggio.

Il valore può essere il token di registrazione di un dispositivo, la chiave di notifica di un gruppo di dispositivi o un singolo argomento (con il prefisso /topics/ ). Per inviare a più argomenti, utilizzare il parametro condition .

registration_ids
Facoltativo, array di stringhe

Questo parametro specifica il destinatario di un messaggio multicast, un messaggio inviato a più di un token di registrazione.

Il valore deve essere un array di token di registrazione a cui inviare il messaggio multicast. L'array deve contenere almeno 1 e al massimo 1000 token di registrazione. Per inviare un messaggio a un singolo dispositivo, utilizzare il parametro to .

I messaggi multicast sono consentiti solo utilizzando il formato HTTP JSON.

condition Facoltativo, stringa

Questo parametro specifica un'espressione logica di condizioni che determinano la destinazione del messaggio.

Condizione supportata: argomento, formattato come "'yourTopic' negli argomenti". Questo valore non fa distinzione tra maiuscole e minuscole.

Operatori supportati: && , || . Sono supportati un massimo di due operatori per messaggio di argomento.

notification_key
Deprecato
Facoltativo, stringa

Questo parametro è deprecato. Utilizzare invece to specificare i destinatari del messaggio. Per ulteriori informazioni su come inviare messaggi a più dispositivi, consulta la documentazione della tua piattaforma.

Opzioni
collapse_key Facoltativo, stringa

Questo parametro identifica un gruppo di messaggi (ad esempio, con collapse_key: "Updates Available" ) che possono essere compressi, in modo che solo l'ultimo messaggio venga inviato quando è possibile riprendere la consegna. Questo ha lo scopo di evitare di inviare troppi messaggi uguali quando il dispositivo torna online o diventa attivo.

Tieni presente che non esiste alcuna garanzia sull'ordine in cui i messaggi vengono inviati.

Nota: è consentito un massimo di 4 chiavi di compressione diverse alla volta. Ciò significa che FCM può archiviare contemporaneamente 4 messaggi diversi per app client. Se si supera questo numero, non vi è alcuna garanzia su quali 4 chiavi di compressione FCM manterrà.

priority Facoltativo, stringa

Imposta la priorità del messaggio. I valori validi sono "normale" e "alto". Sulle piattaforme Apple corrispondono alle priorità 5 e 10 degli APN.

Per impostazione predefinita, i messaggi di notifica vengono inviati con priorità alta mentre i messaggi di dati vengono inviati con priorità normale. La priorità normale ottimizza il consumo della batteria dell'app client e deve essere utilizzata a meno che non sia richiesta la consegna immediata. Per i messaggi con priorità normale, l'app potrebbe ricevere il messaggio con un ritardo non specificato.

Quando un messaggio viene inviato con priorità alta, viene inviato immediatamente e l'app può visualizzare una notifica.

content_available Facoltativo, booleano

Sulle piattaforme Apple, utilizza questo campo per rappresentare content-available nel payload APN. Quando viene inviata una notifica o un messaggio e questo è impostato su true , viene riattivata un'app client inattiva e il messaggio viene inviato tramite APN come notifica silenziosa e non tramite FCM. Tieni presente che non è garantito che le notifiche silenziose negli APN vengano consegnate e possono dipendere da fattori come l'attivazione della modalità di risparmio energetico da parte dell'utente, la chiusura forzata dell'app, ecc. Su Android, i messaggi di dati riattivano l'app per impostazione predefinita. Su Chrome, attualmente non supportato.

mutable_content Facoltativo, valore booleano JSON

Sulle piattaforme Apple, utilizza questo campo per rappresentare mutable-content nel payload degli APN. Quando viene inviata una notifica e questa è impostata su true , il contenuto della notifica può essere modificato prima che venga visualizzato, utilizzando un'estensione dell'app Notification Service . Questo parametro verrà ignorato per Android e web.

time_to_live Facoltativo, numero

Questo parametro specifica per quanto tempo (in secondi) il messaggio deve essere conservato nell'archivio FCM se il dispositivo è offline. Il periodo massimo di supporto è 4 settimane e il valore predefinito è 4 settimane. Per ulteriori informazioni, vedere Impostazione della durata di un messaggio .

restricted_package_
name
(solo Android)
Facoltativo, stringa Questo parametro specifica il nome del pacchetto dell'applicazione a cui devono corrispondere i token di registrazione per ricevere il messaggio.
dry_run Facoltativo, booleano

Questo parametro, se impostato su true , consente agli sviluppatori di testare una richiesta senza effettivamente inviare un messaggio.

Il valore predefinito è false .

Carico utile
data Opzionale, oggetto

Questo parametro specifica le coppie chiave-valore personalizzate del payload del messaggio.

Ad esempio, con data:{"score":"3x1"}:

Sulle piattaforme Apple, se il messaggio viene inviato tramite APN, rappresenta i campi dati personalizzati. Se viene inviato tramite FCM, verrebbe rappresentato come dizionario dei valori chiave nell'applicazione AppDelegate application:didReceiveRemoteNotification: .

Su Android, ciò comporterebbe un score denominato extra con il valore di stringa 3x1 .

La chiave non deve essere una parola riservata ("da", "tipo_messaggio" o qualsiasi parola che inizi con "google" o "gcm"). Non utilizzare nessuna delle parole definite in questa tabella (come collapse_key ).

Si consigliano valori nei tipi stringa. È necessario convertire i valori negli oggetti o in altri tipi di dati non stringa (ad esempio, numeri interi o booleani) in stringhe.

notification Opzionale, oggetto Questo parametro specifica le coppie chiave-valore predefinite e visibili all'utente del payload della notifica. Vedi Supporto del payload delle notifiche per i dettagli. Per ulteriori informazioni sui messaggi di notifica e sulle opzioni dei messaggi di dati, vedere Tipi di messaggi . Se viene fornito un payload di notifica o l'opzione content_available è impostata su true per un messaggio a un dispositivo Apple, il messaggio viene inviato tramite APN , altrimenti viene inviato tramite FCM.

Supporto del payload delle notifiche

Le tabelle seguenti elencano le chiavi predefinite disponibili per la creazione di messaggi di notifica per iOS e Android.

Tabella 2a. iOS: tasti per i messaggi di notifica

Parametro Utilizzo Descrizione
title Facoltativo, stringa

Il titolo della notifica.

Questo campo non è visibile su telefoni e tablet.

body Facoltativo, stringa

Il corpo del testo della notifica.

sound Facoltativo, stringa

Il suono da riprodurre quando il dispositivo riceve la notifica.

Stringa che specifica i file audio nel pacchetto principale dell'app client o nella cartella Library/Sounds del contenitore dati dell'app. Consulta la Libreria per sviluppatori iOS per ulteriori informazioni.

badge Facoltativo, stringa

Il valore del badge sull'icona dell'app nella schermata iniziale.

Se non specificato il badge non viene modificato.

Se impostato a 0 il badge viene rimosso.

click_action Facoltativo, stringa

L'azione associata a un clic dell'utente sulla notifica.

Corrisponde alla category nel payload APN.

subtitle Facoltativo, stringa

Il sottotitolo della notifica.

body_loc_key Facoltativo, stringa

Chiave della stringa del corpo nelle risorse stringa dell'app da utilizzare per localizzare il corpo del testo nella localizzazione corrente dell'utente.

Corrisponde a loc-key nel payload APN.

Per ulteriori informazioni, consulta Riferimento alla chiave del payload e Localizzazione del contenuto delle notifiche remote .

body_loc_args Facoltativo, array JSON come stringa

Valori di stringa variabili da utilizzare al posto degli identificatori di formato in body_loc_key da utilizzare per localizzare il corpo del testo nella localizzazione corrente dell'utente.

Corrisponde a loc-args nel payload APN.

Per ulteriori informazioni, consulta Riferimento alla chiave del payload e Localizzazione del contenuto delle notifiche remote .

title_loc_key Facoltativo, stringa

Chiave della stringa del titolo nelle risorse stringa dell'app da utilizzare per localizzare il testo del titolo nella localizzazione corrente dell'utente.

Corrisponde alla title-loc-key nel payload APN.

Per ulteriori informazioni, consulta Riferimento alla chiave del payload e Localizzazione del contenuto delle notifiche remote .

title_loc_args Facoltativo, array JSON come stringa

Valori di stringa variabili da utilizzare al posto degli identificatori di formato in title_loc_key da utilizzare per localizzare il testo del titolo nella localizzazione corrente dell'utente.

Corrisponde a title-loc-args nel payload APN.

Per ulteriori informazioni, consulta Riferimento alla chiave del payload e Localizzazione del contenuto delle notifiche remote .

Tabella 2b. Android: tasti per i messaggi di notifica

Parametro Utilizzo Descrizione
title Facoltativo, stringa

Il titolo della notifica.

body Facoltativo, stringa

Il corpo del testo della notifica.

android_channel_id Facoltativo, stringa

L' ID del canale della notifica (nuovo in Android O).

L'app deve creare un canale con questo ID canale prima che venga ricevuta qualsiasi notifica con questo ID canale.

Se non invii questo ID canale nella richiesta o se l'ID canale fornito non è stato ancora creato dall'app, FCM utilizza l'ID canale specificato nel manifest dell'app.

icon Facoltativo, stringa

L'icona della notifica.

Imposta l'icona di notifica su myicon per la risorsa disegnabile myicon . Se non invii questa chiave nella richiesta, FCM visualizza l'icona di avvio specificata nel manifest dell'app.

sound Facoltativo, stringa

Il suono da riprodurre quando il dispositivo riceve la notifica.

Supporta "default" o il nome file di una risorsa audio inclusa nell'app. I file audio devono risiedere in /res/raw/ .

tag Facoltativo, stringa

Identificatore utilizzato per sostituire le notifiche esistenti nel cassetto delle notifiche.

Se non specificato, ogni richiesta crea una nuova notifica.

Se specificato ed è già visualizzata una notifica con lo stesso tag, la nuova notifica sostituisce quella esistente nel cassetto delle notifiche.

color Facoltativo, stringa

Il colore dell'icona della notifica, espresso nel formato #rrggbb .

click_action Facoltativo, stringa

L'azione associata a un clic dell'utente sulla notifica.

Se specificato, viene avviata un'attività con un filtro di intento corrispondente quando un utente fa clic sulla notifica.

body_loc_key Facoltativo, stringa

Chiave della stringa del corpo nelle risorse stringa dell'app da utilizzare per localizzare il corpo del testo nella localizzazione corrente dell'utente.

Vedi Risorse stringa per ulteriori informazioni.

body_loc_args Facoltativo, array JSON come stringa

Valori di stringa variabili da utilizzare al posto degli identificatori di formato in body_loc_key da utilizzare per localizzare il corpo del testo nella localizzazione corrente dell'utente.

Per ulteriori informazioni, vedere Formattazione e stile .

title_loc_key Facoltativo, stringa

Chiave della stringa del titolo nelle risorse stringa dell'app da utilizzare per localizzare il testo del titolo nella localizzazione corrente dell'utente.

Vedi Risorse stringa per ulteriori informazioni.

title_loc_args Facoltativo, array JSON come stringa

Valori di stringa variabili da utilizzare al posto degli identificatori di formato in title_loc_key da utilizzare per localizzare il testo del titolo nella localizzazione corrente dell'utente.

Per ulteriori informazioni, vedere Formattazione e stile .

Tabella 2c. Web (JavaScript): tasti per i messaggi di notifica

Parametro Utilizzo Descrizione
title Facoltativo, stringa

Il titolo della notifica.

body Facoltativo, stringa

Il corpo del testo della notifica.

icon Facoltativo, stringa

L'URL da utilizzare per l'icona della notifica.

click_action Facoltativo, stringa

L'azione associata a un clic dell'utente sulla notifica.

Per tutti i valori URL, è obbligatorio HTTPS.

Messaggi HTTP downstream (testo normale)

La tabella seguente elenca la sintassi per destinazioni, opzioni e payload nei messaggi HTTP downstream in testo normale.

Tabella 3. Destinazioni, opzioni e payload per i messaggi HTTP di testo normale downstream.

Parametro Utilizzo Descrizione
Obiettivi
registration_id Obbligatorio, stringa

Questo parametro specifica le app client (token di registrazione) che ricevono il messaggio.

La messaggistica multicast (invio a più token di registrazione) è consentita solo utilizzando il formato HTTP JSON.

Opzioni
collapse_key Facoltativo, stringa Vedere la tabella 1 per i dettagli.
time_to_live Facoltativo, numero Vedere la tabella 1 per i dettagli.
restricted_package_name Facoltativo, stringa Vedere la tabella 1 per i dettagli.
dry_run Facoltativo, booleano Vedere la tabella 1 per i dettagli.
Carico utile
data.<key> Facoltativo, stringa

Questo parametro specifica le coppie chiave-valore del payload del messaggio. Non esiste alcun limite al numero di parametri del valore-chiave, ma esiste un limite alla dimensione totale del messaggio di 4000 byte.

Ad esempio, in Android, "data.score"."3x1" risulterebbe in un score aggiuntivo denominato intento con il valore di stringa 3x1 .

La chiave non deve essere una parola riservata ("da", "tipo_messaggio" o qualsiasi parola che inizi con "google" o "gcm"). Non utilizzare nessuna delle parole definite in questa tabella (come collapse_key ).

Interpretazione di una risposta al messaggio downstream

Il server delle applicazioni deve valutare sia l'intestazione che il corpo della risposta al messaggio per interpretare la risposta al messaggio inviata da FCM. La tabella seguente descrive le possibili risposte.

Tabella 4. Intestazione di risposta al messaggio HTTP downstream.

Risposta Descrizione
200 Il messaggio è stato elaborato correttamente. Il corpo della risposta conterrà maggiori dettagli sullo stato del messaggio, ma il suo formato dipenderà dal fatto che la richiesta fosse JSON o testo semplice. Vedere la tabella 5 per maggiori dettagli.
400 Si applica solo alle richieste JSON. Indica che non è stato possibile analizzare la richiesta come JSON o che conteneva campi non validi (ad esempio, passaggio di una stringa dove era previsto un numero). Il motivo esatto dell'errore è descritto nella risposta e il problema deve essere risolto prima di poter ritentare la richiesta.
401 Si è verificato un errore durante l'autenticazione dell'account del mittente.
5xx Gli errori nell'intervallo 500-599 (come 500 o 503) indicano che si è verificato un errore interno nel backend FCM durante il tentativo di elaborare la richiesta o che il server è temporaneamente non disponibile (ad esempio, a causa di timeout). Il mittente deve riprovare più tardi, rispettando qualsiasi intestazione Retry-After inclusa nella risposta. I server delle applicazioni devono implementare il backoff esponenziale.

La tabella seguente elenca i campi nel corpo della risposta al messaggio downstream (JSON).

Tabella 5. Corpo della risposta del messaggio HTTP downstream (JSON).

Parametro Utilizzo Descrizione
multicast_id Obbligatorio, numero ID univoco (numero) che identifica il messaggio multicast.
success Obbligatorio, numero Numero di messaggi elaborati senza errori.
failure Obbligatorio, numero Numero di messaggi che non è stato possibile elaborare.
results Obbligatorio, array di oggetti Matrice di oggetti che rappresentano lo stato dei messaggi elaborati. Gli oggetti sono elencati nello stesso ordine della richiesta (vale a dire, per ciascun ID di registrazione nella richiesta, il suo risultato è elencato nello stesso indice nella risposta).
  • message_id : stringa che specifica un ID univoco per ogni messaggio elaborato correttamente.
  • error : stringa che specifica l'errore che si è verificato durante l'elaborazione del messaggio per il destinatario. I possibili valori si trovano nella tabella 9 .

Tabella 6. Corpo della risposta HTTP del messaggio dell'argomento (JSON).

Parametro Utilizzo Descrizione
message_id Facoltativo, numero L'ID del messaggio dell'argomento quando FCM ha ricevuto correttamente la richiesta e tenterà di consegnarla a tutti i dispositivi sottoscritti.
error Facoltativo, stringa Errore che si è verificato durante l'elaborazione del messaggio. I possibili valori si trovano nella tabella 9 .

Tabella 7. Risposta riuscita per il corpo della risposta del messaggio HTTP downstream (testo normale).

Parametro Utilizzo Descrizione
id Obbligatorio, stringa Questo parametro specifica l'ID messaggio univoco che FCM ha elaborato correttamente.
registration_id Facoltativo, stringa Questo parametro specifica il token di registrazione per l'app client a cui è stato elaborato e inviato il messaggio.

Tabella 8. Risposta di errore per il corpo della risposta del messaggio HTTP downstream (testo normale).

Parametro Utilizzo Descrizione
Error Obbligatorio, stringa Questo parametro specifica il valore dell'errore durante l'elaborazione del messaggio per il destinatario. Vedere la tabella 9 per i dettagli.

Codici di risposta agli errori dei messaggi downstream

Nella tabella seguente sono elencati i codici di risposta all'errore per i messaggi downstream.

Tabella 9. Codici di risposta agli errori dei messaggi downstream.

Errore Codice HTTP Azione raccomandata
Token di registrazione mancante 200 + errore: registrazione mancante Verifica che la richiesta contenga un token di registrazione (nel registration_id in un messaggio di testo semplice o nel campo to o registration_ids in JSON).
Token di registrazione non valido 200 + errore: registrazione non valida Controlla il formato del token di registrazione che passi al server. Assicurati che corrisponda al token di registrazione che l'app client riceve dalla registrazione con Firebase Notifications. Non troncare né aggiungere ulteriori caratteri.
Dispositivo non registrato 200 + errore: Non registrato Un token di registrazione esistente può cessare di essere valido in una serie di scenari, tra cui:
  • Se l'app client annulla la registrazione con FCM.
  • Se la registrazione dell'app client viene annullata automaticamente, ciò può verificarsi se l'utente disinstalla l'applicazione. Ad esempio, su iOS, se il servizio di feedback APN segnala il token APN come non valido.
  • Se il token di registrazione scade (ad esempio, Google potrebbe decidere di aggiornare i token di registrazione o il token APN è scaduto per i dispositivi iOS).
  • Se l'app client viene aggiornata ma la nuova versione non è configurata per ricevere messaggi.
In tutti questi casi, rimuovi questo token di registrazione dal server dell'app e smetti di usarlo per inviare messaggi.
Nome pacchetto non valido 200 + errore: nome pacchetto non valido Assicurati che il messaggio sia indirizzato a un token di registrazione il cui nome di pacchetto corrisponda al valore passato nella richiesta.
Errore di autenticazione 401 Non è stato possibile autenticare l'account del mittente utilizzato per inviare un messaggio. Le possibili cause sono:
  • Intestazione di autorizzazione mancante o con sintassi non valida nella richiesta HTTP.
  • Il progetto Firebase a cui appartiene la chiave del server specificata non è corretto.
  • Solo chiavi server legacy: la richiesta ha avuto origine da un server non incluso nella lista bianca negli IP delle chiavi del server.
Verifica che il token che stai inviando nell'intestazione Authentication sia la chiave server corretta associata al tuo progetto. Per i dettagli vedere Verifica della validità di una chiave server . Se stai utilizzando una chiave server legacy, ti consigliamo di eseguire l'aggiornamento a una nuova chiave che non abbia restrizioni IP. Consulta Migrazione delle chiavi del server legacy .
Mittente non corrispondente 200 + errore: MismatchSenderId Un token di registrazione è legato a un determinato gruppo di mittenti. Quando un'app client si registra per FCM, deve specificare quali mittenti sono autorizzati a inviare messaggi. Dovresti utilizzare uno di questi ID mittente quando invii messaggi all'app client. Se passi a un mittente diverso, i token di registrazione esistenti non funzioneranno.
JSON non valido 400 Controlla che il messaggio JSON sia formattato correttamente e contenga campi validi (ad esempio, assicurandoti che venga passato il tipo di dati corretto).
Parametri non validi 400 + errore: parametri non validi Verificare che i parametri forniti abbiano il nome e il tipo corretti.
Messaggio troppo grande 200 + errore:MessageTooBig Verificare che la dimensione totale dei dati del payload inclusi in un messaggio non superi i limiti FCM: 4096 byte per la maggior parte dei messaggi o 2048 byte nel caso di messaggi ad argomenti. Ciò include sia le chiavi che i valori.
Chiave dati non valida 200 + errore:
Chiave dati non valida
Controlla che i dati del payload non contengano una chiave (come from , o gcm , o qualsiasi valore con prefisso google ) utilizzata internamente da FCM. Tieni presente che alcune parole (come collapse_key ) sono utilizzate anche da FCM ma sono consentite nel payload, nel qual caso il valore del payload verrà sovrascritto dal valore FCM.
Tempo di vita non valido 200 + errore:InvalidTtl Verifica che il valore utilizzato in time_to_live sia un numero intero che rappresenta una durata in secondi compresa tra 0 e 2.419.200 (4 settimane).
Tempo scaduto Errore 5xx o 200 +: non disponibile

Il server non è riuscito a elaborare la richiesta in tempo. Riprovare la stessa richiesta, ma è necessario:

  • Rispettare l'intestazione Retry-After se è inclusa nella risposta dal server di connessione FCM.
  • Implementa il backoff esponenziale nel meccanismo dei nuovi tentativi. (es. se hai aspettato un secondo prima del primo tentativo, aspetta almeno due secondi prima del successivo, poi 4 secondi e così via). Se invii più messaggi, ritarda ciascuno di essi in modo indipendente di un importo casuale aggiuntivo per evitare di inviare una nuova richiesta per tutti i messaggi contemporaneamente.

I mittenti che causano problemi rischiano di essere inseriti nella lista nera.

Errore interno del server 500 o 200 + errore: InternalServerError Il server ha riscontrato un errore durante il tentativo di elaborare la richiesta. Puoi riprovare la stessa richiesta seguendo i requisiti elencati in "Timeout" (vedi riga sopra). Se l'errore persiste, contatta l'assistenza Firebase .
Velocità messaggi dispositivo superata 200 + errore:
DispositivoMessageRate
Superato

La frequenza dei messaggi inviati a un particolare dispositivo è troppo elevata. Se un'app Apple invia messaggi a una velocità superiore ai limiti APN, potrebbe ricevere questo messaggio di errore

Riduci il numero di messaggi inviati a questo dispositivo e utilizza il backoff esponenziale per ritentare l'invio.

La frequenza dei messaggi sugli argomenti è stata superata 200 + errore:
ArgomentiMessageRate
Superato
La frequenza dei messaggi agli abbonati a un particolare argomento è troppo alta. Riduci il numero di messaggi inviati per questo argomento e utilizza il backoff esponenziale per ritentare l'invio.
Credenziali APN non valide 200 + errore:
CredenzialeApns non valida
Non è stato possibile inviare un messaggio destinato a un dispositivo Apple perché la chiave di autenticazione APN richiesta non è stata caricata o è scaduta. Verifica la validità delle tue credenziali di sviluppo e produzione.

Gestione del gruppo di dispositivi

Nella tabella seguente sono elencate le chiavi per creare gruppi di dispositivi e aggiungere e rimuovere membri. Per ulteriori informazioni, consulta la guida per la tua piattaforma, iOS+ o Android .

Tabella 10. Chiavi di gestione del gruppo di dispositivi.

Parametro Utilizzo Descrizione
operation Obbligatorio, stringa L'operazione da eseguire. I valori validi sono create , add e remove .
notification_key_name Obbligatorio, stringa Il nome definito dall'utente del gruppo di dispositivi da creare o modificare.
notification_key Obbligatorio (ad eccezione dell'operazione create , string Identificatore univoco del gruppo di dispositivi. Questo valore viene restituito nella risposta per un'operazione create riuscita ed è richiesto per tutte le operazioni successive sul gruppo di dispositivi.
registration_ids Obbligatorio, array di stringhe I token del dispositivo da aggiungere o rimuovere. Se rimuovi tutti i token di registrazione esistenti da un gruppo di dispositivi, FCM elimina il gruppo di dispositivi.