Docs
Parcourir la documentation

Analytics REST API

The Privatus Analytics REST API: add .json to any app URL and send a token. Conventions and a reference of every operation, generated from the code.

Voir en Markdown

Every page and action in Privatus Analytics is also an API endpoint. There's no separate /api/v1: add .json to a URL and send an API token.

sh
curl https://privatusanalytics.com/sites/pa_7Q2K9XH3AB/stats/aggregate.json?period=7d \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
json
{
  "data": {
    "period": { "from": "2026-09-23T00:00:00Z", "to": "2026-09-30T00:00:00Z" },
    "metrics": {
      "visitors": 1840, "visits": 2310, "pageviews": 5122,
      "views_per_visit": 2.22, "bounce_rate": 41.3,
      "visit_duration": 48000, "revenue": 129900
    }
  }
}

The reference below lists every operation with its method, path, permission, input schema and response schema. It's generated from the running code, as is the OpenAPI 3.1 document, so neither can drift from what the server does. The same operations are MCP tools.

Conventions#

Base URL https://privatusanalytics.com
Format JSON. Add .json to the path (or send Accept: application/json)
Auth Authorization: Bearer pat_… (Authentication)
Ids Public ids with a prefix: ws_… workspaces, pa_… sites, seg_… segments, wh_… webhooks
Reads GET with query parameters
Writes POST, PATCH, DELETE with a JSON body of flat fields
Success { "data": … }, plus "meta" for lists
Errors { "error": { "code", "message", "details" } } (Errors)
Lists page and per_page (max 100) (Pagination)
Times ISO 8601 in UTC. Date parameters (from, to) are days in the site's timezone
Money Minor units (cents) in the site currency, e.g. revenue: 129900 = 1,299.00
Durations Milliseconds

Common tasks#

Task Operation
List workspaces GET /workspaces.json
List sites GET /workspaces/{workspace_id}/sites.json
Headline metrics GET /sites/{site_id}/stats/aggregate.json
Chart data GET /sites/{site_id}/stats/timeseries.json
Top pages, sources, countries… GET /sites/{site_id}/breakdown/{dimension}.json
Everything on the Overview GET /sites/{site_id}/overview.json
Live visitors GET /sites/{site_id}/live.json
Add a note (e.g. a deploy) POST /sites/{site_id}/notes.json

See Stats endpoints and Examples.

In this section#

Authentication · Errors · Pagination · Rate limits · Filters · Stats endpoints · Examples · Webhooks · Changelog and deprecation

Sending data in is a different API: see Server-side ingest.

Toutes les opérations

Authentification

Envoyez Authorization: Bearer pat_…. Créez des jetons dans les paramètres de l’espace de travail, section Jetons d’API. Guide d’authentification.

JSON partout

Ajoutez .json à n’importe quel chemin. Les réponses sont { "data": … } et les erreurs sont { "error": { "code", "message" } }. Erreurs.

MCP

Envoyez du JSON-RPC en POST à https://privatusanalytics.com/mcp avec le même jeton. Chaque opération ci-dessous est un outil. Guide MCP.

Télécharger openapi.json · 285 opérations

Aide et commentaires

POST /help.json Envoyer une question ou un commentaire à l’équipe Privatus Analytics support_message_send

Le message est envoyé par e-mail à l’équipe avec les détails de votre compte, de votre espace de travail et de votre offre. La réponse et un accusé de réception sont envoyés à l’e-mail de votre compte. Jusqu’à 10 messages par jour.

Permission : member

Exemple
curl -X POST https://privatusanalytics.com/help.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "subject": {
      "type": "string",
      "description": "Sujet du message (150 caractères maximum)",
      "examples": [
        "Funnel shows no data"
      ]
    },
    "message": {
      "type": "string",
      "description": "Votre question ou votre commentaire (de 10 à 5 000 caractères)"
    }
  },
  "required": [
    "subject",
    "message"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "received": {
      "type": "boolean",
      "description": "Toujours true lorsque l’envoi a été accepté"
    },
    "message": {
      "type": "string",
      "description": "Ce qui se passe ensuite"
    }
  }
}

Alertes

POST /alerts/:id/acknowledge.json Prendre en compte le dernier incident alerts_acknowledge

Permission : analytics.read

Exemple
curl -X POST https://privatusanalytics.com/alerts/:id/acknowledge.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’alerte, par ex. alr_7Q2K9XH3AB"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Identifiant du site (null pour les alertes d’utilisation)"
        },
        {
          "type": "null"
        }
      ]
    },
    "name": {
      "type": "string"
    },
    "kind": {
      "type": "string",
      "description": "threshold, anomaly, goal, no_data, usage, uptime, ssl ou vitals"
    },
    "metric": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "operator": {
      "anyOf": [
        {
          "type": "string",
          "description": "gt, gte, lt ou lte"
        },
        {
          "type": "null"
        }
      ]
    },
    "threshold": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ]
    },
    "window_minutes": {
      "type": "integer"
    },
    "sensitivity": {
      "type": "string",
      "description": "sensibilité de l’anomalie"
    },
    "goal_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "channel_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des canaux de notification"
    },
    "state": {
      "type": "string",
      "description": "ok ou triggered"
    },
    "enabled": {
      "type": "boolean"
    },
    "muted_until": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_triggered_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_evaluated_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
POST /workspaces/:workspace_id/alerts.json Créer une alerte alerts_create

Permission : content.write

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/alerts.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site (pa_…). Obligatoire sauf pour les alertes d’utilisation"
    },
    "metric": {
      "type": "string",
      "description": "threshold/anomaly : visitors, visits, pageviews, bounce_rate ou conversion. vitals : lcp, inp, cls, fcp ou ttfb"
    },
    "operator": {
      "type": "string",
      "description": "Comparaison (gt, gte, lt, lte). anomaly : lt uniquement les baisses, gt uniquement les pics, vide les deux",
      "enum": [
        "gt",
        "gte",
        "lt",
        "lte"
      ]
    },
    "threshold": {
      "type": "number",
      "description": "threshold : valeur de la métrique, goal : réalisations, no_data : heures, usage : pourcentage, ssl : jours, vitals : ms (CLS : score)"
    },
    "window_minutes": {
      "type": "integer",
      "description": "Fenêtre d’évaluation en minutes (5 à 10080)"
    },
    "sensitivity": {
      "type": "string",
      "description": "anomaly : low, medium ou high",
      "enum": [
        "low",
        "medium",
        "high"
      ]
    },
    "goal_id": {
      "type": "string",
      "description": "alertes goal et conversion : identifiant de l’objectif (goal_…)"
    },
    "uptime_check_id": {
      "type": "string",
      "description": "uptime/ssl : identifiant de la vérification (par défaut : toutes les vérifications du site)"
    },
    "channel_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des canaux de notification (nch_…)"
    },
    "enabled": {
      "type": "boolean",
      "description": "Évaluer cette alerte"
    },
    "name": {
      "type": "string",
      "description": "Nom de l’alerte",
      "examples": [
        "Traffic dropped"
      ]
    },
    "kind": {
      "type": "string",
      "description": "threshold, anomaly, goal, no_data, usage, uptime, ssl ou vitals",
      "enum": [
        "threshold",
        "anomaly",
        "goal",
        "no_data",
        "usage",
        "uptime",
        "ssl",
        "vitals"
      ]
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "name",
    "kind",
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’alerte, par ex. alr_7Q2K9XH3AB"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Identifiant du site (null pour les alertes d’utilisation)"
        },
        {
          "type": "null"
        }
      ]
    },
    "name": {
      "type": "string"
    },
    "kind": {
      "type": "string",
      "description": "threshold, anomaly, goal, no_data, usage, uptime, ssl ou vitals"
    },
    "metric": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "operator": {
      "anyOf": [
        {
          "type": "string",
          "description": "gt, gte, lt ou lte"
        },
        {
          "type": "null"
        }
      ]
    },
    "threshold": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ]
    },
    "window_minutes": {
      "type": "integer"
    },
    "sensitivity": {
      "type": "string",
      "description": "sensibilité de l’anomalie"
    },
    "goal_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "channel_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des canaux de notification"
    },
    "state": {
      "type": "string",
      "description": "ok ou triggered"
    },
    "enabled": {
      "type": "boolean"
    },
    "muted_until": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_triggered_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_evaluated_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /alerts/:id.json Supprimer une alerte alerts_delete

Permission : content.write

Exemple
curl -X DELETE https://privatusanalytics.com/alerts/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’alerte, par ex. alr_7Q2K9XH3AB"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Identifiant du site (null pour les alertes d’utilisation)"
        },
        {
          "type": "null"
        }
      ]
    },
    "name": {
      "type": "string"
    },
    "kind": {
      "type": "string",
      "description": "threshold, anomaly, goal, no_data, usage, uptime, ssl ou vitals"
    },
    "metric": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "operator": {
      "anyOf": [
        {
          "type": "string",
          "description": "gt, gte, lt ou lte"
        },
        {
          "type": "null"
        }
      ]
    },
    "threshold": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ]
    },
    "window_minutes": {
      "type": "integer"
    },
    "sensitivity": {
      "type": "string",
      "description": "sensibilité de l’anomalie"
    },
    "goal_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "channel_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des canaux de notification"
    },
    "state": {
      "type": "string",
      "description": "ok ou triggered"
    },
    "enabled": {
      "type": "boolean"
    },
    "muted_until": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_triggered_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_evaluated_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /alerts/:id/history.json Historique des incidents d’une alerte alerts_history

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/alerts/:id/history.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "open": {
      "type": "boolean",
      "description": "Uniquement les incidents non résolus",
      "default": false
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "triggered_at": {
        "type": "string",
        "format": "date-time"
      },
      "resolved_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "value": {
        "anyOf": [
          {
            "type": "number",
            "description": "Valeur mesurée au déclenchement"
          },
          {
            "type": "null"
          }
        ]
      },
      "message": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "acknowledged_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "acknowledged_by": {
        "anyOf": [
          {
            "type": "string",
            "description": "Nom du membre qui a pris en compte l’alerte"
          },
          {
            "type": "null"
          }
        ]
      }
    }
  }
}
GET /workspaces/:workspace_id/alerts.json Lister les alertes alerts_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/alerts.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Uniquement les alertes de ce site (pa_…)"
    },
    "state": {
      "type": "string",
      "description": "Uniquement les alertes ok ou triggered",
      "enum": [
        "ok",
        "triggered"
      ]
    },
    "kind": {
      "type": "string",
      "description": "Uniquement ce type",
      "enum": [
        "threshold",
        "anomaly",
        "goal",
        "no_data",
        "usage",
        "uptime",
        "ssl",
        "vitals"
      ]
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant d’alerte, par ex. alr_7Q2K9XH3AB"
      },
      "site_id": {
        "anyOf": [
          {
            "type": "string",
            "description": "Identifiant du site (null pour les alertes d’utilisation)"
          },
          {
            "type": "null"
          }
        ]
      },
      "name": {
        "type": "string"
      },
      "kind": {
        "type": "string",
        "description": "threshold, anomaly, goal, no_data, usage, uptime, ssl ou vitals"
      },
      "metric": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "operator": {
        "anyOf": [
          {
            "type": "string",
            "description": "gt, gte, lt ou lte"
          },
          {
            "type": "null"
          }
        ]
      },
      "threshold": {
        "anyOf": [
          {
            "type": "number"
          },
          {
            "type": "null"
          }
        ]
      },
      "window_minutes": {
        "type": "integer"
      },
      "sensitivity": {
        "type": "string",
        "description": "sensibilité de l’anomalie"
      },
      "goal_id": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "channel_ids": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "description": "Identifiants des canaux de notification"
      },
      "state": {
        "type": "string",
        "description": "ok ou triggered"
      },
      "enabled": {
        "type": "boolean"
      },
      "muted_until": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "last_triggered_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "last_evaluated_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
POST /alerts/:id/mute.json Mettre en sourdine (ou réactiver) les notifications d’une alerte alerts_mute

Permission : content.write

Exemple
curl -X POST https://privatusanalytics.com/alerts/:id/mute.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "minutes": {
      "type": "integer",
      "description": "Mettre en sourdine pendant ce nombre de minutes (0 réactive, 30 jours maximum)",
      "default": 60
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’alerte, par ex. alr_7Q2K9XH3AB"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Identifiant du site (null pour les alertes d’utilisation)"
        },
        {
          "type": "null"
        }
      ]
    },
    "name": {
      "type": "string"
    },
    "kind": {
      "type": "string",
      "description": "threshold, anomaly, goal, no_data, usage, uptime, ssl ou vitals"
    },
    "metric": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "operator": {
      "anyOf": [
        {
          "type": "string",
          "description": "gt, gte, lt ou lte"
        },
        {
          "type": "null"
        }
      ]
    },
    "threshold": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ]
    },
    "window_minutes": {
      "type": "integer"
    },
    "sensitivity": {
      "type": "string",
      "description": "sensibilité de l’anomalie"
    },
    "goal_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "channel_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des canaux de notification"
    },
    "state": {
      "type": "string",
      "description": "ok ou triggered"
    },
    "enabled": {
      "type": "boolean"
    },
    "muted_until": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_triggered_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_evaluated_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /alerts/:id.json Obtenir une alerte alerts_get

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/alerts/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’alerte, par ex. alr_7Q2K9XH3AB"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Identifiant du site (null pour les alertes d’utilisation)"
        },
        {
          "type": "null"
        }
      ]
    },
    "name": {
      "type": "string"
    },
    "kind": {
      "type": "string",
      "description": "threshold, anomaly, goal, no_data, usage, uptime, ssl ou vitals"
    },
    "metric": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "operator": {
      "anyOf": [
        {
          "type": "string",
          "description": "gt, gte, lt ou lte"
        },
        {
          "type": "null"
        }
      ]
    },
    "threshold": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ]
    },
    "window_minutes": {
      "type": "integer"
    },
    "sensitivity": {
      "type": "string",
      "description": "sensibilité de l’anomalie"
    },
    "goal_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "channel_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des canaux de notification"
    },
    "state": {
      "type": "string",
      "description": "ok ou triggered"
    },
    "enabled": {
      "type": "boolean"
    },
    "muted_until": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_triggered_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_evaluated_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
PATCH /alerts/:id.json Mettre à jour une alerte alerts_update

Permission : content.write

Exemple
curl -X PATCH https://privatusanalytics.com/alerts/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site (pa_…). Obligatoire sauf pour les alertes d’utilisation"
    },
    "metric": {
      "type": "string",
      "description": "threshold/anomaly : visitors, visits, pageviews, bounce_rate ou conversion. vitals : lcp, inp, cls, fcp ou ttfb"
    },
    "operator": {
      "type": "string",
      "description": "Comparaison (gt, gte, lt, lte). anomaly : lt uniquement les baisses, gt uniquement les pics, vide les deux",
      "enum": [
        "gt",
        "gte",
        "lt",
        "lte"
      ]
    },
    "threshold": {
      "type": "number",
      "description": "threshold : valeur de la métrique, goal : réalisations, no_data : heures, usage : pourcentage, ssl : jours, vitals : ms (CLS : score)"
    },
    "window_minutes": {
      "type": "integer",
      "description": "Fenêtre d’évaluation en minutes (5 à 10080)"
    },
    "sensitivity": {
      "type": "string",
      "description": "anomaly : low, medium ou high",
      "enum": [
        "low",
        "medium",
        "high"
      ]
    },
    "goal_id": {
      "type": "string",
      "description": "alertes goal et conversion : identifiant de l’objectif (goal_…)"
    },
    "uptime_check_id": {
      "type": "string",
      "description": "uptime/ssl : identifiant de la vérification (par défaut : toutes les vérifications du site)"
    },
    "channel_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des canaux de notification (nch_…)"
    },
    "enabled": {
      "type": "boolean",
      "description": "Évaluer cette alerte"
    },
    "name": {
      "type": "string",
      "description": "Nom de l’alerte"
    },
    "kind": {
      "type": "string",
      "description": "Type d’alerte",
      "enum": [
        "threshold",
        "anomaly",
        "goal",
        "no_data",
        "usage",
        "uptime",
        "ssl",
        "vitals"
      ]
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’alerte, par ex. alr_7Q2K9XH3AB"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Identifiant du site (null pour les alertes d’utilisation)"
        },
        {
          "type": "null"
        }
      ]
    },
    "name": {
      "type": "string"
    },
    "kind": {
      "type": "string",
      "description": "threshold, anomaly, goal, no_data, usage, uptime, ssl ou vitals"
    },
    "metric": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "operator": {
      "anyOf": [
        {
          "type": "string",
          "description": "gt, gte, lt ou lte"
        },
        {
          "type": "null"
        }
      ]
    },
    "threshold": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ]
    },
    "window_minutes": {
      "type": "integer"
    },
    "sensitivity": {
      "type": "string",
      "description": "sensibilité de l’anomalie"
    },
    "goal_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "channel_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des canaux de notification"
    },
    "state": {
      "type": "string",
      "description": "ok ou triggered"
    },
    "enabled": {
      "type": "boolean"
    },
    "muted_until": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_triggered_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_evaluated_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /sites/:site_id/alerts.json Lister les alertes d’un site site_alerts_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/alerts.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "state": {
      "type": "string",
      "description": "Uniquement les alertes ok ou triggered",
      "enum": [
        "ok",
        "triggered"
      ]
    },
    "kind": {
      "type": "string",
      "description": "Uniquement ce type",
      "enum": [
        "threshold",
        "anomaly",
        "goal",
        "no_data",
        "usage",
        "uptime",
        "ssl",
        "vitals"
      ]
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant d’alerte, par ex. alr_7Q2K9XH3AB"
      },
      "site_id": {
        "anyOf": [
          {
            "type": "string",
            "description": "Identifiant du site (null pour les alertes d’utilisation)"
          },
          {
            "type": "null"
          }
        ]
      },
      "name": {
        "type": "string"
      },
      "kind": {
        "type": "string",
        "description": "threshold, anomaly, goal, no_data, usage, uptime, ssl ou vitals"
      },
      "metric": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "operator": {
        "anyOf": [
          {
            "type": "string",
            "description": "gt, gte, lt ou lte"
          },
          {
            "type": "null"
          }
        ]
      },
      "threshold": {
        "anyOf": [
          {
            "type": "number"
          },
          {
            "type": "null"
          }
        ]
      },
      "window_minutes": {
        "type": "integer"
      },
      "sensitivity": {
        "type": "string",
        "description": "sensibilité de l’anomalie"
      },
      "goal_id": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "channel_ids": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "description": "Identifiants des canaux de notification"
      },
      "state": {
        "type": "string",
        "description": "ok ou triggered"
      },
      "enabled": {
        "type": "boolean"
      },
      "muted_until": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "last_triggered_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "last_evaluated_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}

Analytics

GET /sites/:site_id/overview.json Vue d’ensemble du site : métriques, séries de graphique, principaux panneaux, visiteurs en direct et notes stats_overview

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/overview.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "period": {
      "type": "string",
      "description": "Préréglage de plage de dates. Utilisez custom avec from/to",
      "enum": [
        "today",
        "yesterday",
        "24h",
        "7d",
        "14d",
        "28d",
        "30d",
        "90d",
        "mtd",
        "last_month",
        "qtd",
        "last_quarter",
        "ytd",
        "12mo",
        "last_year",
        "all",
        "custom"
      ],
      "default": "30d"
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "Début de la plage personnalisée (fuseau horaire du site)"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la plage personnalisée, incluse"
    },
    "compare": {
      "type": "string",
      "description": "Période de comparaison",
      "enum": [
        "none",
        "previous_period",
        "previous_year",
        "custom"
      ],
      "default": "none"
    },
    "compare_from": {
      "type": "string",
      "format": "date",
      "description": "Début de la comparaison personnalisée"
    },
    "compare_to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la comparaison personnalisée"
    },
    "match_weekday": {
      "type": "boolean",
      "description": "Aligner les jours de la semaine de la comparaison",
      "default": false
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres : [[\"dimension\",\"operator\",\"value\"], …]. Opérateurs : is, is_not, any_of, none_of, contains, not_contains, starts_with, regex, not_regex, gt, lt, between. Encadrez les conditions dans {\"any\": [...]} pour un OU.",
      "default": []
    },
    "segment_id": {
      "type": "string",
      "description": "Appliquer un segment enregistré (seg_…)"
    },
    "include_imported": {
      "type": "boolean",
      "description": "Ajouter les données historiques importées (dates antérieures au premier événement natif, ignorées lorsque des filtres ou un segment sont appliqués)",
      "default": false
    },
    "interval": {
      "type": "string",
      "description": "Taille de l’intervalle du graphique",
      "enum": [
        "auto",
        "minute",
        "hour",
        "day",
        "week",
        "month",
        "quarter",
        "year"
      ],
      "default": "auto"
    },
    "panels": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Dimensions dont inclure les principales valeurs",
      "default": [
        "channel",
        "referrer",
        "page",
        "entry_page",
        "country",
        "device",
        "browser",
        "os",
        "utm_campaign",
        "event",
        "goal"
      ]
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /sites/:site_id/experiments.json Rapport d’expérience : taux de conversion par variante, gain par rapport au contrôle et significativité (test z de deux proportions) experiments_report

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/experiments.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "period": {
      "type": "string",
      "description": "Préréglage de plage de dates. Utilisez custom avec from/to",
      "enum": [
        "today",
        "yesterday",
        "24h",
        "7d",
        "14d",
        "28d",
        "30d",
        "90d",
        "mtd",
        "last_month",
        "qtd",
        "last_quarter",
        "ytd",
        "12mo",
        "last_year",
        "all",
        "custom"
      ],
      "default": "30d"
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "Début de la plage personnalisée (fuseau horaire du site)"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la plage personnalisée, incluse"
    },
    "compare": {
      "type": "string",
      "description": "Période de comparaison",
      "enum": [
        "none",
        "previous_period",
        "previous_year",
        "custom"
      ],
      "default": "none"
    },
    "compare_from": {
      "type": "string",
      "format": "date",
      "description": "Début de la comparaison personnalisée"
    },
    "compare_to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la comparaison personnalisée"
    },
    "match_weekday": {
      "type": "boolean",
      "description": "Aligner les jours de la semaine de la comparaison",
      "default": false
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres : [[\"dimension\",\"operator\",\"value\"], …]. Opérateurs : is, is_not, any_of, none_of, contains, not_contains, starts_with, regex, not_regex, gt, lt, between. Encadrez les conditions dans {\"any\": [...]} pour un OU.",
      "default": []
    },
    "segment_id": {
      "type": "string",
      "description": "Appliquer un segment enregistré (seg_…)"
    },
    "include_imported": {
      "type": "boolean",
      "description": "Ajouter les données historiques importées (dates antérieures au premier événement natif, ignorées lorsque des filtres ou un segment sont appliqués)",
      "default": false
    },
    "property": {
      "type": "string",
      "description": "Propriété d’événement contenant la variante, par ex. variant",
      "examples": [
        "variant"
      ]
    },
    "goal_id": {
      "type": "string",
      "description": "Objectif compté comme conversion (goal_…)"
    },
    "control": {
      "type": "string",
      "description": "Variante de contrôle (par défaut \"control\" si présente, sinon la variante avec le plus de visites)"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "property",
    "goal_id",
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /sites/:site_id/insights.json Changements notables par rapport à la période précédente, en langage naturel (plus fortes variations, évolutions de conversion des objectifs) insights_get

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/insights.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "period": {
      "type": "string",
      "description": "Jours complets jusqu’à hier, comparés au même nombre de jours précédents",
      "enum": [
        "7d",
        "14d",
        "28d",
        "30d"
      ],
      "default": "7d"
    },
    "limit": {
      "type": "integer",
      "description": "Nombre maximal d’analyses (1 à 20)",
      "default": 8
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /sites/:site_id/journeys.json Parcours : les 3 principaux chemins en 3 étapes après une page (ou toute entrée), ou avant une page ou un objectif journeys_explore

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/journeys.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "period": {
      "type": "string",
      "description": "Préréglage de plage de dates. Utilisez custom avec from/to",
      "enum": [
        "today",
        "yesterday",
        "24h",
        "7d",
        "14d",
        "28d",
        "30d",
        "90d",
        "mtd",
        "last_month",
        "qtd",
        "last_quarter",
        "ytd",
        "12mo",
        "last_year",
        "all",
        "custom"
      ],
      "default": "30d"
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "Début de la plage personnalisée (fuseau horaire du site)"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la plage personnalisée, incluse"
    },
    "compare": {
      "type": "string",
      "description": "Période de comparaison",
      "enum": [
        "none",
        "previous_period",
        "previous_year",
        "custom"
      ],
      "default": "none"
    },
    "compare_from": {
      "type": "string",
      "format": "date",
      "description": "Début de la comparaison personnalisée"
    },
    "compare_to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la comparaison personnalisée"
    },
    "match_weekday": {
      "type": "boolean",
      "description": "Aligner les jours de la semaine de la comparaison",
      "default": false
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres : [[\"dimension\",\"operator\",\"value\"], …]. Opérateurs : is, is_not, any_of, none_of, contains, not_contains, starts_with, regex, not_regex, gt, lt, between. Encadrez les conditions dans {\"any\": [...]} pour un OU.",
      "default": []
    },
    "segment_id": {
      "type": "string",
      "description": "Appliquer un segment enregistré (seg_…)"
    },
    "include_imported": {
      "type": "boolean",
      "description": "Ajouter les données historiques importées (dates antérieures au premier événement natif, ignorées lorsque des filtres ou un segment sont appliqués)",
      "default": false
    },
    "mode": {
      "type": "string",
      "description": "forward : pages après la page de départ, reverse : pages menant à la page de fin ou à l’objectif",
      "enum": [
        "forward",
        "reverse"
      ],
      "default": "forward"
    },
    "path": {
      "type": "string",
      "description": "Page de départ (forward) ou page de fin (reverse). Vide signifie n’importe quelle entrée (forward uniquement)"
    },
    "goal_id": {
      "type": "string",
      "description": "Mode reverse : terminer à cet objectif (goal_…) plutôt qu’à une page"
    },
    "limit": {
      "type": "integer",
      "description": "Pages affichées par étape (12 maximum)",
      "default": 6
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /sites/:site_id/pages/detail.json Détail d’une page : métriques, pages précédentes et suivantes, sources, Web Vitals, événements et carte des clics pour un chemin pages_detail

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/pages/detail.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "period": {
      "type": "string",
      "description": "Préréglage de plage de dates. Utilisez custom avec from/to",
      "enum": [
        "today",
        "yesterday",
        "24h",
        "7d",
        "14d",
        "28d",
        "30d",
        "90d",
        "mtd",
        "last_month",
        "qtd",
        "last_quarter",
        "ytd",
        "12mo",
        "last_year",
        "all",
        "custom"
      ],
      "default": "30d"
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "Début de la plage personnalisée (fuseau horaire du site)"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la plage personnalisée, incluse"
    },
    "compare": {
      "type": "string",
      "description": "Période de comparaison",
      "enum": [
        "none",
        "previous_period",
        "previous_year",
        "custom"
      ],
      "default": "none"
    },
    "compare_from": {
      "type": "string",
      "format": "date",
      "description": "Début de la comparaison personnalisée"
    },
    "compare_to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la comparaison personnalisée"
    },
    "match_weekday": {
      "type": "boolean",
      "description": "Aligner les jours de la semaine de la comparaison",
      "default": false
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres : [[\"dimension\",\"operator\",\"value\"], …]. Opérateurs : is, is_not, any_of, none_of, contains, not_contains, starts_with, regex, not_regex, gt, lt, between. Encadrez les conditions dans {\"any\": [...]} pour un OU.",
      "default": []
    },
    "segment_id": {
      "type": "string",
      "description": "Appliquer un segment enregistré (seg_…)"
    },
    "include_imported": {
      "type": "boolean",
      "description": "Ajouter les données historiques importées (dates antérieures au premier événement natif, ignorées lorsque des filtres ou un segment sont appliqués)",
      "default": false
    },
    "path": {
      "type": "string",
      "description": "Chemin de la page, par ex. /pricing",
      "examples": [
        "/pricing"
      ]
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "path",
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /sites/:site_id/stats/aggregate.json Métriques principales d’une période (avec comparaison) stats_aggregate

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/stats/aggregate.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "period": {
      "type": "string",
      "description": "Préréglage de plage de dates. Utilisez custom avec from/to",
      "enum": [
        "today",
        "yesterday",
        "24h",
        "7d",
        "14d",
        "28d",
        "30d",
        "90d",
        "mtd",
        "last_month",
        "qtd",
        "last_quarter",
        "ytd",
        "12mo",
        "last_year",
        "all",
        "custom"
      ],
      "default": "30d"
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "Début de la plage personnalisée (fuseau horaire du site)"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la plage personnalisée, incluse"
    },
    "compare": {
      "type": "string",
      "description": "Période de comparaison",
      "enum": [
        "none",
        "previous_period",
        "previous_year",
        "custom"
      ],
      "default": "none"
    },
    "compare_from": {
      "type": "string",
      "format": "date",
      "description": "Début de la comparaison personnalisée"
    },
    "compare_to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la comparaison personnalisée"
    },
    "match_weekday": {
      "type": "boolean",
      "description": "Aligner les jours de la semaine de la comparaison",
      "default": false
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres : [[\"dimension\",\"operator\",\"value\"], …]. Opérateurs : is, is_not, any_of, none_of, contains, not_contains, starts_with, regex, not_regex, gt, lt, between. Encadrez les conditions dans {\"any\": [...]} pour un OU.",
      "default": []
    },
    "segment_id": {
      "type": "string",
      "description": "Appliquer un segment enregistré (seg_…)"
    },
    "include_imported": {
      "type": "boolean",
      "description": "Ajouter les données historiques importées (dates antérieures au premier événement natif, ignorées lorsque des filtres ou un segment sont appliqués)",
      "default": false
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /sites/:site_id/breakdown/:dimension.json Principales valeurs d’une dimension (pages, sources, pays…) stats_breakdown

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/breakdown/:dimension.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "period": {
      "type": "string",
      "description": "Préréglage de plage de dates. Utilisez custom avec from/to",
      "enum": [
        "today",
        "yesterday",
        "24h",
        "7d",
        "14d",
        "28d",
        "30d",
        "90d",
        "mtd",
        "last_month",
        "qtd",
        "last_quarter",
        "ytd",
        "12mo",
        "last_year",
        "all",
        "custom"
      ],
      "default": "30d"
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "Début de la plage personnalisée (fuseau horaire du site)"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la plage personnalisée, incluse"
    },
    "compare": {
      "type": "string",
      "description": "Période de comparaison",
      "enum": [
        "none",
        "previous_period",
        "previous_year",
        "custom"
      ],
      "default": "none"
    },
    "compare_from": {
      "type": "string",
      "format": "date",
      "description": "Début de la comparaison personnalisée"
    },
    "compare_to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la comparaison personnalisée"
    },
    "match_weekday": {
      "type": "boolean",
      "description": "Aligner les jours de la semaine de la comparaison",
      "default": false
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres : [[\"dimension\",\"operator\",\"value\"], …]. Opérateurs : is, is_not, any_of, none_of, contains, not_contains, starts_with, regex, not_regex, gt, lt, between. Encadrez les conditions dans {\"any\": [...]} pour un OU.",
      "default": []
    },
    "segment_id": {
      "type": "string",
      "description": "Appliquer un segment enregistré (seg_…)"
    },
    "include_imported": {
      "type": "boolean",
      "description": "Ajouter les données historiques importées (dates antérieures au premier événement natif, ignorées lorsque des filtres ou un segment sont appliqués)",
      "default": false
    },
    "dimension": {
      "type": "string",
      "description": "Dimension de la ressource"
    },
    "limit": {
      "type": "integer",
      "description": "Lignes par page (1000 maximum)",
      "default": 10
    },
    "page": {
      "type": "integer",
      "description": "Numéro de page",
      "default": 1
    },
    "sort": {
      "type": "string",
      "description": "Métrique de tri",
      "enum": [
        "visitors",
        "visits",
        "pageviews",
        "revenue"
      ]
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "dimension",
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /sites/:site_id/stats/timeseries.json Métriques par intervalle de temps pour les graphiques stats_timeseries

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/stats/timeseries.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "period": {
      "type": "string",
      "description": "Préréglage de plage de dates. Utilisez custom avec from/to",
      "enum": [
        "today",
        "yesterday",
        "24h",
        "7d",
        "14d",
        "28d",
        "30d",
        "90d",
        "mtd",
        "last_month",
        "qtd",
        "last_quarter",
        "ytd",
        "12mo",
        "last_year",
        "all",
        "custom"
      ],
      "default": "30d"
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "Début de la plage personnalisée (fuseau horaire du site)"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la plage personnalisée, incluse"
    },
    "compare": {
      "type": "string",
      "description": "Période de comparaison",
      "enum": [
        "none",
        "previous_period",
        "previous_year",
        "custom"
      ],
      "default": "none"
    },
    "compare_from": {
      "type": "string",
      "format": "date",
      "description": "Début de la comparaison personnalisée"
    },
    "compare_to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la comparaison personnalisée"
    },
    "match_weekday": {
      "type": "boolean",
      "description": "Aligner les jours de la semaine de la comparaison",
      "default": false
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres : [[\"dimension\",\"operator\",\"value\"], …]. Opérateurs : is, is_not, any_of, none_of, contains, not_contains, starts_with, regex, not_regex, gt, lt, between. Encadrez les conditions dans {\"any\": [...]} pour un OU.",
      "default": []
    },
    "segment_id": {
      "type": "string",
      "description": "Appliquer un segment enregistré (seg_…)"
    },
    "include_imported": {
      "type": "boolean",
      "description": "Ajouter les données historiques importées (dates antérieures au premier événement natif, ignorées lorsque des filtres ou un segment sont appliqués)",
      "default": false
    },
    "interval": {
      "type": "string",
      "description": "Taille de l’intervalle. auto en choisit un selon la plage",
      "enum": [
        "auto",
        "minute",
        "hour",
        "day",
        "week",
        "month",
        "quarter",
        "year"
      ],
      "default": "auto"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}

Assistant

POST /sites/:site_id/ask.json Poser une question dans une nouvelle conversation (compte dans la limite mensuelle de questions IA) assistant_ask

Permission : analytics.read

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/ask.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "question": {
      "type": "string",
      "description": "Votre première question en langage naturel",
      "examples": [
        "How many visitors did we have last week?"
      ]
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "question",
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de conversation, par ex. ask_7Q2K9XH3AB"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Identifiant du site"
        },
        {
          "type": "null"
        }
      ]
    },
    "title": {
      "anyOf": [
        {
          "type": "string",
          "description": "La première question, abrégée"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time",
      "description": "Heure du dernier message"
    },
    "expires_at": {
      "type": "string",
      "format": "date-time",
      "description": "Supprimée automatiquement après cette date (30 jours après le dernier message)"
    },
    "messages": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "format": "uuid",
          "description": "Identifiant du message dans la conversation"
        },
        "role": {
          "type": "string",
          "description": "user (la question) ou assistant (la réponse)"
        },
        "content": {
          "type": "string",
          "description": "La question, ou la réponse en Markdown"
        },
        "queries": {
          "type": "array",
          "items": {
            "type": "object"
          },
          "description": "Comment j’y suis arrivé : les requêtes API exactes derrière la réponse, sous la forme [{tool, input, status, error}]"
        },
        "chart": {
          "anyOf": [
            {
              "type": "object",
              "description": "Graphique de la réponse : {type: line, labels, series, comparison, metric, format} ou {type: table, columns, rows}"
            },
            {
              "type": "null"
            }
          ]
        },
        "goal_draft": {
          "anyOf": [
            {
              "type": "object",
              "description": "Un objectif proposé par l’assistant, à confirmer avec goals_create"
            },
            {
              "type": "null"
            }
          ]
        },
        "input_tokens": {
          "anyOf": [
            {
              "type": "integer",
              "description": "Jetons d’entrée du modèle utilisés"
            },
            {
              "type": "null"
            }
          ]
        },
        "output_tokens": {
          "anyOf": [
            {
              "type": "integer",
              "description": "Jetons de sortie du modèle utilisés"
            },
            {
              "type": "null"
            }
          ]
        },
        "created_at": {
          "type": "string",
          "format": "date-time"
        }
      },
      "description": "Questions et réponses, les plus anciennes en premier"
    }
  }
}
DELETE /sites/:site_id/ask/:id.json Supprimer une conversation Ask et ses messages assistant_conversations_delete

Permission : analytics.read

Exemple
curl -X DELETE https://privatusanalytics.com/sites/:site_id/ask/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de conversation, par ex. ask_7Q2K9XH3AB"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Identifiant du site"
        },
        {
          "type": "null"
        }
      ]
    },
    "title": {
      "anyOf": [
        {
          "type": "string",
          "description": "La première question, abrégée"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time",
      "description": "Heure du dernier message"
    },
    "expires_at": {
      "type": "string",
      "format": "date-time",
      "description": "Supprimée automatiquement après cette date (30 jours après le dernier message)"
    }
  }
}
GET /sites/:site_id/ask.json Lister vos conversations Ask pour un site assistant_conversations_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/ask.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant de conversation, par ex. ask_7Q2K9XH3AB"
      },
      "site_id": {
        "anyOf": [
          {
            "type": "string",
            "description": "Identifiant du site"
          },
          {
            "type": "null"
          }
        ]
      },
      "title": {
        "anyOf": [
          {
            "type": "string",
            "description": "La première question, abrégée"
          },
          {
            "type": "null"
          }
        ]
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      },
      "updated_at": {
        "type": "string",
        "format": "date-time",
        "description": "Heure du dernier message"
      },
      "expires_at": {
        "type": "string",
        "format": "date-time",
        "description": "Supprimée automatiquement après cette date (30 jours après le dernier message)"
      }
    }
  }
}
GET /sites/:site_id/ask/:id.json Une conversation Ask : questions, réponses, requêtes sous-jacentes et graphiques assistant_conversations_get

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/ask/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de conversation, par ex. ask_7Q2K9XH3AB"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Identifiant du site"
        },
        {
          "type": "null"
        }
      ]
    },
    "title": {
      "anyOf": [
        {
          "type": "string",
          "description": "La première question, abrégée"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time",
      "description": "Heure du dernier message"
    },
    "expires_at": {
      "type": "string",
      "format": "date-time",
      "description": "Supprimée automatiquement après cette date (30 jours après le dernier message)"
    },
    "messages": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "format": "uuid",
          "description": "Identifiant du message dans la conversation"
        },
        "role": {
          "type": "string",
          "description": "user (la question) ou assistant (la réponse)"
        },
        "content": {
          "type": "string",
          "description": "La question, ou la réponse en Markdown"
        },
        "queries": {
          "type": "array",
          "items": {
            "type": "object"
          },
          "description": "Comment j’y suis arrivé : les requêtes API exactes derrière la réponse, sous la forme [{tool, input, status, error}]"
        },
        "chart": {
          "anyOf": [
            {
              "type": "object",
              "description": "Graphique de la réponse : {type: line, labels, series, comparison, metric, format} ou {type: table, columns, rows}"
            },
            {
              "type": "null"
            }
          ]
        },
        "goal_draft": {
          "anyOf": [
            {
              "type": "object",
              "description": "Un objectif proposé par l’assistant, à confirmer avec goals_create"
            },
            {
              "type": "null"
            }
          ]
        },
        "input_tokens": {
          "anyOf": [
            {
              "type": "integer",
              "description": "Jetons d’entrée du modèle utilisés"
            },
            {
              "type": "null"
            }
          ]
        },
        "output_tokens": {
          "anyOf": [
            {
              "type": "integer",
              "description": "Jetons de sortie du modèle utilisés"
            },
            {
              "type": "null"
            }
          ]
        },
        "created_at": {
          "type": "string",
          "format": "date-time"
        }
      },
      "description": "Questions et réponses, les plus anciennes en premier"
    }
  }
}
POST /sites/:site_id/ask/:ask_conversation_id/messages.json Poser une question complémentaire dans une conversation (compte dans la limite mensuelle de questions IA). Renvoie la réponse. assistant_ask_followup

Permission : analytics.read

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/ask/:ask_conversation_id/messages.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "question": {
      "type": "string",
      "description": "Votre question en langage naturel",
      "examples": [
        "Which pages had the most visitors last week?"
      ]
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "ask_conversation_id": {
      "type": "string",
      "description": "Ask conversation de la ressource"
    }
  },
  "required": [
    "question",
    "site_id",
    "ask_conversation_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Identifiant du message dans la conversation"
    },
    "role": {
      "type": "string",
      "description": "user (la question) ou assistant (la réponse)"
    },
    "content": {
      "type": "string",
      "description": "La question, ou la réponse en Markdown"
    },
    "queries": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Comment j’y suis arrivé : les requêtes API exactes derrière la réponse, sous la forme [{tool, input, status, error}]"
    },
    "chart": {
      "anyOf": [
        {
          "type": "object",
          "description": "Graphique de la réponse : {type: line, labels, series, comparison, metric, format} ou {type: table, columns, rows}"
        },
        {
          "type": "null"
        }
      ]
    },
    "goal_draft": {
      "anyOf": [
        {
          "type": "object",
          "description": "Un objectif proposé par l’assistant, à confirmer avec goals_create"
        },
        {
          "type": "null"
        }
      ]
    },
    "input_tokens": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Jetons d’entrée du modèle utilisés"
        },
        {
          "type": "null"
        }
      ]
    },
    "output_tokens": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Jetons de sortie du modèle utilisés"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

Campagnes

POST /sites/:site_id/campaigns/costs.json Définir les dépenses d’une campagne pour un mois campaign_costs_create

Permission : content.write

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/campaigns/costs.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "campaign": {
      "type": "string",
      "description": "Valeur utm_campaign à laquelle la dépense se rapporte",
      "examples": [
        "spring_sale"
      ]
    },
    "month": {
      "type": "string",
      "description": "Mois, AAAA-MM",
      "examples": [
        "2026-09"
      ]
    },
    "amount": {
      "type": "number",
      "description": "Dépense en unités principales, par ex. 1250.50"
    },
    "currency": {
      "type": "string",
      "description": "Devise ISO 4217 (par défaut, la devise du site)"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "campaign",
    "month",
    "amount",
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Identifiant de l’entrée de coût"
    },
    "campaign": {
      "type": "string",
      "description": "Valeur utm_campaign"
    },
    "month": {
      "type": "string",
      "description": "Mois, AAAA-MM"
    },
    "amount_minor": {
      "type": "integer",
      "description": "Dépense en unités mineures"
    },
    "currency": {
      "type": "string",
      "description": "Devise ISO 4217 du montant"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /sites/:site_id/campaigns/costs/:id.json Supprimer une entrée de coût de campagne campaign_costs_delete

Permission : content.write

Exemple
curl -X DELETE https://privatusanalytics.com/sites/:site_id/campaigns/costs/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Identifiant de l’entrée de coût"
    },
    "campaign": {
      "type": "string",
      "description": "Valeur utm_campaign"
    },
    "month": {
      "type": "string",
      "description": "Mois, AAAA-MM"
    },
    "amount_minor": {
      "type": "integer",
      "description": "Dépense en unités mineures"
    },
    "currency": {
      "type": "string",
      "description": "Devise ISO 4217 du montant"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
POST /sites/:site_id/campaigns/costs/import.json Importer des coûts de campagne depuis un CSV (campaign,month,amount[,currency]) campaign_costs_import

Permission : content.write

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/campaigns/costs/import.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "file": {
      "type": "string",
      "format": "binary",
      "description": "Envoi de fichier CSV (formulaires multipart)"
    },
    "csv": {
      "type": "string",
      "description": "Texte CSV : campaign,month,amount[,currency]"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "imported": {
      "type": "integer",
      "description": "Lignes enregistrées"
    },
    "failed": {
      "type": "integer",
      "description": "Lignes ignorées"
    },
    "errors": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Motifs d’omission des lignes (50 premières)"
    }
  }
}
GET /sites/:site_id/campaigns/costs.json Lister les entrées de coût de campagne campaign_costs_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/campaigns/costs.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "campaign": {
      "type": "string",
      "description": "Uniquement cette campagne"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "format": "uuid",
        "description": "Identifiant de l’entrée de coût"
      },
      "campaign": {
        "type": "string",
        "description": "Valeur utm_campaign"
      },
      "month": {
        "type": "string",
        "description": "Mois, AAAA-MM"
      },
      "amount_minor": {
        "type": "integer",
        "description": "Dépense en unités mineures"
      },
      "currency": {
        "type": "string",
        "description": "Devise ISO 4217 du montant"
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      },
      "updated_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
PATCH /sites/:site_id/campaigns/costs/:id.json Modifier une entrée de coût de campagne campaign_costs_update

Permission : content.write

Exemple
curl -X PATCH https://privatusanalytics.com/sites/:site_id/campaigns/costs/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "campaign": {
      "type": "string",
      "description": "Valeur utm_campaign"
    },
    "month": {
      "type": "string",
      "description": "Mois, AAAA-MM"
    },
    "amount": {
      "type": "number",
      "description": "Dépense en unités principales"
    },
    "currency": {
      "type": "string",
      "description": "Devise ISO 4217"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Identifiant de l’entrée de coût"
    },
    "campaign": {
      "type": "string",
      "description": "Valeur utm_campaign"
    },
    "month": {
      "type": "string",
      "description": "Mois, AAAA-MM"
    },
    "amount_minor": {
      "type": "integer",
      "description": "Dépense en unités mineures"
    },
    "currency": {
      "type": "string",
      "description": "Devise ISO 4217 du montant"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /sites/:site_id/campaigns/builder.json Générer et valider une URL avec balises UTM campaigns_builder

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/campaigns/builder.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "destination": {
      "type": "string",
      "description": "URL de la page de destination (https://…)",
      "examples": [
        "https://example.com/pricing"
      ]
    },
    "preset": {
      "type": "string",
      "description": "Renseigner utm_source/utm_medium pour un canal lorsqu’ils sont vides",
      "enum": [
        "newsletter",
        "social",
        "paid_search",
        "paid_social",
        "print",
        "partner"
      ]
    },
    "utm_source": {
      "type": "string",
      "description": "Origine du trafic"
    },
    "utm_medium": {
      "type": "string",
      "description": "Support marketing, par ex. email, cpc"
    },
    "utm_campaign": {
      "type": "string",
      "description": "Nom de la campagne, par ex. spring_sale"
    },
    "utm_content": {
      "type": "string",
      "description": "Variante, par ex. header_button"
    },
    "utm_term": {
      "type": "string",
      "description": "Mot-clé de recherche payante"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "url": {
      "anyOf": [
        {
          "type": "string",
          "description": "URL balisée (null tant qu’il y a des erreurs)"
        },
        {
          "type": "null"
        }
      ]
    },
    "valid": {
      "type": "boolean",
      "description": "True lorsqu’il n’y a aucune erreur"
    },
    "destination": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "preset": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "utm_source": {
      "anyOf": [
        {
          "type": "string",
          "description": "utm_source normalisé"
        },
        {
          "type": "null"
        }
      ]
    },
    "utm_medium": {
      "anyOf": [
        {
          "type": "string",
          "description": "utm_medium normalisé"
        },
        {
          "type": "null"
        }
      ]
    },
    "utm_campaign": {
      "anyOf": [
        {
          "type": "string",
          "description": "utm_campaign normalisé"
        },
        {
          "type": "null"
        }
      ]
    },
    "utm_content": {
      "anyOf": [
        {
          "type": "string",
          "description": "utm_content normalisé"
        },
        {
          "type": "null"
        }
      ]
    },
    "utm_term": {
      "anyOf": [
        {
          "type": "string",
          "description": "utm_term normalisé"
        },
        {
          "type": "null"
        }
      ]
    },
    "issues": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "field, level (error ou warning) et message"
    },
    "presets": {
      "type": "object",
      "description": "Préréglages de canal : utm_source/utm_medium par préréglage"
    }
  }
}
GET /sites/:site_id/campaigns/hygiene.json Hygiène UTM : valeurs quasi identiques, problèmes de style et sources inconnues campaigns_hygiene

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/campaigns/hygiene.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "period": {
      "type": "string",
      "description": "Préréglage de plage de dates. Utilisez custom avec from/to",
      "enum": [
        "today",
        "yesterday",
        "24h",
        "7d",
        "14d",
        "28d",
        "30d",
        "90d",
        "mtd",
        "last_month",
        "qtd",
        "last_quarter",
        "ytd",
        "12mo",
        "last_year",
        "all",
        "custom"
      ],
      "default": "30d"
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "Début de la plage personnalisée (fuseau horaire du site)"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la plage personnalisée, incluse"
    },
    "compare": {
      "type": "string",
      "description": "Période de comparaison",
      "enum": [
        "none",
        "previous_period",
        "previous_year",
        "custom"
      ],
      "default": "none"
    },
    "compare_from": {
      "type": "string",
      "format": "date",
      "description": "Début de la comparaison personnalisée"
    },
    "compare_to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la comparaison personnalisée"
    },
    "match_weekday": {
      "type": "boolean",
      "description": "Aligner les jours de la semaine de la comparaison",
      "default": false
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres : [[\"dimension\",\"operator\",\"value\"], …]. Opérateurs : is, is_not, any_of, none_of, contains, not_contains, starts_with, regex, not_regex, gt, lt, between. Encadrez les conditions dans {\"any\": [...]} pour un OU.",
      "default": []
    },
    "segment_id": {
      "type": "string",
      "description": "Appliquer un segment enregistré (seg_…)"
    },
    "include_imported": {
      "type": "boolean",
      "description": "Ajouter les données historiques importées (dates antérieures au premier événement natif, ignorées lorsque des filtres ou un segment sont appliqués)",
      "default": false
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "period": {
      "type": "object",
      "description": "from/to de la période (UTC)"
    },
    "duplicates": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Valeurs quasi identiques : champ, suggestion et variantes [{value, visits}]"
    },
    "style_issues": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Valeurs qui ne sont pas en minuscules avec tirets bas : champ, valeur, visites, suggestion"
    },
    "unknown_sources": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Valeurs utm_source que nous ne reconnaissons pas : valeur, visites"
    }
  }
}
GET /sites/:site_id/campaigns.json Synthèse des campagnes avec conversions, revenus, coût, CPA et ROAS campaigns_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/campaigns.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "period": {
      "type": "string",
      "description": "Préréglage de plage de dates. Utilisez custom avec from/to",
      "enum": [
        "today",
        "yesterday",
        "24h",
        "7d",
        "14d",
        "28d",
        "30d",
        "90d",
        "mtd",
        "last_month",
        "qtd",
        "last_quarter",
        "ytd",
        "12mo",
        "last_year",
        "all",
        "custom"
      ],
      "default": "30d"
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "Début de la plage personnalisée (fuseau horaire du site)"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la plage personnalisée, incluse"
    },
    "compare": {
      "type": "string",
      "description": "Période de comparaison",
      "enum": [
        "none",
        "previous_period",
        "previous_year",
        "custom"
      ],
      "default": "none"
    },
    "compare_from": {
      "type": "string",
      "format": "date",
      "description": "Début de la comparaison personnalisée"
    },
    "compare_to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la comparaison personnalisée"
    },
    "match_weekday": {
      "type": "boolean",
      "description": "Aligner les jours de la semaine de la comparaison",
      "default": false
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres : [[\"dimension\",\"operator\",\"value\"], …]. Opérateurs : is, is_not, any_of, none_of, contains, not_contains, starts_with, regex, not_regex, gt, lt, between. Encadrez les conditions dans {\"any\": [...]} pour un OU.",
      "default": []
    },
    "segment_id": {
      "type": "string",
      "description": "Appliquer un segment enregistré (seg_…)"
    },
    "include_imported": {
      "type": "boolean",
      "description": "Ajouter les données historiques importées (dates antérieures au premier événement natif, ignorées lorsque des filtres ou un segment sont appliqués)",
      "default": false
    },
    "goal_id": {
      "type": "string",
      "description": "Objectif (goal_…) dont les conversions sont comptées. Par défaut, le premier objectif actif"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "period": {
      "type": "object",
      "description": "from/to de la période (UTC)"
    },
    "currency": {
      "type": "string",
      "description": "Devise du site pour les revenus et les coûts"
    },
    "goal_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Objectif compté comme conversion"
        },
        {
          "type": "null"
        }
      ]
    },
    "goal_name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "campaigns": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Par utm_campaign : visitors, visits, conversions, conversion_rate, revenue, cost, cpa (unités mineures), roas (revenu ÷ coût) et sources [{source, medium, visitors, visits, conversions, conversion_rate, revenue}]"
    },
    "totals": {
      "type": "object",
      "description": "Sommes sur toutes les campagnes listées"
    }
  }
}

Canaux de notification

POST /workspaces/:workspace_id/channels.json Ajouter un canal de notification notification_channels_create

Permission : content.write

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/channels.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "URL du webhook (slack, teams, discord, webhook), HTTPS"
    },
    "secret": {
      "type": "string",
      "description": "webhook : secret HMAC pour X-Privatus-Signature"
    },
    "emails": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "email : adresses des destinataires (20 maximum)"
    },
    "routing_key": {
      "type": "string",
      "description": "pagerduty : clé d’intégration Events API v2"
    },
    "api_key": {
      "type": "string",
      "description": "opsgenie : clé d’intégration API"
    },
    "region": {
      "type": "string",
      "description": "opsgenie : région du compte",
      "enum": [
        "us",
        "eu"
      ]
    },
    "kind": {
      "type": "string",
      "description": "email, slack, teams, discord, webhook, pagerduty, opsgenie ou push",
      "enum": [
        "email",
        "slack",
        "teams",
        "discord",
        "webhook",
        "pagerduty",
        "opsgenie",
        "push"
      ]
    },
    "name": {
      "type": "string",
      "description": "Nom d’affichage",
      "examples": [
        "#alerts"
      ]
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "kind",
    "name",
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de canal, par ex. nch_7Q2K9XH3AB"
    },
    "kind": {
      "type": "string",
      "description": "email, slack, teams, discord, webhook, pagerduty, opsgenie ou push"
    },
    "name": {
      "type": "string"
    },
    "target": {
      "type": "string",
      "description": "Destination masquée"
    },
    "last_used_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /channels/:id.json Supprimer un canal de notification notification_channels_delete

Permission : content.write

Exemple
curl -X DELETE https://privatusanalytics.com/channels/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de canal, par ex. nch_7Q2K9XH3AB"
    },
    "kind": {
      "type": "string",
      "description": "email, slack, teams, discord, webhook, pagerduty, opsgenie ou push"
    },
    "name": {
      "type": "string"
    },
    "target": {
      "type": "string",
      "description": "Destination masquée"
    },
    "last_used_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /workspaces/:workspace_id/channels.json Lister les canaux de notification notification_channels_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/channels.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "kind": {
      "type": "string",
      "description": "Uniquement les canaux de ce type",
      "enum": [
        "email",
        "slack",
        "teams",
        "discord",
        "webhook",
        "pagerduty",
        "opsgenie",
        "push"
      ]
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant de canal, par ex. nch_7Q2K9XH3AB"
      },
      "kind": {
        "type": "string",
        "description": "email, slack, teams, discord, webhook, pagerduty, opsgenie ou push"
      },
      "name": {
        "type": "string"
      },
      "target": {
        "type": "string",
        "description": "Destination masquée"
      },
      "last_used_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
POST /channels/:id/send_test.json Envoyer un message de test via un canal notification_channels_send_test

Permission : content.write

Exemple
curl -X POST https://privatusanalytics.com/channels/:id/send_test.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de canal, par ex. nch_7Q2K9XH3AB"
    },
    "kind": {
      "type": "string",
      "description": "email, slack, teams, discord, webhook, pagerduty, opsgenie ou push"
    },
    "name": {
      "type": "string"
    },
    "target": {
      "type": "string",
      "description": "Destination masquée"
    },
    "last_used_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /channels/:id.json Obtenir un canal de notification notification_channels_get

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/channels/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de canal, par ex. nch_7Q2K9XH3AB"
    },
    "kind": {
      "type": "string",
      "description": "email, slack, teams, discord, webhook, pagerduty, opsgenie ou push"
    },
    "name": {
      "type": "string"
    },
    "target": {
      "type": "string",
      "description": "Destination masquée"
    },
    "last_used_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
PATCH /channels/:id.json Mettre à jour un canal de notification notification_channels_update

Permission : content.write

Exemple
curl -X PATCH https://privatusanalytics.com/channels/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "URL du webhook (slack, teams, discord, webhook), HTTPS"
    },
    "secret": {
      "type": "string",
      "description": "webhook : secret HMAC pour X-Privatus-Signature"
    },
    "emails": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "email : adresses des destinataires (20 maximum)"
    },
    "routing_key": {
      "type": "string",
      "description": "pagerduty : clé d’intégration Events API v2"
    },
    "api_key": {
      "type": "string",
      "description": "opsgenie : clé d’intégration API"
    },
    "region": {
      "type": "string",
      "description": "opsgenie : région du compte",
      "enum": [
        "us",
        "eu"
      ]
    },
    "name": {
      "type": "string",
      "description": "Nom d’affichage"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de canal, par ex. nch_7Q2K9XH3AB"
    },
    "kind": {
      "type": "string",
      "description": "email, slack, teams, discord, webhook, pagerduty, opsgenie ou push"
    },
    "name": {
      "type": "string"
    },
    "target": {
      "type": "string",
      "description": "Destination masquée"
    },
    "last_used_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
POST /push_subscription.json Enregistrer un navigateur pour les notifications push push_subscriptions_create

Permission : member

Exemple
curl -X POST https://privatusanalytics.com/push_subscription.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "endpoint": {
      "type": "string",
      "description": "PushSubscription.endpoint du navigateur"
    },
    "p256dh": {
      "type": "string",
      "description": "PushSubscription keys.p256dh (base64url)"
    },
    "auth": {
      "type": "string",
      "description": "PushSubscription keys.auth (base64url)"
    }
  },
  "required": [
    "endpoint",
    "p256dh",
    "auth"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "endpoint_host": {
      "type": "string",
      "description": "Hôte du service push"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /push_subscription.json Supprimer l’enregistrement push d’un navigateur push_subscriptions_delete

Permission : member

Exemple
curl -X DELETE https://privatusanalytics.com/push_subscription.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "endpoint": {
      "type": "string",
      "description": "PushSubscription.endpoint à supprimer"
    }
  },
  "required": [
    "endpoint"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "endpoint_host": {
      "type": "string",
      "description": "Hôte du service push"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

Collecte

POST /api/logs.json Envoyer les journaux d’accès serveur pour le rapport sur les robots d’IA (JSON {lines: [...]} ou texte de journal combiné, avec la clé d’ingestion du site comme jeton Bearer) crawler_logs_create

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl -X POST https://privatusanalytics.com/api/logs.json \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "lines": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "ts": {
            "type": "string"
          },
          "path": {
            "type": "string",
            "default": "/"
          },
          "status": {
            "type": "integer"
          },
          "user_agent": {
            "type": "string",
            "default": ""
          }
        }
      },
      "description": "Lignes de journal : [{ts, path, status, user_agent}] (1000 maximum)"
    }
  },
  "required": [
    "lines"
  ]
}
Données de réponse
{
  "type": "object"
}
POST /api/event.json Collecter un hit du navigateur (utilisé par /js/pa.js) ingest_event

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl -X POST https://privatusanalytics.com/api/event.json \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site": {
      "type": "string",
      "description": "Identifiant du site (pa_…)"
    },
    "type": {
      "type": "string",
      "description": "Type de hit",
      "enum": [
        "pageview",
        "event",
        "engagement",
        "vital",
        "click"
      ]
    },
    "url": {
      "type": "string",
      "description": "URL complète de la page"
    },
    "referrer": {
      "type": "string",
      "description": "document.referrer"
    },
    "name": {
      "type": "string",
      "description": "Nom de l’événement (type=event) ou nom du vital"
    },
    "props": {
      "type": "object",
      "additionalProperties": true,
      "description": "Propriétés de l’événement : jusqu’à 30 valeurs chaîne/nombre/booléen",
      "default": {}
    },
    "screen_width": {
      "type": "integer",
      "description": "Largeur de l’écran en pixels"
    },
    "language": {
      "type": "string",
      "description": "navigator.language"
    },
    "engaged_ms": {
      "type": "integer",
      "description": "Temps visible sur la page (engagement)"
    },
    "scroll_depth": {
      "type": "integer",
      "description": "Profondeur de défilement maximale en % (engagement)"
    },
    "value": {
      "type": "number",
      "description": "Valeur du Web Vital (type=vital)"
    },
    "selector": {
      "type": "string",
      "description": "Sélecteur de l’élément cliqué (type=click)"
    },
    "hash_mode": {
      "type": "boolean",
      "description": "Conserver le",
      "default": false
    },
    "dnt": {
      "type": "boolean",
      "description": "Do Not Track est activé",
      "default": false
    },
    "gpc": {
      "type": "boolean",
      "description": "Global Privacy Control est activé",
      "default": false
    },
    "interacted": {
      "type": "boolean",
      "description": "1 si une saisie fiable (pointeur, touche, toucher ou molette) a été détectée sur la page, 0 sinon. Aucune coordonnée ni mesure de temps"
    },
    "revenue": {
      "type": "number",
      "description": "Revenu en unités principales, par ex. 49.99"
    },
    "currency": {
      "type": "string",
      "description": "Devise ISO 4217 du revenu"
    }
  },
  "required": [
    "site",
    "type",
    "url"
  ]
}
Données de réponse
{
  "type": "object"
}
POST /api/events.json Collecter des événements côté serveur avec une clé d’ingestion de site ingest_events

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl -X POST https://privatusanalytics.com/api/events.json \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "events": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      },
      "description": "Jusqu’à 100 événements"
    }
  },
  "required": [
    "events"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /api/pixel.json Collecter une page vue sans JavaScript (GIF 1×1) ingest_pixel

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl https://privatusanalytics.com/api/pixel.json
Entrées
{
  "type": "object",
  "properties": {},
  "required": []
}
Données de réponse
{
  "type": "object"
}

Compte

GET /account.json Obtenir votre profil et vos préférences account_get

Permission : member

Exemple
curl https://privatusanalytics.com/account.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {},
  "required": []
}
Données de réponse
{
  "type": "object",
  "properties": {
    "email": {
      "type": "string"
    },
    "unconfirmed_email": {
      "anyOf": [
        {
          "type": "string",
          "description": "Nouvelle adresse e-mail en attente de confirmation"
        },
        {
          "type": "null"
        }
      ]
    },
    "name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "theme": {
      "type": "string"
    },
    "default_landing": {
      "type": "string"
    },
    "locale": {
      "type": "string",
      "description": "Code de langue de l’application pour ce compte (en par défaut)"
    },
    "timezone": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "shortcuts_enabled": {
      "type": "boolean"
    },
    "reduce_motion": {
      "type": "boolean"
    },
    "product_emails": {
      "type": "boolean"
    },
    "marketing_emails": {
      "type": "boolean",
      "description": "Indique si des e-mails marketing (campagnes échelonnées) peuvent être envoyés. false après un désabonnement"
    },
    "newsletter": {
      "type": "boolean"
    },
    "two_factor": {
      "type": "boolean"
    },
    "passkeys": {
      "type": "integer"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
PATCH /account.json Mettre à jour votre profil et vos préférences account_update

Permission : member

Exemple
curl -X PATCH https://privatusanalytics.com/account.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Votre nom"
    },
    "email": {
      "type": "string",
      "description": "Nouvelle adresse e-mail (d’abord confirmée par e-mail)"
    },
    "theme": {
      "type": "string",
      "description": "Thème de couleurs",
      "enum": [
        "system",
        "light",
        "dark"
      ]
    },
    "default_landing": {
      "type": "string",
      "description": "Page après connexion : sites ou last_site",
      "enum": [
        "sites",
        "last_site"
      ]
    },
    "locale": {
      "type": "string",
      "description": "Langue de l’application lorsque vous êtes connecté, sous forme de code de langue (en, de, fr, etc.). Les pages publiques et l’API restent inchangées",
      "enum": [
        "en",
        "de",
        "es",
        "fr",
        "it",
        "nl",
        "pt",
        "pl",
        "sv",
        "da",
        "no",
        "fi",
        "ja",
        "ko",
        "zh-CN",
        "zh-TW"
      ]
    },
    "timezone": {
      "type": "string",
      "description": "Votre fuseau horaire (nom IANA)"
    },
    "shortcuts_enabled": {
      "type": "boolean",
      "description": "Raccourcis clavier"
    },
    "reduce_motion": {
      "type": "boolean",
      "description": "Réduire les animations"
    },
    "product_emails": {
      "type": "boolean",
      "description": "E-mails de mises à jour et conseils sur le produit"
    },
    "marketing_emails": {
      "type": "boolean",
      "description": "E-mails marketing comme les conseils de prise en main. Les réactiver après un désabonnement nécessite un navigateur connecté"
    },
    "newsletter": {
      "type": "boolean",
      "description": "Newsletter mensuelle"
    }
  },
  "required": []
}
Données de réponse
{
  "type": "object",
  "properties": {
    "email": {
      "type": "string"
    },
    "unconfirmed_email": {
      "anyOf": [
        {
          "type": "string",
          "description": "Nouvelle adresse e-mail en attente de confirmation"
        },
        {
          "type": "null"
        }
      ]
    },
    "name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "theme": {
      "type": "string"
    },
    "default_landing": {
      "type": "string"
    },
    "locale": {
      "type": "string",
      "description": "Code de langue de l’application pour ce compte (en par défaut)"
    },
    "timezone": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "shortcuts_enabled": {
      "type": "boolean"
    },
    "reduce_motion": {
      "type": "boolean"
    },
    "product_emails": {
      "type": "boolean"
    },
    "marketing_emails": {
      "type": "boolean",
      "description": "Indique si des e-mails marketing (campagnes échelonnées) peuvent être envoyés. false après un désabonnement"
    },
    "newsletter": {
      "type": "boolean"
    },
    "two_factor": {
      "type": "boolean"
    },
    "passkeys": {
      "type": "integer"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

Disponibilité

POST /sites/:site_id/uptime.json Ajouter une vérification de disponibilité pour un site uptime_checks_create

Permission : uptime.manage

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/uptime.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nom d’affichage (par défaut, la cible)"
    },
    "kind": {
      "type": "string",
      "description": "http (code de statut), keyword (le corps contient), tcp (hôte:port) ou dns (le nom se résout)",
      "enum": [
        "http",
        "keyword",
        "tcp",
        "dns"
      ],
      "default": "http"
    },
    "url": {
      "type": "string",
      "description": "URL pour les vérifications http/keyword",
      "examples": [
        "https://example.com/health"
      ]
    },
    "host": {
      "type": "string",
      "description": "Nom d’hôte pour les vérifications tcp/dns"
    },
    "port": {
      "type": "integer",
      "description": "Port TCP pour les vérifications tcp"
    },
    "keyword": {
      "type": "string",
      "description": "Texte que le corps de la réponse doit contenir (keyword)"
    },
    "expected_status": {
      "type": "integer",
      "description": "Code de statut HTTP attendu",
      "default": 200
    },
    "http_method": {
      "type": "string",
      "description": "Méthode HTTP",
      "enum": [
        "GET",
        "HEAD"
      ],
      "default": "GET"
    },
    "interval_seconds": {
      "type": "integer",
      "description": "Secondes entre les vérifications (le minimum du forfait s’applique, 300 par défaut ou le minimum)"
    },
    "timeout_seconds": {
      "type": "integer",
      "description": "Secondes avant l’expiration d’une sonde (1-30)",
      "default": 20
    },
    "public": {
      "type": "boolean",
      "description": "Peut apparaître sur les pages d’état publiques",
      "default": false
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de vérification (upc_…)"
    },
    "workspace_id": {
      "type": "string"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Site auquel appartient la vérification"
        },
        {
          "type": "null"
        }
      ]
    },
    "name": {
      "type": "string"
    },
    "kind": {
      "type": "string",
      "description": "http, keyword, tcp ou dns"
    },
    "url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "host": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "port": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "keyword": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "expected_status": {
      "type": "integer"
    },
    "http_method": {
      "type": "string"
    },
    "interval_seconds": {
      "type": "integer"
    },
    "timeout_seconds": {
      "type": "integer"
    },
    "status": {
      "type": "string",
      "description": "up, down, pending ou paused"
    },
    "enabled": {
      "type": "boolean"
    },
    "public": {
      "type": "boolean",
      "description": "Peut apparaître sur les pages d’état"
    },
    "last_checked_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "next_check_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_response_ms": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "ssl_expires_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "ssl_issuer": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "domain_expires_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /uptime/checks/:id.json Supprimer une vérification de disponibilité et son historique uptime_checks_delete

Permission : uptime.manage

Exemple
curl -X DELETE https://privatusanalytics.com/uptime/checks/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de vérification (upc_…)"
    },
    "workspace_id": {
      "type": "string"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Site auquel appartient la vérification"
        },
        {
          "type": "null"
        }
      ]
    },
    "name": {
      "type": "string"
    },
    "kind": {
      "type": "string",
      "description": "http, keyword, tcp ou dns"
    },
    "url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "host": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "port": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "keyword": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "expected_status": {
      "type": "integer"
    },
    "http_method": {
      "type": "string"
    },
    "interval_seconds": {
      "type": "integer"
    },
    "timeout_seconds": {
      "type": "integer"
    },
    "status": {
      "type": "string",
      "description": "up, down, pending ou paused"
    },
    "enabled": {
      "type": "boolean"
    },
    "public": {
      "type": "boolean",
      "description": "Peut apparaître sur les pages d’état"
    },
    "last_checked_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "next_check_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_response_ms": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "ssl_expires_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "ssl_issuer": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "domain_expires_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /sites/:site_id/uptime.json Lister les vérifications de disponibilité d’un site uptime_checks_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/uptime.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "description": "Uniquement les vérifications dans cet état",
      "enum": [
        "up",
        "down",
        "pending",
        "paused"
      ]
    },
    "query": {
      "type": "string",
      "description": "Filtrer par nom ou cible"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant de vérification (upc_…)"
      },
      "workspace_id": {
        "type": "string"
      },
      "site_id": {
        "anyOf": [
          {
            "type": "string",
            "description": "Site auquel appartient la vérification"
          },
          {
            "type": "null"
          }
        ]
      },
      "name": {
        "type": "string"
      },
      "kind": {
        "type": "string",
        "description": "http, keyword, tcp ou dns"
      },
      "url": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "host": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "port": {
        "anyOf": [
          {
            "type": "integer"
          },
          {
            "type": "null"
          }
        ]
      },
      "keyword": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "expected_status": {
        "type": "integer"
      },
      "http_method": {
        "type": "string"
      },
      "interval_seconds": {
        "type": "integer"
      },
      "timeout_seconds": {
        "type": "integer"
      },
      "status": {
        "type": "string",
        "description": "up, down, pending ou paused"
      },
      "enabled": {
        "type": "boolean"
      },
      "public": {
        "type": "boolean",
        "description": "Peut apparaître sur les pages d’état"
      },
      "last_checked_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "next_check_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "last_response_ms": {
        "anyOf": [
          {
            "type": "integer"
          },
          {
            "type": "null"
          }
        ]
      },
      "ssl_expires_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "ssl_issuer": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "domain_expires_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
POST /uptime/checks/:id/pause.json Mettre en pause une vérification de disponibilité uptime_checks_pause

Permission : uptime.manage

Exemple
curl -X POST https://privatusanalytics.com/uptime/checks/:id/pause.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de vérification (upc_…)"
    },
    "workspace_id": {
      "type": "string"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Site auquel appartient la vérification"
        },
        {
          "type": "null"
        }
      ]
    },
    "name": {
      "type": "string"
    },
    "kind": {
      "type": "string",
      "description": "http, keyword, tcp ou dns"
    },
    "url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "host": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "port": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "keyword": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "expected_status": {
      "type": "integer"
    },
    "http_method": {
      "type": "string"
    },
    "interval_seconds": {
      "type": "integer"
    },
    "timeout_seconds": {
      "type": "integer"
    },
    "status": {
      "type": "string",
      "description": "up, down, pending ou paused"
    },
    "enabled": {
      "type": "boolean"
    },
    "public": {
      "type": "boolean",
      "description": "Peut apparaître sur les pages d’état"
    },
    "last_checked_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "next_check_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_response_ms": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "ssl_expires_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "ssl_issuer": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "domain_expires_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
POST /uptime/checks/:id/resume.json Reprendre une vérification de disponibilité en pause uptime_checks_resume

Permission : uptime.manage

Exemple
curl -X POST https://privatusanalytics.com/uptime/checks/:id/resume.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de vérification (upc_…)"
    },
    "workspace_id": {
      "type": "string"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Site auquel appartient la vérification"
        },
        {
          "type": "null"
        }
      ]
    },
    "name": {
      "type": "string"
    },
    "kind": {
      "type": "string",
      "description": "http, keyword, tcp ou dns"
    },
    "url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "host": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "port": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "keyword": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "expected_status": {
      "type": "integer"
    },
    "http_method": {
      "type": "string"
    },
    "interval_seconds": {
      "type": "integer"
    },
    "timeout_seconds": {
      "type": "integer"
    },
    "status": {
      "type": "string",
      "description": "up, down, pending ou paused"
    },
    "enabled": {
      "type": "boolean"
    },
    "public": {
      "type": "boolean",
      "description": "Peut apparaître sur les pages d’état"
    },
    "last_checked_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "next_check_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_response_ms": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "ssl_expires_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "ssl_issuer": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "domain_expires_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /uptime/checks/:id.json Obtenir une vérification de disponibilité : disponibilité 24 h/7 j/30 j, temps de réponse et incidents uptime_checks_get

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/uptime/checks/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "range": {
      "type": "string",
      "description": "Fenêtre du graphique des temps de réponse",
      "enum": [
        "24h",
        "7d",
        "30d"
      ],
      "default": "24h"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "check": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "description": "Identifiant de vérification (upc_…)"
        },
        "workspace_id": {
          "type": "string"
        },
        "site_id": {
          "anyOf": [
            {
              "type": "string",
              "description": "Site auquel appartient la vérification"
            },
            {
              "type": "null"
            }
          ]
        },
        "name": {
          "type": "string"
        },
        "kind": {
          "type": "string",
          "description": "http, keyword, tcp ou dns"
        },
        "url": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "host": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "port": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ]
        },
        "keyword": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "expected_status": {
          "type": "integer"
        },
        "http_method": {
          "type": "string"
        },
        "interval_seconds": {
          "type": "integer"
        },
        "timeout_seconds": {
          "type": "integer"
        },
        "status": {
          "type": "string",
          "description": "up, down, pending ou paused"
        },
        "enabled": {
          "type": "boolean"
        },
        "public": {
          "type": "boolean",
          "description": "Peut apparaître sur les pages d’état"
        },
        "last_checked_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time"
            },
            {
              "type": "null"
            }
          ]
        },
        "next_check_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time"
            },
            {
              "type": "null"
            }
          ]
        },
        "last_response_ms": {
          "anyOf": [
            {
              "type": "integer"
            },
            {
              "type": "null"
            }
          ]
        },
        "ssl_expires_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time"
            },
            {
              "type": "null"
            }
          ]
        },
        "ssl_issuer": {
          "anyOf": [
            {
              "type": "string"
            },
            {
              "type": "null"
            }
          ]
        },
        "domain_expires_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time"
            },
            {
              "type": "null"
            }
          ]
        },
        "created_at": {
          "type": "string",
          "format": "date-time"
        }
      }
    },
    "uptime": {
      "type": "object",
      "description": "% de disponibilité sur 24 h, 7 j et 30 j"
    },
    "range": {
      "type": "string",
      "description": "Fenêtre de response_times"
    },
    "response_times": {
      "type": "object",
      "description": "Temps de réponse moyen en ms par intervalle : {unit, labels, series: {location: [ms…]}}"
    },
    "incidents": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "started_at": {
            "type": "string",
            "format": "date-time"
          },
          "resolved_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time"
              },
              {
                "type": "null"
              }
            ]
          },
          "duration_seconds": {
            "type": "integer",
            "description": "Jusqu’ici, s’il est encore ouvert"
          },
          "cause": {
            "anyOf": [
              {
                "type": "string",
                "description": "Erreur la plus fréquente, par ex. timeout ou status_503"
              },
              {
                "type": "null"
              }
            ]
          },
          "failed_locations": {
            "type": "array",
            "items": {
              "type": "string"
            }
          }
        }
      }
    }
  }
}
PATCH /uptime/checks/:id.json Modifier une vérification de disponibilité uptime_checks_update

Permission : uptime.manage

Exemple
curl -X PATCH https://privatusanalytics.com/uptime/checks/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nom d’affichage (par défaut, la cible)"
    },
    "kind": {
      "type": "string",
      "description": "http (code de statut), keyword (le corps contient), tcp (hôte:port) ou dns (le nom se résout)",
      "enum": [
        "http",
        "keyword",
        "tcp",
        "dns"
      ]
    },
    "url": {
      "type": "string",
      "description": "URL pour les vérifications http/keyword",
      "examples": [
        "https://example.com/health"
      ]
    },
    "host": {
      "type": "string",
      "description": "Nom d’hôte pour les vérifications tcp/dns"
    },
    "port": {
      "type": "integer",
      "description": "Port TCP pour les vérifications tcp"
    },
    "keyword": {
      "type": "string",
      "description": "Texte que le corps de la réponse doit contenir (keyword)"
    },
    "expected_status": {
      "type": "integer",
      "description": "Code de statut HTTP attendu"
    },
    "http_method": {
      "type": "string",
      "description": "Méthode HTTP",
      "enum": [
        "GET",
        "HEAD"
      ]
    },
    "interval_seconds": {
      "type": "integer",
      "description": "Secondes entre les vérifications (le minimum du forfait s’applique, 300 par défaut ou le minimum)"
    },
    "timeout_seconds": {
      "type": "integer",
      "description": "Secondes avant l’expiration d’une sonde (1-30)"
    },
    "public": {
      "type": "boolean",
      "description": "Peut apparaître sur les pages d’état publiques"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de vérification (upc_…)"
    },
    "workspace_id": {
      "type": "string"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Site auquel appartient la vérification"
        },
        {
          "type": "null"
        }
      ]
    },
    "name": {
      "type": "string"
    },
    "kind": {
      "type": "string",
      "description": "http, keyword, tcp ou dns"
    },
    "url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "host": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "port": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "keyword": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "expected_status": {
      "type": "integer"
    },
    "http_method": {
      "type": "string"
    },
    "interval_seconds": {
      "type": "integer"
    },
    "timeout_seconds": {
      "type": "integer"
    },
    "status": {
      "type": "string",
      "description": "up, down, pending ou paused"
    },
    "enabled": {
      "type": "boolean"
    },
    "public": {
      "type": "boolean",
      "description": "Peut apparaître sur les pages d’état"
    },
    "last_checked_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "next_check_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_response_ms": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "ssl_expires_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "ssl_issuer": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "domain_expires_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /uptime/probes.json Centre de données des sondes, User-Agent et plages d’IP de sortie (pour autoriser nos sondes de disponibilité) uptime_probes_list

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl https://privatusanalytics.com/uptime/probes.json
Entrées
{
  "type": "object",
  "properties": {},
  "required": []
}
Données de réponse
{
  "type": "object"
}
POST /uptime/probes/results.json Envoyer les résultats d’un agent de sonde externe (jeton Bearer de sonde de disponibilité) uptime_probes_results

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl -X POST https://privatusanalytics.com/uptime/probes/results.json \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "results": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "check_id": {
            "type": "string"
          },
          "location": {
            "type": "string"
          },
          "ok": {
            "type": "boolean"
          },
          "status_code": {
            "type": "integer"
          },
          "response_ms": {
            "type": "integer"
          },
          "error": {
            "type": "string"
          },
          "checked_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      },
      "description": "Résultats des sondes : [{check_id, location, ok, status_code, response_ms, error, checked_at}]"
    }
  },
  "required": [
    "results"
  ]
}
Données de réponse
{
  "type": "object"
}
POST /workspaces/:workspace_id/uptime.json Ajouter une vérification de disponibilité d’espace de travail (non liée à un site) workspace_uptime_checks_create

Permission : uptime.manage

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/uptime.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nom d’affichage (par défaut, la cible)"
    },
    "kind": {
      "type": "string",
      "description": "http (code de statut), keyword (le corps contient), tcp (hôte:port) ou dns (le nom se résout)",
      "enum": [
        "http",
        "keyword",
        "tcp",
        "dns"
      ],
      "default": "http"
    },
    "url": {
      "type": "string",
      "description": "URL pour les vérifications http/keyword",
      "examples": [
        "https://example.com/health"
      ]
    },
    "host": {
      "type": "string",
      "description": "Nom d’hôte pour les vérifications tcp/dns"
    },
    "port": {
      "type": "integer",
      "description": "Port TCP pour les vérifications tcp"
    },
    "keyword": {
      "type": "string",
      "description": "Texte que le corps de la réponse doit contenir (keyword)"
    },
    "expected_status": {
      "type": "integer",
      "description": "Code de statut HTTP attendu",
      "default": 200
    },
    "http_method": {
      "type": "string",
      "description": "Méthode HTTP",
      "enum": [
        "GET",
        "HEAD"
      ],
      "default": "GET"
    },
    "interval_seconds": {
      "type": "integer",
      "description": "Secondes entre les vérifications (le minimum du forfait s’applique, 300 par défaut ou le minimum)"
    },
    "timeout_seconds": {
      "type": "integer",
      "description": "Secondes avant l’expiration d’une sonde (1-30)",
      "default": 20
    },
    "public": {
      "type": "boolean",
      "description": "Peut apparaître sur les pages d’état publiques",
      "default": false
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de vérification (upc_…)"
    },
    "workspace_id": {
      "type": "string"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Site auquel appartient la vérification"
        },
        {
          "type": "null"
        }
      ]
    },
    "name": {
      "type": "string"
    },
    "kind": {
      "type": "string",
      "description": "http, keyword, tcp ou dns"
    },
    "url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "host": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "port": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "keyword": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "expected_status": {
      "type": "integer"
    },
    "http_method": {
      "type": "string"
    },
    "interval_seconds": {
      "type": "integer"
    },
    "timeout_seconds": {
      "type": "integer"
    },
    "status": {
      "type": "string",
      "description": "up, down, pending ou paused"
    },
    "enabled": {
      "type": "boolean"
    },
    "public": {
      "type": "boolean",
      "description": "Peut apparaître sur les pages d’état"
    },
    "last_checked_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "next_check_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_response_ms": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "ssl_expires_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "ssl_issuer": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "domain_expires_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /workspaces/:workspace_id/uptime.json Lister toutes les vérifications de disponibilité d’un espace de travail workspace_uptime_checks_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/uptime.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "description": "Uniquement les vérifications dans cet état",
      "enum": [
        "up",
        "down",
        "pending",
        "paused"
      ]
    },
    "query": {
      "type": "string",
      "description": "Filtrer par nom ou cible"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant de vérification (upc_…)"
      },
      "workspace_id": {
        "type": "string"
      },
      "site_id": {
        "anyOf": [
          {
            "type": "string",
            "description": "Site auquel appartient la vérification"
          },
          {
            "type": "null"
          }
        ]
      },
      "name": {
        "type": "string"
      },
      "kind": {
        "type": "string",
        "description": "http, keyword, tcp ou dns"
      },
      "url": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "host": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "port": {
        "anyOf": [
          {
            "type": "integer"
          },
          {
            "type": "null"
          }
        ]
      },
      "keyword": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "expected_status": {
        "type": "integer"
      },
      "http_method": {
        "type": "string"
      },
      "interval_seconds": {
        "type": "integer"
      },
      "timeout_seconds": {
        "type": "integer"
      },
      "status": {
        "type": "string",
        "description": "up, down, pending ou paused"
      },
      "enabled": {
        "type": "boolean"
      },
      "public": {
        "type": "boolean",
        "description": "Peut apparaître sur les pages d’état"
      },
      "last_checked_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "next_check_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "last_response_ms": {
        "anyOf": [
          {
            "type": "integer"
          },
          {
            "type": "null"
          }
        ]
      },
      "ssl_expires_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "ssl_issuer": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "domain_expires_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}

Documentation

GET /docs/api.json Lister toutes les opérations de l’API et tous les outils MCP docs_api

Permission : public

Exemple
curl https://privatusanalytics.com/docs/api.json
Entrées
{
  "type": "object",
  "properties": {
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": []
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "tool_name": {
        "type": "string",
        "description": "Nom de l’outil MCP et operationId OpenAPI"
      },
      "summary": {
        "type": "string"
      },
      "description": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "group": {
        "type": "string"
      },
      "verb": {
        "type": "string",
        "description": "Méthode HTTP"
      },
      "path": {
        "type": "string",
        "description": "Modèle de chemin. Ajoutez .json pour du JSON"
      },
      "permission": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "input_schema": {
        "type": "object",
        "description": "Schéma JSON des entrées"
      },
      "response_schema": {
        "type": "object",
        "description": "Schéma JSON de `data`"
      }
    }
  }
}
GET /docs.json Lister les pages de documentation docs_list

Permission : public

Exemple
curl https://privatusanalytics.com/docs.json
Entrées
{
  "type": "object",
  "properties": {
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": []
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "title": {
        "type": "string",
        "description": "Titre de la page"
      },
      "description": {
        "type": "string",
        "description": "Résumé en une ligne"
      },
      "path": {
        "type": "string",
        "description": "Chemin de la page. Ajoutez .md pour Markdown ou .json pour JSON"
      },
      "section": {
        "type": "string",
        "description": "Slug de la section, par ex. tracker"
      }
    }
  }
}
GET /openapi.json Document OpenAPI 3.1 de toute l’API docs_openapi

Permission : public

Exemple
curl https://privatusanalytics.com/openapi.json
Entrées
{
  "type": "object",
  "properties": {},
  "required": []
}
Données de réponse
{
  "type": "object"
}
GET /docs/:section/:page.json Lire une page de documentation (Markdown et HTML) docs_get

section et page proviennent du chemin de la page /docs/<section>/<page>. Utilisez la page "index" pour un aperçu de la section.

Permission : public

Exemple
curl https://privatusanalytics.com/docs/:section/:page.json
Entrées
{
  "type": "object",
  "properties": {
    "section": {
      "type": "string",
      "description": "Section de la ressource"
    },
    "page": {
      "type": "string",
      "description": "Page de la ressource"
    }
  },
  "required": [
    "section",
    "page"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "title": {
      "type": "string",
      "description": "Titre de la page"
    },
    "description": {
      "type": "string",
      "description": "Résumé en une ligne"
    },
    "path": {
      "type": "string",
      "description": "Chemin de la page. Ajoutez .md pour Markdown ou .json pour JSON"
    },
    "section": {
      "type": "string",
      "description": "Slug de la section, par ex. tracker"
    },
    "headings": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Sections de la page (id et texte)"
    },
    "full_markdown": {
      "type": "string",
      "description": "La page en Markdown (titre inclus)"
    },
    "html": {
      "type": "string",
      "description": "Le corps de la page rendu en HTML"
    }
  }
}

En direct

GET /sites/:site_id/live.json Visiteurs en direct, flux d’activité et ce qui est populaire en ce moment (30 dernières minutes) live_get

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/live.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "feed": {
      "type": "string",
      "description": "Flux d’activité : tous les hits, pages vues ou événements personnalisés",
      "enum": [
        "all",
        "pageviews",
        "events"
      ],
      "default": "all"
    },
    "limit": {
      "type": "integer",
      "description": "Entrées du flux d’activité (100 maximum)",
      "default": 50
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /sites/:site_id/live/wallboard.json Cartes d’écran d’affichage (en direct et aujourd’hui) pour un ou plusieurs sites live_wallboard

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/live/wallboard.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des sites à faire défiler (par défaut ce site)",
      "default": []
    },
    "rotate_seconds": {
      "type": "integer",
      "description": "Secondes pendant lesquelles chaque site reste affiché (5-300)",
      "default": 20
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /wallboard/:token.json Écran d’affichage pour un jeton d’écran (aucune connexion requise) live_public_wallboard

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl https://privatusanalytics.com/wallboard/:token.json
Entrées
{
  "type": "object",
  "properties": {
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des sites à faire défiler (par défaut ce site)",
      "default": []
    },
    "rotate_seconds": {
      "type": "integer",
      "description": "Secondes pendant lesquelles chaque site reste affiché (5-300)",
      "default": 20
    },
    "token": {
      "type": "string",
      "description": "Token de la ressource"
    }
  },
  "required": [
    "token"
  ]
}
Données de réponse
{
  "type": "object"
}

Entonnoirs

POST /sites/:site_id/funnels.json Créer un entonnoir funnels_create

Permission : content.write

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/funnels.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nom de l’entonnoir",
      "examples": [
        "Signup flow"
      ]
    },
    "steps": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      },
      "description": "Étapes ordonnées (2 jusqu’à la limite de votre forfait) : [{\"type\": \"page|event|goal\", \"value\": \"/pricing | Signup | goal_…\", \"match\": \"exact|prefix|glob|regex\" (étapes page), \"name\": \"optional label\"}]"
    },
    "order_mode": {
      "type": "string",
      "description": "strict : étapes dans cet ordre, any : dans n’importe quel ordre",
      "enum": [
        "strict",
        "any"
      ],
      "default": "strict"
    },
    "window": {
      "type": "string",
      "description": "Fenêtre de conversion : visit, ou day (mesurée au sein d’une visite, qui ne couvre jamais un jour UTC)",
      "enum": [
        "visit",
        "day"
      ],
      "default": "visit"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "name",
    "steps",
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’entonnoir, par ex. fun_7Q2K9XH3AB"
    },
    "name": {
      "type": "string"
    },
    "steps": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Étapes : {type: page|event|goal, value, match, name}"
    },
    "order_mode": {
      "type": "string",
      "description": "strict ou any"
    },
    "window": {
      "type": "string",
      "description": "visit ou day"
    },
    "stats": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "entered": {
              "type": "integer",
              "description": "Visites ayant atteint l’étape 1"
            },
            "completed": {
              "type": "integer",
              "description": "Visites ayant atteint la dernière étape"
            },
            "conversion_rate": {
              "type": "number",
              "description": "Terminées ÷ entrées, %"
            }
          },
          "description": "Statistiques de la période (liste uniquement)"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /sites/:site_id/funnels/:id.json Supprimer un entonnoir funnels_delete

Permission : content.write

Exemple
curl -X DELETE https://privatusanalytics.com/sites/:site_id/funnels/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’entonnoir, par ex. fun_7Q2K9XH3AB"
    },
    "name": {
      "type": "string"
    },
    "steps": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Étapes : {type: page|event|goal, value, match, name}"
    },
    "order_mode": {
      "type": "string",
      "description": "strict ou any"
    },
    "window": {
      "type": "string",
      "description": "visit ou day"
    },
    "stats": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "entered": {
              "type": "integer",
              "description": "Visites ayant atteint l’étape 1"
            },
            "completed": {
              "type": "integer",
              "description": "Visites ayant atteint la dernière étape"
            },
            "conversion_rate": {
              "type": "number",
              "description": "Terminées ÷ entrées, %"
            }
          },
          "description": "Statistiques de la période (liste uniquement)"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /sites/:site_id/funnels.json Lister les entonnoirs avec entrées, réalisations et taux funnels_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/funnels.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "period": {
      "type": "string",
      "description": "Préréglage de plage de dates. Utilisez custom avec from/to",
      "enum": [
        "today",
        "yesterday",
        "24h",
        "7d",
        "14d",
        "28d",
        "30d",
        "90d",
        "mtd",
        "last_month",
        "qtd",
        "last_quarter",
        "ytd",
        "12mo",
        "last_year",
        "all",
        "custom"
      ],
      "default": "30d"
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "Début de la plage personnalisée (fuseau horaire du site)"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la plage personnalisée, incluse"
    },
    "compare": {
      "type": "string",
      "description": "Période de comparaison",
      "enum": [
        "none",
        "previous_period",
        "previous_year",
        "custom"
      ],
      "default": "none"
    },
    "compare_from": {
      "type": "string",
      "format": "date",
      "description": "Début de la comparaison personnalisée"
    },
    "compare_to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la comparaison personnalisée"
    },
    "match_weekday": {
      "type": "boolean",
      "description": "Aligner les jours de la semaine de la comparaison",
      "default": false
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres : [[\"dimension\",\"operator\",\"value\"], …]. Opérateurs : is, is_not, any_of, none_of, contains, not_contains, starts_with, regex, not_regex, gt, lt, between. Encadrez les conditions dans {\"any\": [...]} pour un OU.",
      "default": []
    },
    "segment_id": {
      "type": "string",
      "description": "Appliquer un segment enregistré (seg_…)"
    },
    "include_imported": {
      "type": "boolean",
      "description": "Ajouter les données historiques importées (dates antérieures au premier événement natif, ignorées lorsque des filtres ou un segment sont appliqués)",
      "default": false
    },
    "page": {
      "type": "integer",
      "description": "Numéro de page",
      "default": 1
    },
    "per_page": {
      "type": "integer",
      "description": "Entonnoirs par page (100 maximum)",
      "default": 25
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant d’entonnoir, par ex. fun_7Q2K9XH3AB"
      },
      "name": {
        "type": "string"
      },
      "steps": {
        "type": "array",
        "items": {
          "type": "object"
        },
        "description": "Étapes : {type: page|event|goal, value, match, name}"
      },
      "order_mode": {
        "type": "string",
        "description": "strict ou any"
      },
      "window": {
        "type": "string",
        "description": "visit ou day"
      },
      "stats": {
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "entered": {
                "type": "integer",
                "description": "Visites ayant atteint l’étape 1"
              },
              "completed": {
                "type": "integer",
                "description": "Visites ayant atteint la dernière étape"
              },
              "conversion_rate": {
                "type": "number",
                "description": "Terminées ÷ entrées, %"
              }
            },
            "description": "Statistiques de la période (liste uniquement)"
          },
          {
            "type": "null"
          }
        ]
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      },
      "updated_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
GET /sites/:site_id/funnels/:id.json Rapport d’entonnoir : effectifs par étape, conversion, abandons, temps entre les étapes et destination des visites à la place funnels_get

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/funnels/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "period": {
      "type": "string",
      "description": "Préréglage de plage de dates. Utilisez custom avec from/to",
      "enum": [
        "today",
        "yesterday",
        "24h",
        "7d",
        "14d",
        "28d",
        "30d",
        "90d",
        "mtd",
        "last_month",
        "qtd",
        "last_quarter",
        "ytd",
        "12mo",
        "last_year",
        "all",
        "custom"
      ],
      "default": "30d"
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "Début de la plage personnalisée (fuseau horaire du site)"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la plage personnalisée, incluse"
    },
    "compare": {
      "type": "string",
      "description": "Période de comparaison",
      "enum": [
        "none",
        "previous_period",
        "previous_year",
        "custom"
      ],
      "default": "none"
    },
    "compare_from": {
      "type": "string",
      "format": "date",
      "description": "Début de la comparaison personnalisée"
    },
    "compare_to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la comparaison personnalisée"
    },
    "match_weekday": {
      "type": "boolean",
      "description": "Aligner les jours de la semaine de la comparaison",
      "default": false
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres : [[\"dimension\",\"operator\",\"value\"], …]. Opérateurs : is, is_not, any_of, none_of, contains, not_contains, starts_with, regex, not_regex, gt, lt, between. Encadrez les conditions dans {\"any\": [...]} pour un OU.",
      "default": []
    },
    "segment_id": {
      "type": "string",
      "description": "Appliquer un segment enregistré (seg_…)"
    },
    "include_imported": {
      "type": "boolean",
      "description": "Ajouter les données historiques importées (dates antérieures au premier événement natif, ignorées lorsque des filtres ou un segment sont appliqués)",
      "default": false
    },
    "breakdown": {
      "type": "string",
      "description": "Répartir les effectifs des étapes selon une dimension de visite",
      "enum": [
        "channel",
        "device",
        "country",
        "utm_campaign",
        "utm_source",
        "browser",
        "os"
      ]
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "period": {
      "type": "object",
      "description": "from/to de la période (UTC)"
    },
    "funnel": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "description": "Identifiant d’entonnoir, par ex. fun_7Q2K9XH3AB"
        },
        "name": {
          "type": "string"
        },
        "steps": {
          "type": "array",
          "items": {
            "type": "object"
          },
          "description": "Étapes : {type: page|event|goal, value, match, name}"
        },
        "order_mode": {
          "type": "string",
          "description": "strict ou any"
        },
        "window": {
          "type": "string",
          "description": "visit ou day"
        },
        "stats": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "entered": {
                  "type": "integer",
                  "description": "Visites ayant atteint l’étape 1"
                },
                "completed": {
                  "type": "integer",
                  "description": "Visites ayant atteint la dernière étape"
                },
                "conversion_rate": {
                  "type": "number",
                  "description": "Terminées ÷ entrées, %"
                }
              },
              "description": "Statistiques de la période (liste uniquement)"
            },
            {
              "type": "null"
            }
          ]
        },
        "created_at": {
          "type": "string",
          "format": "date-time"
        },
        "updated_at": {
          "type": "string",
          "format": "date-time"
        }
      },
      "description": "La définition de l’entonnoir"
    },
    "order_mode": {
      "type": "string",
      "description": "strict ou any"
    },
    "window": {
      "type": "string",
      "description": "visit ou day (day est mesuré au sein d’une visite)"
    },
    "steps": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Par étape : index, name, type, value, count, step_conversion_rate, overall_conversion_rate, dropoff, dropoff_rate, median_seconds_from_previous, next_pages [{value, count}]"
    },
    "overall_conversion_rate": {
      "type": "number",
      "description": "Dernière étape ÷ première étape, %"
    },
    "breakdown": {
      "anyOf": [
        {
          "type": "object",
          "description": "dimension, label et rows [{value, counts, overall_conversion_rate}]"
        },
        {
          "type": "null"
        }
      ]
    },
    "comparison": {
      "anyOf": [
        {
          "type": "object",
          "description": "period, counts par étape, overall_conversion_rate et change (%)"
        },
        {
          "type": "null"
        }
      ]
    }
  }
}
PATCH /sites/:site_id/funnels/:id.json Mettre à jour un entonnoir funnels_update

Permission : content.write

Exemple
curl -X PATCH https://privatusanalytics.com/sites/:site_id/funnels/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nom de l’entonnoir",
      "examples": [
        "Signup flow"
      ]
    },
    "steps": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      },
      "description": "Étapes ordonnées (2 jusqu’à la limite de votre forfait) : [{\"type\": \"page|event|goal\", \"value\": \"/pricing | Signup | goal_…\", \"match\": \"exact|prefix|glob|regex\" (étapes page), \"name\": \"optional label\"}]"
    },
    "order_mode": {
      "type": "string",
      "description": "strict : étapes dans cet ordre, any : dans n’importe quel ordre",
      "enum": [
        "strict",
        "any"
      ]
    },
    "window": {
      "type": "string",
      "description": "Fenêtre de conversion : visit, ou day (mesurée au sein d’une visite, qui ne couvre jamais un jour UTC)",
      "enum": [
        "visit",
        "day"
      ]
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’entonnoir, par ex. fun_7Q2K9XH3AB"
    },
    "name": {
      "type": "string"
    },
    "steps": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Étapes : {type: page|event|goal, value, match, name}"
    },
    "order_mode": {
      "type": "string",
      "description": "strict ou any"
    },
    "window": {
      "type": "string",
      "description": "visit ou day"
    },
    "stats": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "entered": {
              "type": "integer",
              "description": "Visites ayant atteint l’étape 1"
            },
            "completed": {
              "type": "integer",
              "description": "Visites ayant atteint la dernière étape"
            },
            "conversion_rate": {
              "type": "number",
              "description": "Terminées ÷ entrées, %"
            }
          },
          "description": "Statistiques de la période (liste uniquement)"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

Espaces de travail

GET /workspaces/:workspace_id/white_label.json Obtenir la marque en marque blanche white_label_get

Permission : workspace.manage

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/white_label.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string"
    },
    "brand_name": {
      "anyOf": [
        {
          "type": "string",
          "description": "Nom affiché à la place de Privatus Analytics"
        },
        {
          "type": "null"
        }
      ]
    },
    "brand_logo_url": {
      "anyOf": [
        {
          "type": "string",
          "description": "URL de l’image du logo"
        },
        {
          "type": "null"
        }
      ]
    },
    "brand_color": {
      "anyOf": [
        {
          "type": "string",
          "description": "Couleur d’accent"
        },
        {
          "type": "null"
        }
      ]
    },
    "hide_branding": {
      "type": "boolean",
      "description": "La marque Privatus Analytics est masquée"
    },
    "available": {
      "type": "boolean",
      "description": "Le forfait inclut la marque blanche"
    },
    "active": {
      "type": "boolean",
      "description": "La marque est actuellement appliquée"
    }
  }
}
PATCH /workspaces/:workspace_id/white_label.json Définir la marque blanche pour les tableaux de bord partagés et les rapports par e-mail (Business) white_label_update

Permission : workspace.manage

Exemple
curl -X PATCH https://privatusanalytics.com/workspaces/:workspace_id/white_label.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "brand_name": {
      "type": "string",
      "description": "Nom affiché à la place de Privatus Analytics (vide pour le retirer)"
    },
    "brand_logo_url": {
      "type": "string",
      "description": "URL https d’une image de logo (vide pour la retirer)"
    },
    "brand_color": {
      "type": "string",
      "description": "Couleur d’accent, par ex. #06755b"
    },
    "hide_branding": {
      "type": "boolean",
      "description": "Masquer « Privatus Analytics » sur les tableaux de bord partagés et les rapports par e-mail"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string"
    },
    "brand_name": {
      "anyOf": [
        {
          "type": "string",
          "description": "Nom affiché à la place de Privatus Analytics"
        },
        {
          "type": "null"
        }
      ]
    },
    "brand_logo_url": {
      "anyOf": [
        {
          "type": "string",
          "description": "URL de l’image du logo"
        },
        {
          "type": "null"
        }
      ]
    },
    "brand_color": {
      "anyOf": [
        {
          "type": "string",
          "description": "Couleur d’accent"
        },
        {
          "type": "null"
        }
      ]
    },
    "hide_branding": {
      "type": "boolean",
      "description": "La marque Privatus Analytics est masquée"
    },
    "available": {
      "type": "boolean",
      "description": "Le forfait inclut la marque blanche"
    },
    "active": {
      "type": "boolean",
      "description": "La marque est actuellement appliquée"
    }
  }
}
GET /workspaces/:workspace_id/security.json Obtenir les paramètres de sécurité de l’espace de travail workspace_security_get

Permission : workspace.manage

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/security.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string"
    },
    "enforce_2fa": {
      "type": "boolean",
      "description": "Les membres doivent configurer la 2FA"
    },
    "login_methods": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Méthodes de connexion autorisées"
    },
    "session_ttl_hours": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Durée de session (null = aucune)"
        },
        {
          "type": "null"
        }
      ]
    },
    "app_ip_allowlist": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "IP/CIDR autorisés (vide = de partout)"
    },
    "support_access_until": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Le support Privatus Analytics peut consulter l’espace de travail jusqu’au"
        },
        {
          "type": "null"
        }
      ]
    }
  }
}
PATCH /workspaces/:workspace_id/security.json Mettre à jour les paramètres de sécurité de l’espace de travail (2FA, méthodes de connexion, durée de session, liste d’IP autorisées, accès du support) workspace_security_update

Permission : workspace.manage

Exemple
curl -X PATCH https://privatusanalytics.com/workspaces/:workspace_id/security.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "enforce_2fa": {
      "type": "boolean",
      "description": "Exiger que les membres configurent la 2FA"
    },
    "login_methods": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "password",
          "magic_link",
          "passkey",
          "google",
          "github",
          "sso"
        ]
      },
      "description": "Méthodes de connexion autorisées"
    },
    "session_ttl_hours": {
      "type": "integer",
      "description": "Déconnecter les membres après ce nombre d’heures (0 = aucune limite)"
    },
    "app_ip_allowlist": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "N’autoriser l’accès à l’application et à l’API que depuis ces IP/CIDR (Business). Vide = de partout"
    },
    "support_access": {
      "type": "boolean",
      "description": "Autoriser le support Privatus Analytics à consulter l’espace de travail pendant 7 jours"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string"
    },
    "enforce_2fa": {
      "type": "boolean",
      "description": "Les membres doivent configurer la 2FA"
    },
    "login_methods": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Méthodes de connexion autorisées"
    },
    "session_ttl_hours": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Durée de session (null = aucune)"
        },
        {
          "type": "null"
        }
      ]
    },
    "app_ip_allowlist": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "IP/CIDR autorisés (vide = de partout)"
    },
    "support_access_until": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Le support Privatus Analytics peut consulter l’espace de travail jusqu’au"
        },
        {
          "type": "null"
        }
      ]
    }
  }
}
POST /workspaces.json Créer un espace de travail (vous en devenez le propriétaire) workspaces_create

Permission : member · HTTP uniquement (pas un outil MCP)

Exemple
curl -X POST https://privatusanalytics.com/workspaces.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nom de l’espace de travail",
      "examples": [
        "Acme Inc"
      ]
    },
    "timezone": {
      "type": "string",
      "description": "Fuseau horaire des rapports par défaut (par défaut, celui de l’utilisateur)"
    },
    "currency": {
      "type": "string",
      "description": "Devise par défaut (ISO 4217)",
      "default": "USD"
    },
    "how_heard": {
      "type": "string",
      "description": "Comment vous avez entendu parler de nous"
    }
  },
  "required": [
    "name"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "name": {
      "type": "string"
    },
    "timezone": {
      "type": "string",
      "description": "Fuseau horaire des rapports par défaut"
    },
    "currency": {
      "type": "string",
      "description": "Devise par défaut"
    },
    "plan": {
      "type": "string",
      "description": "free, pro, business ou enterprise"
    },
    "plan_events": {
      "type": "integer",
      "description": "Événements par mois inclus dans le forfait"
    },
    "subscription_status": {
      "type": "string"
    },
    "role": {
      "type": "string",
      "description": "Votre rôle dans cet espace de travail"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /workspaces/:id.json Supprimer un espace de travail et tous ses sites (propriétaire uniquement, résilie tout abonnement) workspaces_delete

Permission : workspace.manage

Exemple
curl -X DELETE https://privatusanalytics.com/workspaces/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "confirm": {
      "type": "string",
      "description": "Saisissez le nom de l’espace de travail pour confirmer"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "confirm",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "name": {
      "type": "string"
    },
    "timezone": {
      "type": "string",
      "description": "Fuseau horaire des rapports par défaut"
    },
    "currency": {
      "type": "string",
      "description": "Devise par défaut"
    },
    "plan": {
      "type": "string",
      "description": "free, pro, business ou enterprise"
    },
    "plan_events": {
      "type": "integer",
      "description": "Événements par mois inclus dans le forfait"
    },
    "subscription_status": {
      "type": "string"
    },
    "role": {
      "type": "string",
      "description": "Votre rôle dans cet espace de travail"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /workspaces.json Lister vos espaces de travail workspaces_list

Permission : member

Exemple
curl https://privatusanalytics.com/workspaces.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": []
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant d’espace de travail, par ex. ws_7Q2K9XH3AB"
      },
      "name": {
        "type": "string"
      },
      "timezone": {
        "type": "string",
        "description": "Fuseau horaire des rapports par défaut"
      },
      "currency": {
        "type": "string",
        "description": "Devise par défaut"
      },
      "plan": {
        "type": "string",
        "description": "free, pro, business ou enterprise"
      },
      "plan_events": {
        "type": "integer",
        "description": "Événements par mois inclus dans le forfait"
      },
      "subscription_status": {
        "type": "string"
      },
      "role": {
        "type": "string",
        "description": "Votre rôle dans cet espace de travail"
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
GET /workspaces/:id.json Obtenir un espace de travail workspaces_get

Permission : member

Exemple
curl https://privatusanalytics.com/workspaces/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "name": {
      "type": "string"
    },
    "timezone": {
      "type": "string",
      "description": "Fuseau horaire des rapports par défaut"
    },
    "currency": {
      "type": "string",
      "description": "Devise par défaut"
    },
    "plan": {
      "type": "string",
      "description": "free, pro, business ou enterprise"
    },
    "plan_events": {
      "type": "integer",
      "description": "Événements par mois inclus dans le forfait"
    },
    "subscription_status": {
      "type": "string"
    },
    "role": {
      "type": "string",
      "description": "Votre rôle dans cet espace de travail"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
PATCH /workspaces/:id.json Mettre à jour les paramètres de l’espace de travail workspaces_update

Permission : workspace.manage

Exemple
curl -X PATCH https://privatusanalytics.com/workspaces/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nom de l’espace de travail"
    },
    "timezone": {
      "type": "string",
      "description": "Fuseau horaire des rapports par défaut"
    },
    "currency": {
      "type": "string",
      "description": "Devise par défaut (ISO 4217)"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "name": {
      "type": "string"
    },
    "timezone": {
      "type": "string",
      "description": "Fuseau horaire des rapports par défaut"
    },
    "currency": {
      "type": "string",
      "description": "Devise par défaut"
    },
    "plan": {
      "type": "string",
      "description": "free, pro, business ou enterprise"
    },
    "plan_events": {
      "type": "integer",
      "description": "Événements par mois inclus dans le forfait"
    },
    "subscription_status": {
      "type": "string"
    },
    "role": {
      "type": "string",
      "description": "Votre rôle dans cet espace de travail"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

Exports

POST /workspaces/:workspace_id/exports.json Mettre un export en file d’attente (généré en arrière-plan) exports_create

Permission : analytics.export

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/exports.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Site à exporter (pa_…)",
      "examples": [
        "pa_7Q2K9XH3AB"
      ]
    },
    "kind": {
      "type": "string",
      "description": "aggregated : métriques par intervalle de temps et dimensions. pageviews/events/raw : une ligne par hit (Pro et supérieur). imported : statistiques quotidiennes importées. dashboard : ZIP des panneaux de la vue d’ensemble",
      "enum": [
        "aggregated",
        "pageviews",
        "events",
        "imported",
        "raw",
        "dashboard"
      ],
      "default": "aggregated"
    },
    "file_format": {
      "type": "string",
      "description": "csv, json ou xlsx (aggregated, pageviews, events, imported), csv ou ndjson (raw), zip (dashboard)",
      "enum": [
        "csv",
        "json",
        "xlsx",
        "ndjson",
        "zip"
      ],
      "default": "csv"
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "Premier jour, dans le fuseau horaire de l’export",
      "examples": [
        "2026-09-01"
      ]
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Dernier jour, inclus (400 jours maximum, 93 jours pour raw)",
      "examples": [
        "2026-09-28"
      ]
    },
    "timezone": {
      "type": "string",
      "description": "Fuseau horaire des dates et du regroupement, par ex. America/New_York (par défaut : le fuseau horaire du site)"
    },
    "grouping": {
      "type": "string",
      "description": "Intervalle de temps des exports aggregated",
      "enum": [
        "hour",
        "day",
        "week",
        "month",
        "quarter",
        "year"
      ],
      "default": "day"
    },
    "dimensions": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Dimensions de visite pour regrouper les exports aggregated (jusqu’à 6), par ex. country, channel, entry_page. Pour les exports imported : les dimensions importées à inclure",
      "default": []
    },
    "metrics": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Métriques des exports aggregated (par défaut toutes) : visitors, visits, pageviews, bounce_rate, visit_duration, views_per_visit, revenue",
      "default": []
    },
    "fields": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Colonnes des exports pageviews/events/raw (par défaut toutes sauf visit_id, vital_value, selector) : occurred_at, kind, name, visit_id, hostname, path, referrer_host, referrer_path, channel, utm_source, utm_medium, utm_campaign, utm_content, utm_term, ref, paid_click, country, language, device, browser, browser_major, os, os_major, screen_bucket, engaged_ms, scroll_depth, revenue_minor, currency, vital_value, selector, props",
      "default": []
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres, même format que l’API de statistiques : [[\"dimension\",\"operator\",\"value\"], …]",
      "default": []
    },
    "segment_id": {
      "type": "string",
      "description": "Appliquer un segment enregistré (seg_…)"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id",
    "from",
    "to",
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’export, par ex. exp_7Q2K9XH3AB"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Site exporté (pa_…)"
        },
        {
          "type": "null"
        }
      ]
    },
    "kind": {
      "type": "string",
      "description": "aggregated, pageviews, events, imported, raw ou dashboard"
    },
    "format": {
      "type": "string",
      "description": "csv, json, xlsx, ndjson ou zip"
    },
    "status": {
      "type": "string",
      "description": "queued, running, complete, failed ou expired"
    },
    "params": {
      "type": "object",
      "description": "La définition de l’export (dates, fuseau horaire, regroupement, dimensions, métriques, champs, filtres)"
    },
    "row_count": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Lignes écrites"
        },
        {
          "type": "null"
        }
      ]
    },
    "error": {
      "anyOf": [
        {
          "type": "string",
          "description": "Motif de l’échec de l’export"
        },
        {
          "type": "null"
        }
      ]
    },
    "completed_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "expires_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date de suppression du fichier"
        },
        {
          "type": "null"
        }
      ]
    },
    "download_url": {
      "anyOf": [
        {
          "type": "string",
          "description": "Chemin renvoyant un lien de fichier signé de courte durée (exports_download)"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /exports/:id.json Supprimer un export et son fichier exports_delete

Permission : analytics.export

Exemple
curl -X DELETE https://privatusanalytics.com/exports/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’export, par ex. exp_7Q2K9XH3AB"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Site exporté (pa_…)"
        },
        {
          "type": "null"
        }
      ]
    },
    "kind": {
      "type": "string",
      "description": "aggregated, pageviews, events, imported, raw ou dashboard"
    },
    "format": {
      "type": "string",
      "description": "csv, json, xlsx, ndjson ou zip"
    },
    "status": {
      "type": "string",
      "description": "queued, running, complete, failed ou expired"
    },
    "params": {
      "type": "object",
      "description": "La définition de l’export (dates, fuseau horaire, regroupement, dimensions, métriques, champs, filtres)"
    },
    "row_count": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Lignes écrites"
        },
        {
          "type": "null"
        }
      ]
    },
    "error": {
      "anyOf": [
        {
          "type": "string",
          "description": "Motif de l’échec de l’export"
        },
        {
          "type": "null"
        }
      ]
    },
    "completed_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "expires_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date de suppression du fichier"
        },
        {
          "type": "null"
        }
      ]
    },
    "download_url": {
      "anyOf": [
        {
          "type": "string",
          "description": "Chemin renvoyant un lien de fichier signé de courte durée (exports_download)"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /exports/:id/download.json Obtenir un lien signé vers le fichier (valable 10 minutes) exports_download

Permission : analytics.export

Exemple
curl https://privatusanalytics.com/exports/:id/download.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /workspaces/:workspace_id/exports.json Lister les exports (la file de tâches) exports_list

Permission : analytics.export

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/exports.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Uniquement les exports de ce site (pa_…)"
    },
    "status": {
      "type": "string",
      "description": "Uniquement les exports avec ce statut",
      "enum": [
        "queued",
        "running",
        "complete",
        "failed",
        "expired"
      ]
    },
    "kind": {
      "type": "string",
      "description": "Uniquement les exports de ce type",
      "enum": [
        "aggregated",
        "pageviews",
        "events",
        "imported",
        "raw",
        "dashboard"
      ]
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant d’export, par ex. exp_7Q2K9XH3AB"
      },
      "site_id": {
        "anyOf": [
          {
            "type": "string",
            "description": "Site exporté (pa_…)"
          },
          {
            "type": "null"
          }
        ]
      },
      "kind": {
        "type": "string",
        "description": "aggregated, pageviews, events, imported, raw ou dashboard"
      },
      "format": {
        "type": "string",
        "description": "csv, json, xlsx, ndjson ou zip"
      },
      "status": {
        "type": "string",
        "description": "queued, running, complete, failed ou expired"
      },
      "params": {
        "type": "object",
        "description": "La définition de l’export (dates, fuseau horaire, regroupement, dimensions, métriques, champs, filtres)"
      },
      "row_count": {
        "anyOf": [
          {
            "type": "integer",
            "description": "Lignes écrites"
          },
          {
            "type": "null"
          }
        ]
      },
      "error": {
        "anyOf": [
          {
            "type": "string",
            "description": "Motif de l’échec de l’export"
          },
          {
            "type": "null"
          }
        ]
      },
      "completed_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "expires_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time",
            "description": "Date de suppression du fichier"
          },
          {
            "type": "null"
          }
        ]
      },
      "download_url": {
        "anyOf": [
          {
            "type": "string",
            "description": "Chemin renvoyant un lien de fichier signé de courte durée (exports_download)"
          },
          {
            "type": "null"
          }
        ]
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
POST /workspaces/:workspace_id/exports/preview.json Prévisualiser un export : les 20 premières lignes et le nombre de lignes estimé exports_preview

Permission : analytics.export

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/exports/preview.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Site à exporter (pa_…)",
      "examples": [
        "pa_7Q2K9XH3AB"
      ]
    },
    "kind": {
      "type": "string",
      "description": "aggregated : métriques par intervalle de temps et dimensions. pageviews/events/raw : une ligne par hit (Pro et supérieur). imported : statistiques quotidiennes importées. dashboard : ZIP des panneaux de la vue d’ensemble",
      "enum": [
        "aggregated",
        "pageviews",
        "events",
        "imported",
        "raw",
        "dashboard"
      ],
      "default": "aggregated"
    },
    "file_format": {
      "type": "string",
      "description": "csv, json ou xlsx (aggregated, pageviews, events, imported), csv ou ndjson (raw), zip (dashboard)",
      "enum": [
        "csv",
        "json",
        "xlsx",
        "ndjson",
        "zip"
      ],
      "default": "csv"
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "Premier jour, dans le fuseau horaire de l’export",
      "examples": [
        "2026-09-01"
      ]
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Dernier jour, inclus (400 jours maximum, 93 jours pour raw)",
      "examples": [
        "2026-09-28"
      ]
    },
    "timezone": {
      "type": "string",
      "description": "Fuseau horaire des dates et du regroupement, par ex. America/New_York (par défaut : le fuseau horaire du site)"
    },
    "grouping": {
      "type": "string",
      "description": "Intervalle de temps des exports aggregated",
      "enum": [
        "hour",
        "day",
        "week",
        "month",
        "quarter",
        "year"
      ],
      "default": "day"
    },
    "dimensions": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Dimensions de visite pour regrouper les exports aggregated (jusqu’à 6), par ex. country, channel, entry_page. Pour les exports imported : les dimensions importées à inclure",
      "default": []
    },
    "metrics": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Métriques des exports aggregated (par défaut toutes) : visitors, visits, pageviews, bounce_rate, visit_duration, views_per_visit, revenue",
      "default": []
    },
    "fields": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Colonnes des exports pageviews/events/raw (par défaut toutes sauf visit_id, vital_value, selector) : occurred_at, kind, name, visit_id, hostname, path, referrer_host, referrer_path, channel, utm_source, utm_medium, utm_campaign, utm_content, utm_term, ref, paid_click, country, language, device, browser, browser_major, os, os_major, screen_bucket, engaged_ms, scroll_depth, revenue_minor, currency, vital_value, selector, props",
      "default": []
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres, même format que l’API de statistiques : [[\"dimension\",\"operator\",\"value\"], …]",
      "default": []
    },
    "segment_id": {
      "type": "string",
      "description": "Appliquer un segment enregistré (seg_…)"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id",
    "from",
    "to",
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /exports/:id.json Obtenir un export et son statut exports_get

Permission : analytics.export

Exemple
curl https://privatusanalytics.com/exports/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’export, par ex. exp_7Q2K9XH3AB"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Site exporté (pa_…)"
        },
        {
          "type": "null"
        }
      ]
    },
    "kind": {
      "type": "string",
      "description": "aggregated, pageviews, events, imported, raw ou dashboard"
    },
    "format": {
      "type": "string",
      "description": "csv, json, xlsx, ndjson ou zip"
    },
    "status": {
      "type": "string",
      "description": "queued, running, complete, failed ou expired"
    },
    "params": {
      "type": "object",
      "description": "La définition de l’export (dates, fuseau horaire, regroupement, dimensions, métriques, champs, filtres)"
    },
    "row_count": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Lignes écrites"
        },
        {
          "type": "null"
        }
      ]
    },
    "error": {
      "anyOf": [
        {
          "type": "string",
          "description": "Motif de l’échec de l’export"
        },
        {
          "type": "null"
        }
      ]
    },
    "completed_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "expires_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date de suppression du fichier"
        },
        {
          "type": "null"
        }
      ]
    },
    "download_url": {
      "anyOf": [
        {
          "type": "string",
          "description": "Chemin renvoyant un lien de fichier signé de courte durée (exports_download)"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

Facturation

POST /workspaces/:workspace_id/billing/badge.json Activer ou désactiver le bonus du badge (forfait gratuit) billing_badge

Permission : billing.manage

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/billing/badge.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "enabled": {
      "type": "boolean",
      "description": "true pour vérifier le badge et obtenir le bonus"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "enabled",
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string"
    },
    "plan": {
      "type": "string",
      "description": "free, pro, business ou enterprise"
    },
    "plan_events": {
      "type": "integer",
      "description": "Événements mensuels du palier payant"
    },
    "allowance": {
      "type": "integer",
      "description": "Événements mensuels, bonus du badge inclus"
    },
    "billing_interval": {
      "anyOf": [
        {
          "type": "string",
          "description": "month ou year"
        },
        {
          "type": "null"
        }
      ]
    },
    "price": {
      "anyOf": [
        {
          "type": "integer",
          "description": "USD par intervalle de facturation"
        },
        {
          "type": "null"
        }
      ]
    },
    "subscription_status": {
      "type": "string",
      "description": "none, trialing, active, past_due, paused ou canceled"
    },
    "current_period_ends_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Renouvellement ou fin le"
        },
        {
          "type": "null"
        }
      ]
    },
    "cancel_at_period_end": {
      "type": "boolean"
    },
    "canceled_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "auto_upgrade": {
      "type": "boolean"
    },
    "discount": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "program": {
              "type": "string",
              "description": "nonprofit, education, open_source, open_source_free ou agency"
            },
            "status": {
              "type": "string",
              "description": "pending, approved (pas encore appliqué à l’abonnement), active, rejected ou revoked"
            },
            "percent": {
              "anyOf": [
                {
                  "type": "integer",
                  "description": "Pourcentage de réduction sur Pro et Business (null pour le programme open source gratuit)"
                },
                {
                  "type": "null"
                }
              ]
            },
            "comp_events": {
              "anyOf": [
                {
                  "type": "integer",
                  "description": "Événements gratuits par mois (programme open source gratuit uniquement)"
                },
                {
                  "type": "null"
                }
              ]
            },
            "organization_name": {
              "type": "string",
              "description": "Nom de l’organisation, de l’établissement, du projet ou de l’agence"
            },
            "website": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Site web"
                },
                {
                  "type": "null"
                }
              ]
            },
            "proof_url": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Lien justificatif ou URL du dépôt"
                },
                {
                  "type": "null"
                }
              ]
            },
            "license": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Licence OSI (open source)"
                },
                {
                  "type": "null"
                }
              ]
            },
            "note": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Note pour l’examen"
                },
                {
                  "type": "null"
                }
              ]
            },
            "rejection_reason": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Motif pour lequel la candidature n’a pas été approuvée"
                },
                {
                  "type": "null"
                }
              ]
            },
            "created_at": {
              "type": "string",
              "format": "date-time",
              "description": "Date de la candidature"
            },
            "reviewed_at": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "description": "Date de l’examen"
                },
                {
                  "type": "null"
                }
              ]
            },
            "applied_at": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "description": "Remise active depuis"
                },
                {
                  "type": "null"
                }
              ]
            },
            "revoked_at": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "description": "Date de fin du programme"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "description": "La dernière candidature à un programme de remise, ou null"
        },
        {
          "type": "null"
        }
      ]
    },
    "discount_percent": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Pourcentage de réduction sur Pro et Business issu d’un programme approuvé, ou null"
        },
        {
          "type": "null"
        }
      ]
    },
    "billing_emails": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "tax_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "badge": {
      "type": "object",
      "description": "Bonus du badge (forfait gratuit)"
    },
    "usage": {
      "type": "object",
      "properties": {
        "month": {
          "type": "string",
          "format": "date",
          "description": "Premier jour du mois concerné"
        },
        "events": {
          "type": "integer",
          "description": "Événements facturables (pages vues et événements personnalisés)"
        },
        "bots": {
          "type": "integer",
          "description": "Hits de bots filtrés (non facturés)"
        },
        "allowance": {
          "type": "integer",
          "description": "Événements inclus, avec l’éventuel bonus du badge"
        },
        "percent": {
          "type": "number",
          "description": "Événements en pourcentage du quota"
        },
        "forecast": {
          "anyOf": [
            {
              "type": "integer",
              "description": "Événements prévus en fin de mois"
            },
            {
              "type": "null"
            }
          ]
        },
        "forecast_percent": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ]
        },
        "days_left": {
          "type": "integer",
          "description": "Jours restants dans le mois"
        },
        "status": {
          "type": "string",
          "description": "ok, warning (80 % et plus), over (un mois passé ayant atteint ou dépassé le quota), locked ou paused"
        },
        "sites": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "site_id": {
                "type": "string"
              },
              "domain": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "events": {
                "type": "integer",
                "description": "Pages vues et événements personnalisés ce mois-ci"
              },
              "share": {
                "type": "number",
                "description": "Pourcentage du total de l’espace de travail"
              }
            }
          },
          "description": "Événements par site"
        },
        "history": {
          "type": "array",
          "description": "Mois précédents, les plus récents en premier"
        },
        "access_locked_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "description": "Tableaux de bord verrouillés par l’équipe Privatus Analytics depuis"
            },
            {
              "type": "null"
            }
          ]
        },
        "collection_paused": {
          "type": "boolean",
          "description": "True tant que les nouveaux événements sont ignorés (la limite mensuelle est atteinte, ou l’équipe a mis la collecte en pause)"
        },
        "pause_reason": {
          "anyOf": [
            {
              "type": "string",
              "description": "Pourquoi la collecte est en pause : limit (le quota mensuel est atteint) ou staff. null lorsque la collecte est active"
            },
            {
              "type": "null"
            }
          ]
        },
        "collection_paused_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "description": "Date à laquelle l’équipe a mis la collecte en pause"
            },
            {
              "type": "null"
            }
          ]
        },
        "resumes_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "description": "Fin d’une pause due à la limite : le début du mois suivant (UTC), ou plus tôt en cas de passage à un forfait supérieur. null sinon"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "description": "Ce mois-ci jusqu’à présent"
    }
  }
}
POST /workspaces/:workspace_id/billing/cancel.json Annuler à la fin de la période de facturation billing_cancel

Permission : billing.manage

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/billing/cancel.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "reason": {
      "type": "string",
      "description": "Motif principal de la résiliation (enquête facultative)",
      "enum": [
        "too_expensive",
        "missing_features",
        "switching_tool",
        "not_using",
        "temporary",
        "other"
      ]
    },
    "comment": {
      "type": "string",
      "description": "Tout ce que nous pourrions améliorer"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string"
    },
    "plan": {
      "type": "string",
      "description": "free, pro, business ou enterprise"
    },
    "plan_events": {
      "type": "integer",
      "description": "Événements mensuels du palier payant"
    },
    "allowance": {
      "type": "integer",
      "description": "Événements mensuels, bonus du badge inclus"
    },
    "billing_interval": {
      "anyOf": [
        {
          "type": "string",
          "description": "month ou year"
        },
        {
          "type": "null"
        }
      ]
    },
    "price": {
      "anyOf": [
        {
          "type": "integer",
          "description": "USD par intervalle de facturation"
        },
        {
          "type": "null"
        }
      ]
    },
    "subscription_status": {
      "type": "string",
      "description": "none, trialing, active, past_due, paused ou canceled"
    },
    "current_period_ends_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Renouvellement ou fin le"
        },
        {
          "type": "null"
        }
      ]
    },
    "cancel_at_period_end": {
      "type": "boolean"
    },
    "canceled_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "auto_upgrade": {
      "type": "boolean"
    },
    "discount": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "program": {
              "type": "string",
              "description": "nonprofit, education, open_source, open_source_free ou agency"
            },
            "status": {
              "type": "string",
              "description": "pending, approved (pas encore appliqué à l’abonnement), active, rejected ou revoked"
            },
            "percent": {
              "anyOf": [
                {
                  "type": "integer",
                  "description": "Pourcentage de réduction sur Pro et Business (null pour le programme open source gratuit)"
                },
                {
                  "type": "null"
                }
              ]
            },
            "comp_events": {
              "anyOf": [
                {
                  "type": "integer",
                  "description": "Événements gratuits par mois (programme open source gratuit uniquement)"
                },
                {
                  "type": "null"
                }
              ]
            },
            "organization_name": {
              "type": "string",
              "description": "Nom de l’organisation, de l’établissement, du projet ou de l’agence"
            },
            "website": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Site web"
                },
                {
                  "type": "null"
                }
              ]
            },
            "proof_url": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Lien justificatif ou URL du dépôt"
                },
                {
                  "type": "null"
                }
              ]
            },
            "license": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Licence OSI (open source)"
                },
                {
                  "type": "null"
                }
              ]
            },
            "note": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Note pour l’examen"
                },
                {
                  "type": "null"
                }
              ]
            },
            "rejection_reason": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Motif pour lequel la candidature n’a pas été approuvée"
                },
                {
                  "type": "null"
                }
              ]
            },
            "created_at": {
              "type": "string",
              "format": "date-time",
              "description": "Date de la candidature"
            },
            "reviewed_at": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "description": "Date de l’examen"
                },
                {
                  "type": "null"
                }
              ]
            },
            "applied_at": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "description": "Remise active depuis"
                },
                {
                  "type": "null"
                }
              ]
            },
            "revoked_at": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "description": "Date de fin du programme"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "description": "La dernière candidature à un programme de remise, ou null"
        },
        {
          "type": "null"
        }
      ]
    },
    "discount_percent": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Pourcentage de réduction sur Pro et Business issu d’un programme approuvé, ou null"
        },
        {
          "type": "null"
        }
      ]
    },
    "billing_emails": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "tax_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "badge": {
      "type": "object",
      "description": "Bonus du badge (forfait gratuit)"
    },
    "usage": {
      "type": "object",
      "properties": {
        "month": {
          "type": "string",
          "format": "date",
          "description": "Premier jour du mois concerné"
        },
        "events": {
          "type": "integer",
          "description": "Événements facturables (pages vues et événements personnalisés)"
        },
        "bots": {
          "type": "integer",
          "description": "Hits de bots filtrés (non facturés)"
        },
        "allowance": {
          "type": "integer",
          "description": "Événements inclus, avec l’éventuel bonus du badge"
        },
        "percent": {
          "type": "number",
          "description": "Événements en pourcentage du quota"
        },
        "forecast": {
          "anyOf": [
            {
              "type": "integer",
              "description": "Événements prévus en fin de mois"
            },
            {
              "type": "null"
            }
          ]
        },
        "forecast_percent": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ]
        },
        "days_left": {
          "type": "integer",
          "description": "Jours restants dans le mois"
        },
        "status": {
          "type": "string",
          "description": "ok, warning (80 % et plus), over (un mois passé ayant atteint ou dépassé le quota), locked ou paused"
        },
        "sites": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "site_id": {
                "type": "string"
              },
              "domain": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "events": {
                "type": "integer",
                "description": "Pages vues et événements personnalisés ce mois-ci"
              },
              "share": {
                "type": "number",
                "description": "Pourcentage du total de l’espace de travail"
              }
            }
          },
          "description": "Événements par site"
        },
        "history": {
          "type": "array",
          "description": "Mois précédents, les plus récents en premier"
        },
        "access_locked_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "description": "Tableaux de bord verrouillés par l’équipe Privatus Analytics depuis"
            },
            {
              "type": "null"
            }
          ]
        },
        "collection_paused": {
          "type": "boolean",
          "description": "True tant que les nouveaux événements sont ignorés (la limite mensuelle est atteinte, ou l’équipe a mis la collecte en pause)"
        },
        "pause_reason": {
          "anyOf": [
            {
              "type": "string",
              "description": "Pourquoi la collecte est en pause : limit (le quota mensuel est atteint) ou staff. null lorsque la collecte est active"
            },
            {
              "type": "null"
            }
          ]
        },
        "collection_paused_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "description": "Date à laquelle l’équipe a mis la collecte en pause"
            },
            {
              "type": "null"
            }
          ]
        },
        "resumes_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "description": "Fin d’une pause due à la limite : le début du mois suivant (UTC), ou plus tôt en cas de passage à un forfait supérieur. null sinon"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "description": "Ce mois-ci jusqu’à présent"
    }
  }
}
POST /workspaces/:workspace_id/billing/change_plan.json Changer de forfait, de palier ou d’intervalle (au prorata) billing_change_plan

Permission : billing.manage

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/billing/change_plan.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "plan": {
      "type": "string",
      "description": "Forfait de destination : pro ou business",
      "enum": [
        "pro",
        "business"
      ]
    },
    "events": {
      "type": "integer",
      "description": "Événements mensuels du palier, depuis GET /plans",
      "examples": [
        1000000
      ]
    },
    "interval": {
      "type": "string",
      "description": "Intervalle de facturation. L’annuel offre 2 mois",
      "enum": [
        "month",
        "year"
      ],
      "default": "month"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "plan",
    "events",
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string"
    },
    "plan": {
      "type": "string",
      "description": "free, pro, business ou enterprise"
    },
    "plan_events": {
      "type": "integer",
      "description": "Événements mensuels du palier payant"
    },
    "allowance": {
      "type": "integer",
      "description": "Événements mensuels, bonus du badge inclus"
    },
    "billing_interval": {
      "anyOf": [
        {
          "type": "string",
          "description": "month ou year"
        },
        {
          "type": "null"
        }
      ]
    },
    "price": {
      "anyOf": [
        {
          "type": "integer",
          "description": "USD par intervalle de facturation"
        },
        {
          "type": "null"
        }
      ]
    },
    "subscription_status": {
      "type": "string",
      "description": "none, trialing, active, past_due, paused ou canceled"
    },
    "current_period_ends_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Renouvellement ou fin le"
        },
        {
          "type": "null"
        }
      ]
    },
    "cancel_at_period_end": {
      "type": "boolean"
    },
    "canceled_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "auto_upgrade": {
      "type": "boolean"
    },
    "discount": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "program": {
              "type": "string",
              "description": "nonprofit, education, open_source, open_source_free ou agency"
            },
            "status": {
              "type": "string",
              "description": "pending, approved (pas encore appliqué à l’abonnement), active, rejected ou revoked"
            },
            "percent": {
              "anyOf": [
                {
                  "type": "integer",
                  "description": "Pourcentage de réduction sur Pro et Business (null pour le programme open source gratuit)"
                },
                {
                  "type": "null"
                }
              ]
            },
            "comp_events": {
              "anyOf": [
                {
                  "type": "integer",
                  "description": "Événements gratuits par mois (programme open source gratuit uniquement)"
                },
                {
                  "type": "null"
                }
              ]
            },
            "organization_name": {
              "type": "string",
              "description": "Nom de l’organisation, de l’établissement, du projet ou de l’agence"
            },
            "website": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Site web"
                },
                {
                  "type": "null"
                }
              ]
            },
            "proof_url": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Lien justificatif ou URL du dépôt"
                },
                {
                  "type": "null"
                }
              ]
            },
            "license": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Licence OSI (open source)"
                },
                {
                  "type": "null"
                }
              ]
            },
            "note": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Note pour l’examen"
                },
                {
                  "type": "null"
                }
              ]
            },
            "rejection_reason": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Motif pour lequel la candidature n’a pas été approuvée"
                },
                {
                  "type": "null"
                }
              ]
            },
            "created_at": {
              "type": "string",
              "format": "date-time",
              "description": "Date de la candidature"
            },
            "reviewed_at": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "description": "Date de l’examen"
                },
                {
                  "type": "null"
                }
              ]
            },
            "applied_at": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "description": "Remise active depuis"
                },
                {
                  "type": "null"
                }
              ]
            },
            "revoked_at": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "description": "Date de fin du programme"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "description": "La dernière candidature à un programme de remise, ou null"
        },
        {
          "type": "null"
        }
      ]
    },
    "discount_percent": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Pourcentage de réduction sur Pro et Business issu d’un programme approuvé, ou null"
        },
        {
          "type": "null"
        }
      ]
    },
    "billing_emails": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "tax_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "badge": {
      "type": "object",
      "description": "Bonus du badge (forfait gratuit)"
    },
    "usage": {
      "type": "object",
      "properties": {
        "month": {
          "type": "string",
          "format": "date",
          "description": "Premier jour du mois concerné"
        },
        "events": {
          "type": "integer",
          "description": "Événements facturables (pages vues et événements personnalisés)"
        },
        "bots": {
          "type": "integer",
          "description": "Hits de bots filtrés (non facturés)"
        },
        "allowance": {
          "type": "integer",
          "description": "Événements inclus, avec l’éventuel bonus du badge"
        },
        "percent": {
          "type": "number",
          "description": "Événements en pourcentage du quota"
        },
        "forecast": {
          "anyOf": [
            {
              "type": "integer",
              "description": "Événements prévus en fin de mois"
            },
            {
              "type": "null"
            }
          ]
        },
        "forecast_percent": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ]
        },
        "days_left": {
          "type": "integer",
          "description": "Jours restants dans le mois"
        },
        "status": {
          "type": "string",
          "description": "ok, warning (80 % et plus), over (un mois passé ayant atteint ou dépassé le quota), locked ou paused"
        },
        "sites": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "site_id": {
                "type": "string"
              },
              "domain": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "events": {
                "type": "integer",
                "description": "Pages vues et événements personnalisés ce mois-ci"
              },
              "share": {
                "type": "number",
                "description": "Pourcentage du total de l’espace de travail"
              }
            }
          },
          "description": "Événements par site"
        },
        "history": {
          "type": "array",
          "description": "Mois précédents, les plus récents en premier"
        },
        "access_locked_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "description": "Tableaux de bord verrouillés par l’équipe Privatus Analytics depuis"
            },
            {
              "type": "null"
            }
          ]
        },
        "collection_paused": {
          "type": "boolean",
          "description": "True tant que les nouveaux événements sont ignorés (la limite mensuelle est atteinte, ou l’équipe a mis la collecte en pause)"
        },
        "pause_reason": {
          "anyOf": [
            {
              "type": "string",
              "description": "Pourquoi la collecte est en pause : limit (le quota mensuel est atteint) ou staff. null lorsque la collecte est active"
            },
            {
              "type": "null"
            }
          ]
        },
        "collection_paused_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "description": "Date à laquelle l’équipe a mis la collecte en pause"
            },
            {
              "type": "null"
            }
          ]
        },
        "resumes_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "description": "Fin d’une pause due à la limite : le début du mois suivant (UTC), ou plus tôt en cas de passage à un forfait supérieur. null sinon"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "description": "Ce mois-ci jusqu’à présent"
    }
  }
}
POST /workspaces/:workspace_id/billing/checkout.json Démarrer un paiement Paddle pour un forfait payant billing_checkout

Permission : billing.manage

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/billing/checkout.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "plan": {
      "type": "string",
      "description": "Forfait de destination : pro ou business",
      "enum": [
        "pro",
        "business"
      ]
    },
    "events": {
      "type": "integer",
      "description": "Événements mensuels du palier, depuis GET /plans",
      "examples": [
        1000000
      ]
    },
    "interval": {
      "type": "string",
      "description": "Intervalle de facturation. L’annuel offre 2 mois",
      "enum": [
        "month",
        "year"
      ],
      "default": "month"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "plan",
    "events",
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "transaction_id": {
      "type": "string",
      "description": "Identifiant de transaction Paddle (txn_...)"
    },
    "url": {
      "anyOf": [
        {
          "type": "string",
          "description": "URL du paiement hébergé"
        },
        {
          "type": "null"
        }
      ]
    },
    "price_id": {
      "type": "string"
    },
    "plan": {
      "type": "string"
    },
    "events": {
      "type": "integer"
    },
    "interval": {
      "type": "string"
    },
    "amount": {
      "type": "integer",
      "description": "USD par intervalle"
    },
    "client_token": {
      "anyOf": [
        {
          "type": "string",
          "description": "Jeton côté client Paddle.js"
        },
        {
          "type": "null"
        }
      ]
    },
    "environment": {
      "type": "string",
      "description": "sandbox ou production"
    },
    "custom_data": {
      "type": "object",
      "description": "Transmis à Paddle pour lier l’abonnement"
    },
    "discount_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Identifiant de remise Paddle d’un programme approuvé, appliqué à ce paiement"
        },
        {
          "type": "null"
        }
      ]
    }
  }
}
POST /workspaces/:workspace_id/billing/discount.json Demander une remise pour association, éducation ou open source billing_discount

Permission : billing.manage

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/billing/discount.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "program": {
      "type": "string",
      "description": "nonprofit, education, open_source (50 % de réduction), open_source_free (Pro gratuit jusqu’à 1M d’événements par mois) ou agency (20 % de réduction sur chaque espace de travail que vous possédez)",
      "enum": [
        "nonprofit",
        "education",
        "open_source",
        "open_source_free",
        "agency"
      ]
    },
    "organization_name": {
      "type": "string",
      "description": "Nom de l’organisation, de l’établissement, du projet ou de l’agence"
    },
    "website": {
      "type": "string",
      "description": "Son site web"
    },
    "proof_url": {
      "type": "string",
      "description": "Lien justificatif. Pour l’open source, l’URL du dépôt"
    },
    "license": {
      "type": "string",
      "description": "Licence OSI du projet (open source uniquement)"
    },
    "note": {
      "type": "string",
      "description": "Tout ce qui peut aider l’examen, jusqu’à 1 000 caractères"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "program",
    "organization_name",
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "program": {
      "type": "string",
      "description": "nonprofit, education, open_source, open_source_free ou agency"
    },
    "status": {
      "type": "string",
      "description": "pending, approved (pas encore appliqué à l’abonnement), active, rejected ou revoked"
    },
    "percent": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Pourcentage de réduction sur Pro et Business (null pour le programme open source gratuit)"
        },
        {
          "type": "null"
        }
      ]
    },
    "comp_events": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Événements gratuits par mois (programme open source gratuit uniquement)"
        },
        {
          "type": "null"
        }
      ]
    },
    "organization_name": {
      "type": "string",
      "description": "Nom de l’organisation, de l’établissement, du projet ou de l’agence"
    },
    "website": {
      "anyOf": [
        {
          "type": "string",
          "description": "Site web"
        },
        {
          "type": "null"
        }
      ]
    },
    "proof_url": {
      "anyOf": [
        {
          "type": "string",
          "description": "Lien justificatif ou URL du dépôt"
        },
        {
          "type": "null"
        }
      ]
    },
    "license": {
      "anyOf": [
        {
          "type": "string",
          "description": "Licence OSI (open source)"
        },
        {
          "type": "null"
        }
      ]
    },
    "note": {
      "anyOf": [
        {
          "type": "string",
          "description": "Note pour l’examen"
        },
        {
          "type": "null"
        }
      ]
    },
    "rejection_reason": {
      "anyOf": [
        {
          "type": "string",
          "description": "Motif pour lequel la candidature n’a pas été approuvée"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time",
      "description": "Date de la candidature"
    },
    "reviewed_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date de l’examen"
        },
        {
          "type": "null"
        }
      ]
    },
    "applied_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Remise active depuis"
        },
        {
          "type": "null"
        }
      ]
    },
    "revoked_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date de fin du programme"
        },
        {
          "type": "null"
        }
      ]
    }
  }
}
POST /workspaces/:workspace_id/billing/payment_method.json Obtenir un lien pour mettre à jour le moyen de paiement billing_payment_method

Permission : billing.manage

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/billing/payment_method.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "kind": {
      "type": "string",
      "description": "portal, payment_method ou invoice"
    },
    "url": {
      "anyOf": [
        {
          "type": "string",
          "description": "URL Paddle de courte durée"
        },
        {
          "type": "null"
        }
      ]
    }
  }
}
POST /workspaces/:workspace_id/billing/portal.json Obtenir un lien vers le portail client Paddle billing_portal

Permission : billing.manage

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/billing/portal.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "kind": {
      "type": "string",
      "description": "portal, payment_method ou invoice"
    },
    "url": {
      "anyOf": [
        {
          "type": "string",
          "description": "URL Paddle de courte durée"
        },
        {
          "type": "null"
        }
      ]
    }
  }
}
GET /workspaces/:workspace_id/billing/preview.json Prévisualiser un changement de forfait avec le prorata billing_preview

Permission : billing.manage

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/billing/preview.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "plan": {
      "type": "string",
      "description": "Forfait de destination : pro ou business",
      "enum": [
        "pro",
        "business"
      ]
    },
    "events": {
      "type": "integer",
      "description": "Événements mensuels du palier, depuis GET /plans",
      "examples": [
        1000000
      ]
    },
    "interval": {
      "type": "string",
      "description": "Intervalle de facturation. L’annuel offre 2 mois",
      "enum": [
        "month",
        "year"
      ],
      "default": "month"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "plan",
    "events",
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "plan": {
      "type": "string"
    },
    "events": {
      "type": "integer"
    },
    "interval": {
      "type": "string"
    },
    "price_id": {
      "type": "string"
    },
    "amount": {
      "type": "integer",
      "description": "Nouveau prix en USD par intervalle"
    },
    "currency": {
      "type": "string"
    },
    "charge_minor": {
      "type": "integer",
      "description": "Facturé maintenant, en unités mineures"
    },
    "credit_minor": {
      "type": "integer",
      "description": "Crédit pour le temps non utilisé, en unités mineures"
    },
    "result_action": {
      "anyOf": [
        {
          "type": "string",
          "description": "charge ou credit"
        },
        {
          "type": "null"
        }
      ]
    },
    "result_minor": {
      "type": "integer",
      "description": "Débit ou crédit net, en unités mineures"
    },
    "next_billed_at": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Utilisation ou limites que le nouveau forfait ne couvrirait pas"
    }
  }
}
POST /workspaces/:workspace_id/billing/resume.json Annuler une résiliation programmée ou reprendre une pause billing_resume

Permission : billing.manage

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/billing/resume.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string"
    },
    "plan": {
      "type": "string",
      "description": "free, pro, business ou enterprise"
    },
    "plan_events": {
      "type": "integer",
      "description": "Événements mensuels du palier payant"
    },
    "allowance": {
      "type": "integer",
      "description": "Événements mensuels, bonus du badge inclus"
    },
    "billing_interval": {
      "anyOf": [
        {
          "type": "string",
          "description": "month ou year"
        },
        {
          "type": "null"
        }
      ]
    },
    "price": {
      "anyOf": [
        {
          "type": "integer",
          "description": "USD par intervalle de facturation"
        },
        {
          "type": "null"
        }
      ]
    },
    "subscription_status": {
      "type": "string",
      "description": "none, trialing, active, past_due, paused ou canceled"
    },
    "current_period_ends_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Renouvellement ou fin le"
        },
        {
          "type": "null"
        }
      ]
    },
    "cancel_at_period_end": {
      "type": "boolean"
    },
    "canceled_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "auto_upgrade": {
      "type": "boolean"
    },
    "discount": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "program": {
              "type": "string",
              "description": "nonprofit, education, open_source, open_source_free ou agency"
            },
            "status": {
              "type": "string",
              "description": "pending, approved (pas encore appliqué à l’abonnement), active, rejected ou revoked"
            },
            "percent": {
              "anyOf": [
                {
                  "type": "integer",
                  "description": "Pourcentage de réduction sur Pro et Business (null pour le programme open source gratuit)"
                },
                {
                  "type": "null"
                }
              ]
            },
            "comp_events": {
              "anyOf": [
                {
                  "type": "integer",
                  "description": "Événements gratuits par mois (programme open source gratuit uniquement)"
                },
                {
                  "type": "null"
                }
              ]
            },
            "organization_name": {
              "type": "string",
              "description": "Nom de l’organisation, de l’établissement, du projet ou de l’agence"
            },
            "website": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Site web"
                },
                {
                  "type": "null"
                }
              ]
            },
            "proof_url": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Lien justificatif ou URL du dépôt"
                },
                {
                  "type": "null"
                }
              ]
            },
            "license": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Licence OSI (open source)"
                },
                {
                  "type": "null"
                }
              ]
            },
            "note": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Note pour l’examen"
                },
                {
                  "type": "null"
                }
              ]
            },
            "rejection_reason": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Motif pour lequel la candidature n’a pas été approuvée"
                },
                {
                  "type": "null"
                }
              ]
            },
            "created_at": {
              "type": "string",
              "format": "date-time",
              "description": "Date de la candidature"
            },
            "reviewed_at": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "description": "Date de l’examen"
                },
                {
                  "type": "null"
                }
              ]
            },
            "applied_at": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "description": "Remise active depuis"
                },
                {
                  "type": "null"
                }
              ]
            },
            "revoked_at": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "description": "Date de fin du programme"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "description": "La dernière candidature à un programme de remise, ou null"
        },
        {
          "type": "null"
        }
      ]
    },
    "discount_percent": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Pourcentage de réduction sur Pro et Business issu d’un programme approuvé, ou null"
        },
        {
          "type": "null"
        }
      ]
    },
    "billing_emails": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "tax_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "badge": {
      "type": "object",
      "description": "Bonus du badge (forfait gratuit)"
    },
    "usage": {
      "type": "object",
      "properties": {
        "month": {
          "type": "string",
          "format": "date",
          "description": "Premier jour du mois concerné"
        },
        "events": {
          "type": "integer",
          "description": "Événements facturables (pages vues et événements personnalisés)"
        },
        "bots": {
          "type": "integer",
          "description": "Hits de bots filtrés (non facturés)"
        },
        "allowance": {
          "type": "integer",
          "description": "Événements inclus, avec l’éventuel bonus du badge"
        },
        "percent": {
          "type": "number",
          "description": "Événements en pourcentage du quota"
        },
        "forecast": {
          "anyOf": [
            {
              "type": "integer",
              "description": "Événements prévus en fin de mois"
            },
            {
              "type": "null"
            }
          ]
        },
        "forecast_percent": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ]
        },
        "days_left": {
          "type": "integer",
          "description": "Jours restants dans le mois"
        },
        "status": {
          "type": "string",
          "description": "ok, warning (80 % et plus), over (un mois passé ayant atteint ou dépassé le quota), locked ou paused"
        },
        "sites": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "site_id": {
                "type": "string"
              },
              "domain": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "events": {
                "type": "integer",
                "description": "Pages vues et événements personnalisés ce mois-ci"
              },
              "share": {
                "type": "number",
                "description": "Pourcentage du total de l’espace de travail"
              }
            }
          },
          "description": "Événements par site"
        },
        "history": {
          "type": "array",
          "description": "Mois précédents, les plus récents en premier"
        },
        "access_locked_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "description": "Tableaux de bord verrouillés par l’équipe Privatus Analytics depuis"
            },
            {
              "type": "null"
            }
          ]
        },
        "collection_paused": {
          "type": "boolean",
          "description": "True tant que les nouveaux événements sont ignorés (la limite mensuelle est atteinte, ou l’équipe a mis la collecte en pause)"
        },
        "pause_reason": {
          "anyOf": [
            {
              "type": "string",
              "description": "Pourquoi la collecte est en pause : limit (le quota mensuel est atteint) ou staff. null lorsque la collecte est active"
            },
            {
              "type": "null"
            }
          ]
        },
        "collection_paused_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "description": "Date à laquelle l’équipe a mis la collecte en pause"
            },
            {
              "type": "null"
            }
          ]
        },
        "resumes_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "description": "Fin d’une pause due à la limite : le début du mois suivant (UTC), ou plus tôt en cas de passage à un forfait supérieur. null sinon"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "description": "Ce mois-ci jusqu’à présent"
    }
  }
}
GET /workspaces/:workspace_id/billing.json Obtenir le forfait, l’abonnement et l’utilisation billing_get

Permission : billing.manage

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/billing.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string"
    },
    "plan": {
      "type": "string",
      "description": "free, pro, business ou enterprise"
    },
    "plan_events": {
      "type": "integer",
      "description": "Événements mensuels du palier payant"
    },
    "allowance": {
      "type": "integer",
      "description": "Événements mensuels, bonus du badge inclus"
    },
    "billing_interval": {
      "anyOf": [
        {
          "type": "string",
          "description": "month ou year"
        },
        {
          "type": "null"
        }
      ]
    },
    "price": {
      "anyOf": [
        {
          "type": "integer",
          "description": "USD par intervalle de facturation"
        },
        {
          "type": "null"
        }
      ]
    },
    "subscription_status": {
      "type": "string",
      "description": "none, trialing, active, past_due, paused ou canceled"
    },
    "current_period_ends_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Renouvellement ou fin le"
        },
        {
          "type": "null"
        }
      ]
    },
    "cancel_at_period_end": {
      "type": "boolean"
    },
    "canceled_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "auto_upgrade": {
      "type": "boolean"
    },
    "discount": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "program": {
              "type": "string",
              "description": "nonprofit, education, open_source, open_source_free ou agency"
            },
            "status": {
              "type": "string",
              "description": "pending, approved (pas encore appliqué à l’abonnement), active, rejected ou revoked"
            },
            "percent": {
              "anyOf": [
                {
                  "type": "integer",
                  "description": "Pourcentage de réduction sur Pro et Business (null pour le programme open source gratuit)"
                },
                {
                  "type": "null"
                }
              ]
            },
            "comp_events": {
              "anyOf": [
                {
                  "type": "integer",
                  "description": "Événements gratuits par mois (programme open source gratuit uniquement)"
                },
                {
                  "type": "null"
                }
              ]
            },
            "organization_name": {
              "type": "string",
              "description": "Nom de l’organisation, de l’établissement, du projet ou de l’agence"
            },
            "website": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Site web"
                },
                {
                  "type": "null"
                }
              ]
            },
            "proof_url": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Lien justificatif ou URL du dépôt"
                },
                {
                  "type": "null"
                }
              ]
            },
            "license": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Licence OSI (open source)"
                },
                {
                  "type": "null"
                }
              ]
            },
            "note": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Note pour l’examen"
                },
                {
                  "type": "null"
                }
              ]
            },
            "rejection_reason": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Motif pour lequel la candidature n’a pas été approuvée"
                },
                {
                  "type": "null"
                }
              ]
            },
            "created_at": {
              "type": "string",
              "format": "date-time",
              "description": "Date de la candidature"
            },
            "reviewed_at": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "description": "Date de l’examen"
                },
                {
                  "type": "null"
                }
              ]
            },
            "applied_at": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "description": "Remise active depuis"
                },
                {
                  "type": "null"
                }
              ]
            },
            "revoked_at": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "description": "Date de fin du programme"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "description": "La dernière candidature à un programme de remise, ou null"
        },
        {
          "type": "null"
        }
      ]
    },
    "discount_percent": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Pourcentage de réduction sur Pro et Business issu d’un programme approuvé, ou null"
        },
        {
          "type": "null"
        }
      ]
    },
    "billing_emails": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "tax_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "badge": {
      "type": "object",
      "description": "Bonus du badge (forfait gratuit)"
    },
    "usage": {
      "type": "object",
      "properties": {
        "month": {
          "type": "string",
          "format": "date",
          "description": "Premier jour du mois concerné"
        },
        "events": {
          "type": "integer",
          "description": "Événements facturables (pages vues et événements personnalisés)"
        },
        "bots": {
          "type": "integer",
          "description": "Hits de bots filtrés (non facturés)"
        },
        "allowance": {
          "type": "integer",
          "description": "Événements inclus, avec l’éventuel bonus du badge"
        },
        "percent": {
          "type": "number",
          "description": "Événements en pourcentage du quota"
        },
        "forecast": {
          "anyOf": [
            {
              "type": "integer",
              "description": "Événements prévus en fin de mois"
            },
            {
              "type": "null"
            }
          ]
        },
        "forecast_percent": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ]
        },
        "days_left": {
          "type": "integer",
          "description": "Jours restants dans le mois"
        },
        "status": {
          "type": "string",
          "description": "ok, warning (80 % et plus), over (un mois passé ayant atteint ou dépassé le quota), locked ou paused"
        },
        "sites": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "site_id": {
                "type": "string"
              },
              "domain": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "events": {
                "type": "integer",
                "description": "Pages vues et événements personnalisés ce mois-ci"
              },
              "share": {
                "type": "number",
                "description": "Pourcentage du total de l’espace de travail"
              }
            }
          },
          "description": "Événements par site"
        },
        "history": {
          "type": "array",
          "description": "Mois précédents, les plus récents en premier"
        },
        "access_locked_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "description": "Tableaux de bord verrouillés par l’équipe Privatus Analytics depuis"
            },
            {
              "type": "null"
            }
          ]
        },
        "collection_paused": {
          "type": "boolean",
          "description": "True tant que les nouveaux événements sont ignorés (la limite mensuelle est atteinte, ou l’équipe a mis la collecte en pause)"
        },
        "pause_reason": {
          "anyOf": [
            {
              "type": "string",
              "description": "Pourquoi la collecte est en pause : limit (le quota mensuel est atteint) ou staff. null lorsque la collecte est active"
            },
            {
              "type": "null"
            }
          ]
        },
        "collection_paused_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "description": "Date à laquelle l’équipe a mis la collecte en pause"
            },
            {
              "type": "null"
            }
          ]
        },
        "resumes_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "description": "Fin d’une pause due à la limite : le début du mois suivant (UTC), ou plus tôt en cas de passage à un forfait supérieur. null sinon"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "description": "Ce mois-ci jusqu’à présent"
    }
  }
}
PATCH /workspaces/:workspace_id/billing.json Mettre à jour les e-mails de facturation, le numéro de TVA et la mise à niveau automatique billing_update

Permission : billing.manage

Exemple
curl -X PATCH https://privatusanalytics.com/workspaces/:workspace_id/billing.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "billing_emails": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Adresses supplémentaires pour les factures et avis de facturation (jusqu’à 5)"
    },
    "tax_id": {
      "type": "string",
      "description": "Numéro de TVA/taxe affiché sur les factures"
    },
    "auto_upgrade": {
      "type": "boolean",
      "description": "true pour passer au palier suivant et facturer la différence lorsque la limite mensuelle est atteinte, au lieu de mettre la collecte en pause. Désactivé par défaut"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string"
    },
    "plan": {
      "type": "string",
      "description": "free, pro, business ou enterprise"
    },
    "plan_events": {
      "type": "integer",
      "description": "Événements mensuels du palier payant"
    },
    "allowance": {
      "type": "integer",
      "description": "Événements mensuels, bonus du badge inclus"
    },
    "billing_interval": {
      "anyOf": [
        {
          "type": "string",
          "description": "month ou year"
        },
        {
          "type": "null"
        }
      ]
    },
    "price": {
      "anyOf": [
        {
          "type": "integer",
          "description": "USD par intervalle de facturation"
        },
        {
          "type": "null"
        }
      ]
    },
    "subscription_status": {
      "type": "string",
      "description": "none, trialing, active, past_due, paused ou canceled"
    },
    "current_period_ends_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Renouvellement ou fin le"
        },
        {
          "type": "null"
        }
      ]
    },
    "cancel_at_period_end": {
      "type": "boolean"
    },
    "canceled_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "auto_upgrade": {
      "type": "boolean"
    },
    "discount": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "program": {
              "type": "string",
              "description": "nonprofit, education, open_source, open_source_free ou agency"
            },
            "status": {
              "type": "string",
              "description": "pending, approved (pas encore appliqué à l’abonnement), active, rejected ou revoked"
            },
            "percent": {
              "anyOf": [
                {
                  "type": "integer",
                  "description": "Pourcentage de réduction sur Pro et Business (null pour le programme open source gratuit)"
                },
                {
                  "type": "null"
                }
              ]
            },
            "comp_events": {
              "anyOf": [
                {
                  "type": "integer",
                  "description": "Événements gratuits par mois (programme open source gratuit uniquement)"
                },
                {
                  "type": "null"
                }
              ]
            },
            "organization_name": {
              "type": "string",
              "description": "Nom de l’organisation, de l’établissement, du projet ou de l’agence"
            },
            "website": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Site web"
                },
                {
                  "type": "null"
                }
              ]
            },
            "proof_url": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Lien justificatif ou URL du dépôt"
                },
                {
                  "type": "null"
                }
              ]
            },
            "license": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Licence OSI (open source)"
                },
                {
                  "type": "null"
                }
              ]
            },
            "note": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Note pour l’examen"
                },
                {
                  "type": "null"
                }
              ]
            },
            "rejection_reason": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Motif pour lequel la candidature n’a pas été approuvée"
                },
                {
                  "type": "null"
                }
              ]
            },
            "created_at": {
              "type": "string",
              "format": "date-time",
              "description": "Date de la candidature"
            },
            "reviewed_at": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "description": "Date de l’examen"
                },
                {
                  "type": "null"
                }
              ]
            },
            "applied_at": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "description": "Remise active depuis"
                },
                {
                  "type": "null"
                }
              ]
            },
            "revoked_at": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "description": "Date de fin du programme"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "description": "La dernière candidature à un programme de remise, ou null"
        },
        {
          "type": "null"
        }
      ]
    },
    "discount_percent": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Pourcentage de réduction sur Pro et Business issu d’un programme approuvé, ou null"
        },
        {
          "type": "null"
        }
      ]
    },
    "billing_emails": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "tax_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "badge": {
      "type": "object",
      "description": "Bonus du badge (forfait gratuit)"
    },
    "usage": {
      "type": "object",
      "properties": {
        "month": {
          "type": "string",
          "format": "date",
          "description": "Premier jour du mois concerné"
        },
        "events": {
          "type": "integer",
          "description": "Événements facturables (pages vues et événements personnalisés)"
        },
        "bots": {
          "type": "integer",
          "description": "Hits de bots filtrés (non facturés)"
        },
        "allowance": {
          "type": "integer",
          "description": "Événements inclus, avec l’éventuel bonus du badge"
        },
        "percent": {
          "type": "number",
          "description": "Événements en pourcentage du quota"
        },
        "forecast": {
          "anyOf": [
            {
              "type": "integer",
              "description": "Événements prévus en fin de mois"
            },
            {
              "type": "null"
            }
          ]
        },
        "forecast_percent": {
          "anyOf": [
            {
              "type": "number"
            },
            {
              "type": "null"
            }
          ]
        },
        "days_left": {
          "type": "integer",
          "description": "Jours restants dans le mois"
        },
        "status": {
          "type": "string",
          "description": "ok, warning (80 % et plus), over (un mois passé ayant atteint ou dépassé le quota), locked ou paused"
        },
        "sites": {
          "type": "array",
          "items": {
            "type": "object",
            "properties": {
              "site_id": {
                "type": "string"
              },
              "domain": {
                "type": "string"
              },
              "name": {
                "type": "string"
              },
              "events": {
                "type": "integer",
                "description": "Pages vues et événements personnalisés ce mois-ci"
              },
              "share": {
                "type": "number",
                "description": "Pourcentage du total de l’espace de travail"
              }
            }
          },
          "description": "Événements par site"
        },
        "history": {
          "type": "array",
          "description": "Mois précédents, les plus récents en premier"
        },
        "access_locked_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "description": "Tableaux de bord verrouillés par l’équipe Privatus Analytics depuis"
            },
            {
              "type": "null"
            }
          ]
        },
        "collection_paused": {
          "type": "boolean",
          "description": "True tant que les nouveaux événements sont ignorés (la limite mensuelle est atteinte, ou l’équipe a mis la collecte en pause)"
        },
        "pause_reason": {
          "anyOf": [
            {
              "type": "string",
              "description": "Pourquoi la collecte est en pause : limit (le quota mensuel est atteint) ou staff. null lorsque la collecte est active"
            },
            {
              "type": "null"
            }
          ]
        },
        "collection_paused_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "description": "Date à laquelle l’équipe a mis la collecte en pause"
            },
            {
              "type": "null"
            }
          ]
        },
        "resumes_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time",
              "description": "Fin d’une pause due à la limite : le début du mois suivant (UTC), ou plus tôt en cas de passage à un forfait supérieur. null sinon"
            },
            {
              "type": "null"
            }
          ]
        }
      },
      "description": "Ce mois-ci jusqu’à présent"
    }
  }
}
GET /workspaces/:workspace_id/billing/usage.json Obtenir l’utilisation du mois, la prévision et la répartition par site billing_usage

Permission : billing.manage

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/billing/usage.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "month": {
      "type": "string",
      "format": "date",
      "description": "N’importe quel jour du mois à rapporter (par défaut ce mois-ci)",
      "examples": [
        "2026-09-01"
      ]
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "month": {
      "type": "string",
      "format": "date",
      "description": "Premier jour du mois concerné"
    },
    "events": {
      "type": "integer",
      "description": "Événements facturables (pages vues et événements personnalisés)"
    },
    "bots": {
      "type": "integer",
      "description": "Hits de bots filtrés (non facturés)"
    },
    "allowance": {
      "type": "integer",
      "description": "Événements inclus, avec l’éventuel bonus du badge"
    },
    "percent": {
      "type": "number",
      "description": "Événements en pourcentage du quota"
    },
    "forecast": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Événements prévus en fin de mois"
        },
        {
          "type": "null"
        }
      ]
    },
    "forecast_percent": {
      "anyOf": [
        {
          "type": "number"
        },
        {
          "type": "null"
        }
      ]
    },
    "days_left": {
      "type": "integer",
      "description": "Jours restants dans le mois"
    },
    "status": {
      "type": "string",
      "description": "ok, warning (80 % et plus), over (un mois passé ayant atteint ou dépassé le quota), locked ou paused"
    },
    "sites": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "site_id": {
            "type": "string"
          },
          "domain": {
            "type": "string"
          },
          "name": {
            "type": "string"
          },
          "events": {
            "type": "integer",
            "description": "Pages vues et événements personnalisés ce mois-ci"
          },
          "share": {
            "type": "number",
            "description": "Pourcentage du total de l’espace de travail"
          }
        }
      },
      "description": "Événements par site"
    },
    "history": {
      "type": "array",
      "description": "Mois précédents, les plus récents en premier"
    },
    "access_locked_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Tableaux de bord verrouillés par l’équipe Privatus Analytics depuis"
        },
        {
          "type": "null"
        }
      ]
    },
    "collection_paused": {
      "type": "boolean",
      "description": "True tant que les nouveaux événements sont ignorés (la limite mensuelle est atteinte, ou l’équipe a mis la collecte en pause)"
    },
    "pause_reason": {
      "anyOf": [
        {
          "type": "string",
          "description": "Pourquoi la collecte est en pause : limit (le quota mensuel est atteint) ou staff. null lorsque la collecte est active"
        },
        {
          "type": "null"
        }
      ]
    },
    "collection_paused_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date à laquelle l’équipe a mis la collecte en pause"
        },
        {
          "type": "null"
        }
      ]
    },
    "resumes_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Fin d’une pause due à la limite : le début du mois suivant (UTC), ou plus tôt en cas de passage à un forfait supérieur. null sinon"
        },
        {
          "type": "null"
        }
      ]
    }
  }
}
GET /workspaces/:workspace_id/billing/invoices.json Lister les factures billing_invoices_list

Permission : billing.manage

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/billing/invoices.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant de transaction Paddle"
      },
      "invoice_number": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "status": {
        "type": "string",
        "description": "paid, completed, payment_failed, ..."
      },
      "amount_minor": {
        "type": "integer",
        "description": "Total en unités mineures (centimes)"
      },
      "currency": {
        "type": "string"
      },
      "billed_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      }
    }
  }
}
GET /workspaces/:workspace_id/billing/invoices/:id.json Obtenir le lien PDF d’une facture billing_invoices_get

Permission : billing.manage

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/billing/invoices/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "workspace_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "kind": {
      "type": "string",
      "description": "portal, payment_method ou invoice"
    },
    "url": {
      "anyOf": [
        {
          "type": "string",
          "description": "URL Paddle de courte durée"
        },
        {
          "type": "null"
        }
      ]
    }
  }
}

Forfaits

GET /plans.json Lister les forfaits, prix et limites plans_list

Permission : public

Exemple
curl https://privatusanalytics.com/plans.json
Entrées
{
  "type": "object",
  "properties": {
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": []
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "name": {
        "type": "string",
        "description": "free, pro, business ou enterprise"
      },
      "events": {
        "anyOf": [
          {
            "type": "integer",
            "description": "Événements mensuels inclus (forfait gratuit uniquement)"
          },
          {
            "type": "null"
          }
        ]
      },
      "badge_bonus": {
        "anyOf": [
          {
            "type": "integer",
            "description": "Événements mensuels supplémentaires pour l’affichage du badge (forfait gratuit)"
          },
          {
            "type": "null"
          }
        ]
      },
      "limits": {
        "type": "object",
        "description": "Limites du forfait. Null signifie illimité"
      },
      "tiers": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "events": {
              "type": "integer",
              "description": "Événements mensuels inclus"
            },
            "monthly": {
              "type": "integer",
              "description": "USD par mois, facturé mensuellement"
            },
            "yearly": {
              "type": "integer",
              "description": "USD par an, facturé annuellement (2 mois offerts)"
            },
            "monthly_price_id": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Identifiant de prix Paddle (mensuel)"
                },
                {
                  "type": "null"
                }
              ]
            },
            "yearly_price_id": {
              "anyOf": [
                {
                  "type": "string",
                  "description": "Identifiant de prix Paddle (annuel)"
                },
                {
                  "type": "null"
                }
              ]
            }
          }
        },
        "description": "Échelle de prix par événements mensuels"
      },
      "contact_sales": {
        "type": "boolean",
        "description": "Tarifé par contrat"
      }
    }
  }
}

Imports

GET /sites/:site_id/imports/google/properties.json Lister les propriétés Google Analytics 4 à importer imports_google_properties

Permission : sites.manage

Exemple
curl https://privatusanalytics.com/sites/:site_id/imports/google/properties.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
POST /sites/:site_id/imports.json Démarrer un import (propriété GA4 ou envoi de CSV) imports_create

Permission : sites.manage

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/imports.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "source": {
      "type": "string",
      "description": "ga4 (API Google Analytics 4) ou l’outil dont vous envoyez l’export CSV",
      "enum": [
        "ga4",
        "universal_analytics",
        "fathom",
        "simple_analytics",
        "plausible",
        "matomo",
        "umami",
        "clicky"
      ]
    },
    "property_id": {
      "type": "string",
      "description": "Propriété GA4, par ex. properties/123 (voir imports_google_properties). Obligatoire pour ga4",
      "examples": [
        "properties/123456789"
      ]
    },
    "date_from": {
      "type": "string",
      "format": "date",
      "description": "Premier jour à importer. Obligatoire pour ga4. Pour les fichiers CSV sans colonne de date, chaque ligne est datée de ce jour"
    },
    "date_to": {
      "type": "string",
      "format": "date",
      "description": "Dernier jour à importer (ga4 utilise par défaut la veille de votre premier événement suivi, ou hier)"
    },
    "file": {
      "type": "string",
      "format": "binary",
      "description": "Export CSV (envoi multipart, 50 Mo maximum). Obligatoire pour les sources CSV"
    },
    "dimension": {
      "type": "string",
      "description": "Ce que les lignes du CSV ventilent (remplace la détection, nécessaire pour les exports « Label » de Matomo)",
      "enum": [
        "total",
        "page",
        "source",
        "country",
        "device",
        "browser",
        "os"
      ]
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "source",
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’import"
    },
    "site_id": {
      "type": "string"
    },
    "source": {
      "type": "string",
      "description": "ga4, universal_analytics, fathom, simple_analytics, plausible, matomo, umami ou clicky"
    },
    "status": {
      "type": "string",
      "description": "queued, running, complete ou failed"
    },
    "date_from": {
      "anyOf": [
        {
          "type": "string",
          "format": "date",
          "description": "Premier jour importé"
        },
        {
          "type": "null"
        }
      ]
    },
    "date_to": {
      "anyOf": [
        {
          "type": "string",
          "format": "date",
          "description": "Dernier jour importé"
        },
        {
          "type": "null"
        }
      ]
    },
    "rows_imported": {
      "type": "integer",
      "description": "Lignes quotidiennes stockées"
    },
    "error": {
      "anyOf": [
        {
          "type": "string",
          "description": "Motif de l’échec de l’import"
        },
        {
          "type": "null"
        }
      ]
    },
    "completed_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /sites/:site_id/imports/:id.json Supprimer un import et toutes ses données importées imports_delete

Permission : sites.manage

Exemple
curl -X DELETE https://privatusanalytics.com/sites/:site_id/imports/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’import"
    },
    "site_id": {
      "type": "string"
    },
    "source": {
      "type": "string",
      "description": "ga4, universal_analytics, fathom, simple_analytics, plausible, matomo, umami ou clicky"
    },
    "status": {
      "type": "string",
      "description": "queued, running, complete ou failed"
    },
    "date_from": {
      "anyOf": [
        {
          "type": "string",
          "format": "date",
          "description": "Premier jour importé"
        },
        {
          "type": "null"
        }
      ]
    },
    "date_to": {
      "anyOf": [
        {
          "type": "string",
          "format": "date",
          "description": "Dernier jour importé"
        },
        {
          "type": "null"
        }
      ]
    },
    "rows_imported": {
      "type": "integer",
      "description": "Lignes quotidiennes stockées"
    },
    "error": {
      "anyOf": [
        {
          "type": "string",
          "description": "Motif de l’échec de l’import"
        },
        {
          "type": "null"
        }
      ]
    },
    "completed_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /sites/:site_id/imports.json Lister les imports d’un site imports_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/imports.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "description": "Uniquement les imports avec ce statut",
      "enum": [
        "queued",
        "running",
        "complete",
        "failed"
      ]
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant d’import"
      },
      "site_id": {
        "type": "string"
      },
      "source": {
        "type": "string",
        "description": "ga4, universal_analytics, fathom, simple_analytics, plausible, matomo, umami ou clicky"
      },
      "status": {
        "type": "string",
        "description": "queued, running, complete ou failed"
      },
      "date_from": {
        "anyOf": [
          {
            "type": "string",
            "format": "date",
            "description": "Premier jour importé"
          },
          {
            "type": "null"
          }
        ]
      },
      "date_to": {
        "anyOf": [
          {
            "type": "string",
            "format": "date",
            "description": "Dernier jour importé"
          },
          {
            "type": "null"
          }
        ]
      },
      "rows_imported": {
        "type": "integer",
        "description": "Lignes quotidiennes stockées"
      },
      "error": {
        "anyOf": [
          {
            "type": "string",
            "description": "Motif de l’échec de l’import"
          },
          {
            "type": "null"
          }
        ]
      },
      "completed_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
GET /sites/:site_id/imports/:id.json Obtenir un import et son statut imports_get

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/imports/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’import"
    },
    "site_id": {
      "type": "string"
    },
    "source": {
      "type": "string",
      "description": "ga4, universal_analytics, fathom, simple_analytics, plausible, matomo, umami ou clicky"
    },
    "status": {
      "type": "string",
      "description": "queued, running, complete ou failed"
    },
    "date_from": {
      "anyOf": [
        {
          "type": "string",
          "format": "date",
          "description": "Premier jour importé"
        },
        {
          "type": "null"
        }
      ]
    },
    "date_to": {
      "anyOf": [
        {
          "type": "string",
          "format": "date",
          "description": "Dernier jour importé"
        },
        {
          "type": "null"
        }
      ]
    },
    "rows_imported": {
      "type": "integer",
      "description": "Lignes quotidiennes stockées"
    },
    "error": {
      "anyOf": [
        {
          "type": "string",
          "description": "Motif de l’échec de l’import"
        },
        {
          "type": "null"
        }
      ]
    },
    "completed_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

Jetons d’API

POST /workspaces/:workspace_id/api_tokens.json Créer un jeton d’API (le jeton n’est renvoyé qu’une fois) api_tokens_create

Permission : member

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/api_tokens.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Un nom pour reconnaître le jeton",
      "examples": [
        "CI deploys"
      ]
    },
    "permissions": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "analytics.read",
          "analytics.export",
          "content.write",
          "sites.manage",
          "uptime.manage",
          "members.manage",
          "tokens.manage",
          "billing.manage",
          "workspace.manage"
        ]
      },
      "description": "Permissions (omettez pour toutes les vôtres, une liste vide est refusée)"
    },
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Restreindre à ces identifiants de site (pa_…). Vide = tous",
      "default": []
    },
    "expires_at": {
      "type": "string",
      "format": "date-time",
      "description": "Date d’expiration (ISO 8601). Vide = jamais"
    },
    "allowed_ips": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Accepter uniquement les requêtes provenant de ces IP/CIDR",
      "default": []
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "name",
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "name": {
      "type": "string"
    },
    "token": {
      "anyOf": [
        {
          "type": "string",
          "description": "Le jeton lui-même : renvoyé uniquement à la création"
        },
        {
          "type": "null"
        }
      ]
    },
    "token_prefix": {
      "type": "string",
      "description": "Premiers caractères, pour reconnaître le jeton"
    },
    "owner": {
      "type": "string",
      "description": "E-mail du membre à qui il appartient"
    },
    "permissions": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Restreint à ces sites (vide = tous)"
    },
    "allowed_ips": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "oauth_client": {
      "anyOf": [
        {
          "type": "string",
          "description": "Client MCP qui l’a reçu"
        },
        {
          "type": "null"
        }
      ]
    },
    "status": {
      "type": "string",
      "description": "active, expired ou revoked"
    },
    "expires_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_used_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "revoked_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /workspaces/:workspace_id/api_tokens/:id.json Révoquer un jeton d’API api_tokens_delete

Permission : member

Exemple
curl -X DELETE https://privatusanalytics.com/workspaces/:workspace_id/api_tokens/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "workspace_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "name": {
      "type": "string"
    },
    "token": {
      "anyOf": [
        {
          "type": "string",
          "description": "Le jeton lui-même : renvoyé uniquement à la création"
        },
        {
          "type": "null"
        }
      ]
    },
    "token_prefix": {
      "type": "string",
      "description": "Premiers caractères, pour reconnaître le jeton"
    },
    "owner": {
      "type": "string",
      "description": "E-mail du membre à qui il appartient"
    },
    "permissions": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Restreint à ces sites (vide = tous)"
    },
    "allowed_ips": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "oauth_client": {
      "anyOf": [
        {
          "type": "string",
          "description": "Client MCP qui l’a reçu"
        },
        {
          "type": "null"
        }
      ]
    },
    "status": {
      "type": "string",
      "description": "active, expired ou revoked"
    },
    "expires_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_used_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "revoked_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /workspaces/:workspace_id/api_tokens.json Lister les jetons d’API api_tokens_list

Permission : member

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/api_tokens.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "include_revoked": {
      "type": "boolean",
      "description": "Lister aussi les jetons révoqués et expirés",
      "default": false
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "format": "uuid"
      },
      "name": {
        "type": "string"
      },
      "token": {
        "anyOf": [
          {
            "type": "string",
            "description": "Le jeton lui-même : renvoyé uniquement à la création"
          },
          {
            "type": "null"
          }
        ]
      },
      "token_prefix": {
        "type": "string",
        "description": "Premiers caractères, pour reconnaître le jeton"
      },
      "owner": {
        "type": "string",
        "description": "E-mail du membre à qui il appartient"
      },
      "permissions": {
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "site_ids": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "description": "Restreint à ces sites (vide = tous)"
      },
      "allowed_ips": {
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "oauth_client": {
        "anyOf": [
          {
            "type": "string",
            "description": "Client MCP qui l’a reçu"
          },
          {
            "type": "null"
          }
        ]
      },
      "status": {
        "type": "string",
        "description": "active, expired ou revoked"
      },
      "expires_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "last_used_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "revoked_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}

Journal d’audit

GET /workspaces/:workspace_id/audit_log.json Lister les entrées du journal d’audit (ajoutez .csv pour exporter) audit_logs_get

Permission : workspace.manage

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/audit_log.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "actor": {
      "type": "string",
      "description": "Uniquement les modifications de ce membre (e-mail)"
    },
    "item_type": {
      "type": "string",
      "description": "Uniquement ce type d’enregistrement, par ex. Site"
    },
    "event": {
      "type": "string",
      "description": "Uniquement cette action",
      "enum": [
        "create",
        "update",
        "destroy"
      ]
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "À partir de la date (incluse)"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Jusqu’à la date (incluse)"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "format": "uuid"
      },
      "created_at": {
        "type": "string",
        "format": "date-time",
        "description": "Quand"
      },
      "event": {
        "type": "string",
        "description": "create, update ou destroy"
      },
      "item_type": {
        "type": "string",
        "description": "Type d’enregistrement, par ex. Site"
      },
      "item_id": {
        "type": "string",
        "format": "uuid"
      },
      "target": {
        "type": "string",
        "description": "L’enregistrement, par son nom lorsqu’il est connu"
      },
      "actor_email": {
        "anyOf": [
          {
            "type": "string",
            "description": "Membre qui a effectué la modification"
          },
          {
            "type": "null"
          }
        ]
      },
      "actor_name": {
        "type": "string"
      },
      "token_name": {
        "anyOf": [
          {
            "type": "string",
            "description": "Jeton d’API utilisé, le cas échéant"
          },
          {
            "type": "null"
          }
        ]
      },
      "changes": {
        "type": "object",
        "description": "Champs modifiés : { field: [avant, après] }"
      },
      "ip": {
        "anyOf": [
          {
            "type": "string",
            "description": "L’adresse IP du membre"
          },
          {
            "type": "null"
          }
        ]
      }
    }
  }
}

Membres

POST /workspaces/:workspace_id/invitations.json Inviter des personnes par e-mail invitations_create

Permission : members.manage

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/invitations.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "emails": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Adresses e-mail à inviter"
    },
    "role": {
      "type": "string",
      "description": "Rôle des nouveaux membres (custom nécessite custom_role_id)",
      "enum": [
        "admin",
        "editor",
        "analyst",
        "viewer",
        "billing",
        "custom"
      ],
      "default": "viewer"
    },
    "custom_role_id": {
      "type": "string",
      "description": "Identifiant du rôle personnalisé (Business)"
    },
    "all_sites": {
      "type": "boolean",
      "description": "Accès à tous les sites, y compris futurs",
      "default": true
    },
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des sites (pa_…) lorsque all_sites est false",
      "default": []
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "emails",
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "email": {
      "type": "string"
    },
    "role": {
      "type": "string"
    },
    "custom_role": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "all_sites": {
      "type": "boolean"
    },
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "invited_by": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "expires_at": {
      "type": "string",
      "format": "date-time"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /workspaces/:workspace_id/invitations/:id.json Révoquer une invitation en attente invitations_delete

Permission : members.manage

Exemple
curl -X DELETE https://privatusanalytics.com/workspaces/:workspace_id/invitations/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "workspace_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "email": {
      "type": "string"
    },
    "role": {
      "type": "string"
    },
    "custom_role": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "all_sites": {
      "type": "boolean"
    },
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "invited_by": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "expires_at": {
      "type": "string",
      "format": "date-time"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /workspaces/:workspace_id/invitations.json Lister les invitations en attente invitations_list

Permission : members.manage

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/invitations.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "format": "uuid"
      },
      "email": {
        "type": "string"
      },
      "role": {
        "type": "string"
      },
      "custom_role": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "all_sites": {
        "type": "boolean"
      },
      "site_ids": {
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "invited_by": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "expires_at": {
        "type": "string",
        "format": "date-time"
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
DELETE /workspaces/:workspace_id/members/:id.json Retirer un membre (ou quitter l’espace de travail) members_delete

Permission : member

Exemple
curl -X DELETE https://privatusanalytics.com/workspaces/:workspace_id/members/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "workspace_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Identifiant du membre (à utiliser pour le modifier ou le retirer)"
    },
    "email": {
      "type": "string"
    },
    "name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "role": {
      "type": "string",
      "description": "owner, admin, editor, analyst, viewer, billing ou custom"
    },
    "custom_role": {
      "anyOf": [
        {
          "type": "string",
          "description": "Nom du rôle personnalisé"
        },
        {
          "type": "null"
        }
      ]
    },
    "custom_role_id": {
      "anyOf": [
        {
          "type": "string",
          "format": "uuid"
        },
        {
          "type": "null"
        }
      ]
    },
    "all_sites": {
      "type": "boolean",
      "description": "Accès à tous les sites"
    },
    "include_future_sites": {
      "type": "boolean"
    },
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des sites lorsque all_sites est false"
    },
    "two_factor": {
      "type": "boolean",
      "description": "A la 2FA ou une clé d’accès"
    },
    "last_active_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time",
      "description": "Date d’arrivée"
    }
  }
}
GET /workspaces/:workspace_id/members.json Lister les membres de l’espace de travail members_list

Permission : member

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/members.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Filtrer par nom ou e-mail"
    },
    "role": {
      "type": "string",
      "description": "Uniquement les membres ayant ce rôle",
      "enum": [
        "owner",
        "admin",
        "editor",
        "analyst",
        "viewer",
        "billing",
        "custom"
      ]
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "format": "uuid",
        "description": "Identifiant du membre (à utiliser pour le modifier ou le retirer)"
      },
      "email": {
        "type": "string"
      },
      "name": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "role": {
        "type": "string",
        "description": "owner, admin, editor, analyst, viewer, billing ou custom"
      },
      "custom_role": {
        "anyOf": [
          {
            "type": "string",
            "description": "Nom du rôle personnalisé"
          },
          {
            "type": "null"
          }
        ]
      },
      "custom_role_id": {
        "anyOf": [
          {
            "type": "string",
            "format": "uuid"
          },
          {
            "type": "null"
          }
        ]
      },
      "all_sites": {
        "type": "boolean",
        "description": "Accès à tous les sites"
      },
      "include_future_sites": {
        "type": "boolean"
      },
      "site_ids": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "description": "Identifiants des sites lorsque all_sites est false"
      },
      "two_factor": {
        "type": "boolean",
        "description": "A la 2FA ou une clé d’accès"
      },
      "last_active_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "created_at": {
        "type": "string",
        "format": "date-time",
        "description": "Date d’arrivée"
      }
    }
  }
}
PATCH /workspaces/:workspace_id/members/:id.json Modifier le rôle ou l’accès aux sites d’un membre members_update

Permission : members.manage

Exemple
curl -X PATCH https://privatusanalytics.com/workspaces/:workspace_id/members/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "role": {
      "type": "string",
      "description": "Nouveau rôle (custom nécessite custom_role_id)",
      "enum": [
        "admin",
        "editor",
        "analyst",
        "viewer",
        "billing",
        "custom"
      ]
    },
    "custom_role_id": {
      "type": "string",
      "description": "Identifiant du rôle personnalisé (Business)"
    },
    "all_sites": {
      "type": "boolean",
      "description": "Accès à tous les sites, y compris futurs"
    },
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des sites (pa_…) lorsque all_sites est false"
    },
    "include_future_sites": {
      "type": "boolean",
      "description": "Accorder aussi l’accès aux sites ajoutés plus tard"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "workspace_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Identifiant du membre (à utiliser pour le modifier ou le retirer)"
    },
    "email": {
      "type": "string"
    },
    "name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "role": {
      "type": "string",
      "description": "owner, admin, editor, analyst, viewer, billing ou custom"
    },
    "custom_role": {
      "anyOf": [
        {
          "type": "string",
          "description": "Nom du rôle personnalisé"
        },
        {
          "type": "null"
        }
      ]
    },
    "custom_role_id": {
      "anyOf": [
        {
          "type": "string",
          "format": "uuid"
        },
        {
          "type": "null"
        }
      ]
    },
    "all_sites": {
      "type": "boolean",
      "description": "Accès à tous les sites"
    },
    "include_future_sites": {
      "type": "boolean"
    },
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des sites lorsque all_sites est false"
    },
    "two_factor": {
      "type": "boolean",
      "description": "A la 2FA ou une clé d’accès"
    },
    "last_active_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time",
      "description": "Date d’arrivée"
    }
  }
}
POST /workspaces/:workspace_id/ownership_transfer.json Transférer la propriété de l’espace de travail à un autre membre (propriétaire uniquement, vous devenez administrateur) ownership_transfers_create

Permission : member

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/ownership_transfer.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "membership_id": {
      "type": "string",
      "description": "Identifiant du membre qui devient propriétaire"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "membership_id",
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Identifiant du membre (à utiliser pour le modifier ou le retirer)"
    },
    "email": {
      "type": "string"
    },
    "name": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "role": {
      "type": "string",
      "description": "owner, admin, editor, analyst, viewer, billing ou custom"
    },
    "custom_role": {
      "anyOf": [
        {
          "type": "string",
          "description": "Nom du rôle personnalisé"
        },
        {
          "type": "null"
        }
      ]
    },
    "custom_role_id": {
      "anyOf": [
        {
          "type": "string",
          "format": "uuid"
        },
        {
          "type": "null"
        }
      ]
    },
    "all_sites": {
      "type": "boolean",
      "description": "Accès à tous les sites"
    },
    "include_future_sites": {
      "type": "boolean"
    },
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des sites lorsque all_sites est false"
    },
    "two_factor": {
      "type": "boolean",
      "description": "A la 2FA ou une clé d’accès"
    },
    "last_active_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time",
      "description": "Date d’arrivée"
    }
  }
}

Notes

POST /sites/:site_id/notes.json Ajouter une note à un site (utilisez la source "deploy" pour les webhooks de version) notes_create

Permission : content.write

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/notes.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "date": {
      "type": "string",
      "format": "date",
      "description": "Jour de la note (fuseau horaire du site). Par défaut aujourd’hui"
    },
    "end_date": {
      "type": "string",
      "format": "date",
      "description": "Dernier jour, pour une plage de dates"
    },
    "title": {
      "type": "string",
      "description": "Titre court affiché sur les graphiques",
      "examples": [
        "Launched new pricing"
      ]
    },
    "body": {
      "type": "string",
      "description": "Détails (Markdown)"
    },
    "url": {
      "type": "string",
      "description": "Lien, par ex. une PR ou un journal des modifications"
    },
    "color": {
      "type": "string",
      "description": "Couleur de l’épingle",
      "enum": [
        "neutral",
        "brand",
        "blue",
        "amber",
        "red",
        "violet"
      ]
    },
    "source": {
      "type": "string",
      "description": "manual, ou deploy pour les webhooks de version",
      "enum": [
        "manual",
        "deploy",
        "system",
        "import",
        "incident"
      ],
      "default": "manual"
    },
    "version": {
      "type": "string",
      "description": "Déploiements : version ou commit, utilisé pour le titre par défaut"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de note, par ex. note_7Q2K9XH3AB"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Site, ou null pour les notes de l’espace de travail"
        },
        {
          "type": "null"
        }
      ]
    },
    "date": {
      "type": "string",
      "format": "date"
    },
    "end_date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ]
    },
    "title": {
      "type": "string"
    },
    "body": {
      "anyOf": [
        {
          "type": "string",
          "description": "Markdown"
        },
        {
          "type": "null"
        }
      ]
    },
    "url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "color": {
      "type": "string",
      "description": "neutral, brand, blue, amber, red, violet"
    },
    "source": {
      "type": "string",
      "description": "manual, deploy, system, import, incident"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /sites/:site_id/notes/:id.json Supprimer une note notes_delete

Permission : content.write

Exemple
curl -X DELETE https://privatusanalytics.com/sites/:site_id/notes/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de note, par ex. note_7Q2K9XH3AB"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Site, ou null pour les notes de l’espace de travail"
        },
        {
          "type": "null"
        }
      ]
    },
    "date": {
      "type": "string",
      "format": "date"
    },
    "end_date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ]
    },
    "title": {
      "type": "string"
    },
    "body": {
      "anyOf": [
        {
          "type": "string",
          "description": "Markdown"
        },
        {
          "type": "null"
        }
      ]
    },
    "url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "color": {
      "type": "string",
      "description": "neutral, brand, blue, amber, red, violet"
    },
    "source": {
      "type": "string",
      "description": "manual, deploy, system, import, incident"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /sites/:site_id/notes.json Lister les notes d’un site (y compris les notes de l’espace de travail) notes_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/notes.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "from": {
      "type": "string",
      "format": "date",
      "description": "Uniquement les notes à partir de cette date"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Uniquement les notes jusqu’à cette date"
    },
    "source": {
      "type": "string",
      "description": "Uniquement les notes de cette source",
      "enum": [
        "manual",
        "deploy",
        "system",
        "import",
        "incident"
      ]
    },
    "query": {
      "type": "string",
      "description": "Rechercher dans le titre, le contenu et le lien"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant de note, par ex. note_7Q2K9XH3AB"
      },
      "site_id": {
        "anyOf": [
          {
            "type": "string",
            "description": "Site, ou null pour les notes de l’espace de travail"
          },
          {
            "type": "null"
          }
        ]
      },
      "date": {
        "type": "string",
        "format": "date"
      },
      "end_date": {
        "anyOf": [
          {
            "type": "string",
            "format": "date"
          },
          {
            "type": "null"
          }
        ]
      },
      "title": {
        "type": "string"
      },
      "body": {
        "anyOf": [
          {
            "type": "string",
            "description": "Markdown"
          },
          {
            "type": "null"
          }
        ]
      },
      "url": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "color": {
        "type": "string",
        "description": "neutral, brand, blue, amber, red, violet"
      },
      "source": {
        "type": "string",
        "description": "manual, deploy, system, import, incident"
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
GET /sites/:site_id/notes/:id.json Obtenir une note notes_get

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/notes/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de note, par ex. note_7Q2K9XH3AB"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Site, ou null pour les notes de l’espace de travail"
        },
        {
          "type": "null"
        }
      ]
    },
    "date": {
      "type": "string",
      "format": "date"
    },
    "end_date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ]
    },
    "title": {
      "type": "string"
    },
    "body": {
      "anyOf": [
        {
          "type": "string",
          "description": "Markdown"
        },
        {
          "type": "null"
        }
      ]
    },
    "url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "color": {
      "type": "string",
      "description": "neutral, brand, blue, amber, red, violet"
    },
    "source": {
      "type": "string",
      "description": "manual, deploy, system, import, incident"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
PATCH /sites/:site_id/notes/:id.json Modifier une note notes_update

Permission : content.write

Exemple
curl -X PATCH https://privatusanalytics.com/sites/:site_id/notes/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "date": {
      "type": "string",
      "format": "date",
      "description": "Jour de la note"
    },
    "end_date": {
      "type": "string",
      "format": "date",
      "description": "Dernier jour, pour une plage de dates"
    },
    "title": {
      "type": "string",
      "description": "Titre court affiché sur les graphiques"
    },
    "body": {
      "type": "string",
      "description": "Détails (Markdown)"
    },
    "url": {
      "type": "string",
      "description": "Lien"
    },
    "color": {
      "type": "string",
      "description": "Couleur de l’épingle",
      "enum": [
        "neutral",
        "brand",
        "blue",
        "amber",
        "red",
        "violet"
      ]
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de note, par ex. note_7Q2K9XH3AB"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Site, ou null pour les notes de l’espace de travail"
        },
        {
          "type": "null"
        }
      ]
    },
    "date": {
      "type": "string",
      "format": "date"
    },
    "end_date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ]
    },
    "title": {
      "type": "string"
    },
    "body": {
      "anyOf": [
        {
          "type": "string",
          "description": "Markdown"
        },
        {
          "type": "null"
        }
      ]
    },
    "url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "color": {
      "type": "string",
      "description": "neutral, brand, blue, amber, red, violet"
    },
    "source": {
      "type": "string",
      "description": "manual, deploy, system, import, incident"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
POST /workspaces/:workspace_id/notes.json Ajouter une note pour tout l’espace de travail (affichée sur chaque site) workspace_notes_create

Permission : content.write

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/notes.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "date": {
      "type": "string",
      "format": "date",
      "description": "Jour de la note (fuseau horaire du site). Par défaut aujourd’hui"
    },
    "end_date": {
      "type": "string",
      "format": "date",
      "description": "Dernier jour, pour une plage de dates"
    },
    "title": {
      "type": "string",
      "description": "Titre court affiché sur les graphiques",
      "examples": [
        "Launched new pricing"
      ]
    },
    "body": {
      "type": "string",
      "description": "Détails (Markdown)"
    },
    "url": {
      "type": "string",
      "description": "Lien, par ex. une PR ou un journal des modifications"
    },
    "color": {
      "type": "string",
      "description": "Couleur de l’épingle",
      "enum": [
        "neutral",
        "brand",
        "blue",
        "amber",
        "red",
        "violet"
      ]
    },
    "source": {
      "type": "string",
      "description": "manual, ou deploy pour les webhooks de version",
      "enum": [
        "manual",
        "deploy",
        "system",
        "import",
        "incident"
      ],
      "default": "manual"
    },
    "version": {
      "type": "string",
      "description": "Déploiements : version ou commit, utilisé pour le titre par défaut"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de note, par ex. note_7Q2K9XH3AB"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Site, ou null pour les notes de l’espace de travail"
        },
        {
          "type": "null"
        }
      ]
    },
    "date": {
      "type": "string",
      "format": "date"
    },
    "end_date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ]
    },
    "title": {
      "type": "string"
    },
    "body": {
      "anyOf": [
        {
          "type": "string",
          "description": "Markdown"
        },
        {
          "type": "null"
        }
      ]
    },
    "url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "color": {
      "type": "string",
      "description": "neutral, brand, blue, amber, red, violet"
    },
    "source": {
      "type": "string",
      "description": "manual, deploy, system, import, incident"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /workspaces/:workspace_id/notes/:id.json Supprimer une note de l’espace de travail workspace_notes_delete

Permission : content.write

Exemple
curl -X DELETE https://privatusanalytics.com/workspaces/:workspace_id/notes/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "workspace_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de note, par ex. note_7Q2K9XH3AB"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Site, ou null pour les notes de l’espace de travail"
        },
        {
          "type": "null"
        }
      ]
    },
    "date": {
      "type": "string",
      "format": "date"
    },
    "end_date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ]
    },
    "title": {
      "type": "string"
    },
    "body": {
      "anyOf": [
        {
          "type": "string",
          "description": "Markdown"
        },
        {
          "type": "null"
        }
      ]
    },
    "url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "color": {
      "type": "string",
      "description": "neutral, brand, blue, amber, red, violet"
    },
    "source": {
      "type": "string",
      "description": "manual, deploy, system, import, incident"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /workspaces/:workspace_id/notes.json Lister les notes d’un espace de travail workspace_notes_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/notes.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "from": {
      "type": "string",
      "format": "date",
      "description": "Uniquement les notes à partir de cette date"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Uniquement les notes jusqu’à cette date"
    },
    "source": {
      "type": "string",
      "description": "Uniquement les notes de cette source",
      "enum": [
        "manual",
        "deploy",
        "system",
        "import",
        "incident"
      ]
    },
    "query": {
      "type": "string",
      "description": "Rechercher dans le titre, le contenu et le lien"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant de note, par ex. note_7Q2K9XH3AB"
      },
      "site_id": {
        "anyOf": [
          {
            "type": "string",
            "description": "Site, ou null pour les notes de l’espace de travail"
          },
          {
            "type": "null"
          }
        ]
      },
      "date": {
        "type": "string",
        "format": "date"
      },
      "end_date": {
        "anyOf": [
          {
            "type": "string",
            "format": "date"
          },
          {
            "type": "null"
          }
        ]
      },
      "title": {
        "type": "string"
      },
      "body": {
        "anyOf": [
          {
            "type": "string",
            "description": "Markdown"
          },
          {
            "type": "null"
          }
        ]
      },
      "url": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "color": {
        "type": "string",
        "description": "neutral, brand, blue, amber, red, violet"
      },
      "source": {
        "type": "string",
        "description": "manual, deploy, system, import, incident"
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
PATCH /workspaces/:workspace_id/notes/:id.json Modifier une note de l’espace de travail workspace_notes_update

Permission : content.write

Exemple
curl -X PATCH https://privatusanalytics.com/workspaces/:workspace_id/notes/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "date": {
      "type": "string",
      "format": "date",
      "description": "Jour de la note"
    },
    "end_date": {
      "type": "string",
      "format": "date",
      "description": "Dernier jour, pour une plage de dates"
    },
    "title": {
      "type": "string",
      "description": "Titre court affiché sur les graphiques"
    },
    "body": {
      "type": "string",
      "description": "Détails (Markdown)"
    },
    "url": {
      "type": "string",
      "description": "Lien"
    },
    "color": {
      "type": "string",
      "description": "Couleur de l’épingle",
      "enum": [
        "neutral",
        "brand",
        "blue",
        "amber",
        "red",
        "violet"
      ]
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "workspace_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de note, par ex. note_7Q2K9XH3AB"
    },
    "site_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Site, ou null pour les notes de l’espace de travail"
        },
        {
          "type": "null"
        }
      ]
    },
    "date": {
      "type": "string",
      "format": "date"
    },
    "end_date": {
      "anyOf": [
        {
          "type": "string",
          "format": "date"
        },
        {
          "type": "null"
        }
      ]
    },
    "title": {
      "type": "string"
    },
    "body": {
      "anyOf": [
        {
          "type": "string",
          "description": "Markdown"
        },
        {
          "type": "null"
        }
      ]
    },
    "url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "color": {
      "type": "string",
      "description": "neutral, brand, blue, amber, red, violet"
    },
    "source": {
      "type": "string",
      "description": "manual, deploy, system, import, incident"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

Objectifs

POST /sites/:site_id/goals/:id/archive.json Archiver un objectif (masqué dans les rapports) goals_archive

Permission : content.write

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/goals/:id/archive.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’objectif, par ex. goal_7Q2K9XH3AB"
    },
    "name": {
      "type": "string"
    },
    "kind": {
      "type": "string",
      "description": "page, event, engagement, outbound ou download"
    },
    "match_type": {
      "type": "string",
      "description": "exact, prefix, glob ou regex"
    },
    "pattern": {
      "anyOf": [
        {
          "type": "string",
          "description": "Motif de chemin, de domaine ou de fichier"
        },
        {
          "type": "null"
        }
      ]
    },
    "hostname": {
      "anyOf": [
        {
          "type": "string",
          "description": "Restriction de nom d’hôte (objectifs page)"
        },
        {
          "type": "null"
        }
      ]
    },
    "event_name": {
      "anyOf": [
        {
          "type": "string",
          "description": "Nom de l’événement personnalisé (objectifs event)"
        },
        {
          "type": "null"
        }
      ]
    },
    "conditions": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Conditions sur les propriétés de l’événement"
    },
    "scroll_threshold": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Engagement : % de défilement"
        },
        {
          "type": "null"
        }
      ]
    },
    "time_threshold_seconds": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Engagement : secondes sur la page"
        },
        {
          "type": "null"
        }
      ]
    },
    "value_mode": {
      "type": "string",
      "description": "none, fixed ou revenue"
    },
    "fixed_value_minor": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Valeur fixe en unités mineures"
        },
        {
          "type": "null"
        }
      ]
    },
    "count_mode": {
      "type": "string",
      "description": "once_per_visit ou every"
    },
    "archived": {
      "type": "boolean"
    },
    "archived_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "stats": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "completions": {
              "type": "integer",
              "description": "Événements correspondants, répétitions comprises"
            },
            "conversions": {
              "type": "integer",
              "description": "Visites avec au moins une réalisation"
            },
            "conversion_rate": {
              "type": "number",
              "description": "Conversions ÷ visites (ou ÷ visiteurs, selon le paramètre du site), %"
            },
            "value": {
              "type": "integer",
              "description": "Valeur de l’objectif en unités mineures de la devise du site"
            },
            "change": {
              "anyOf": [
                {
                  "type": "number",
                  "description": "Variation des conversions par rapport à la période précédente, %"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "description": "Statistiques de la période (liste uniquement)"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
POST /sites/:site_id/goals.json Créer un objectif goals_create

Permission : content.write

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/goals.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nom de l’objectif",
      "examples": [
        "Signed up"
      ]
    },
    "kind": {
      "type": "string",
      "description": "page (visite d’une page), event (événement personnalisé), engagement (défilement ou temps sur la page), outbound (clic sur un lien sortant) ou download (téléchargement de fichier)",
      "enum": [
        "page",
        "event",
        "engagement",
        "outbound",
        "download"
      ]
    },
    "match_type": {
      "type": "string",
      "description": "Comment pattern correspond au chemin (page, engagement), au domaine du lien (outbound) ou au fichier (download) : exact, prefix, glob (*) ou regex",
      "enum": [
        "exact",
        "prefix",
        "glob",
        "regex"
      ],
      "default": "exact"
    },
    "pattern": {
      "type": "string",
      "description": "Motif de chemin, de domaine ou de fichier, par ex. /pricing, /blog/*, stripe.com ou *.pdf"
    },
    "hostname": {
      "type": "string",
      "description": "Ne compter que les pages de ce nom d’hôte (objectifs page)"
    },
    "event_name": {
      "type": "string",
      "description": "Nom de l’événement personnalisé (objectifs event)"
    },
    "conditions": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      },
      "description": "Conditions sur les propriétés de l’événement : [{\"key\": \"plan\", \"operator\": \"is|is_not|contains|gt|lt\", \"value\": \"pro\"}]",
      "default": []
    },
    "scroll_threshold": {
      "type": "integer",
      "description": "Engagement : % de profondeur de défilement à atteindre"
    },
    "time_threshold_seconds": {
      "type": "integer",
      "description": "Engagement : secondes sur la page"
    },
    "value_mode": {
      "type": "string",
      "description": "none, fixed (fixed_value par conversion) ou revenue (le revenu de l’événement)",
      "enum": [
        "none",
        "fixed",
        "revenue"
      ],
      "default": "none"
    },
    "fixed_value": {
      "type": "number",
      "description": "Valeur fixe par conversion dans la devise du site, par ex. 50.0"
    },
    "count_mode": {
      "type": "string",
      "description": "La valeur compte once_per_visit ou à chaque réalisation",
      "enum": [
        "once_per_visit",
        "every"
      ],
      "default": "once_per_visit"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "name",
    "kind",
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’objectif, par ex. goal_7Q2K9XH3AB"
    },
    "name": {
      "type": "string"
    },
    "kind": {
      "type": "string",
      "description": "page, event, engagement, outbound ou download"
    },
    "match_type": {
      "type": "string",
      "description": "exact, prefix, glob ou regex"
    },
    "pattern": {
      "anyOf": [
        {
          "type": "string",
          "description": "Motif de chemin, de domaine ou de fichier"
        },
        {
          "type": "null"
        }
      ]
    },
    "hostname": {
      "anyOf": [
        {
          "type": "string",
          "description": "Restriction de nom d’hôte (objectifs page)"
        },
        {
          "type": "null"
        }
      ]
    },
    "event_name": {
      "anyOf": [
        {
          "type": "string",
          "description": "Nom de l’événement personnalisé (objectifs event)"
        },
        {
          "type": "null"
        }
      ]
    },
    "conditions": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Conditions sur les propriétés de l’événement"
    },
    "scroll_threshold": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Engagement : % de défilement"
        },
        {
          "type": "null"
        }
      ]
    },
    "time_threshold_seconds": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Engagement : secondes sur la page"
        },
        {
          "type": "null"
        }
      ]
    },
    "value_mode": {
      "type": "string",
      "description": "none, fixed ou revenue"
    },
    "fixed_value_minor": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Valeur fixe en unités mineures"
        },
        {
          "type": "null"
        }
      ]
    },
    "count_mode": {
      "type": "string",
      "description": "once_per_visit ou every"
    },
    "archived": {
      "type": "boolean"
    },
    "archived_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "stats": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "completions": {
              "type": "integer",
              "description": "Événements correspondants, répétitions comprises"
            },
            "conversions": {
              "type": "integer",
              "description": "Visites avec au moins une réalisation"
            },
            "conversion_rate": {
              "type": "number",
              "description": "Conversions ÷ visites (ou ÷ visiteurs, selon le paramètre du site), %"
            },
            "value": {
              "type": "integer",
              "description": "Valeur de l’objectif en unités mineures de la devise du site"
            },
            "change": {
              "anyOf": [
                {
                  "type": "number",
                  "description": "Variation des conversions par rapport à la période précédente, %"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "description": "Statistiques de la période (liste uniquement)"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /sites/:site_id/goals/:id.json Supprimer un objectif (les données sont conservées) goals_delete

Permission : content.write

Exemple
curl -X DELETE https://privatusanalytics.com/sites/:site_id/goals/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’objectif, par ex. goal_7Q2K9XH3AB"
    },
    "name": {
      "type": "string"
    },
    "kind": {
      "type": "string",
      "description": "page, event, engagement, outbound ou download"
    },
    "match_type": {
      "type": "string",
      "description": "exact, prefix, glob ou regex"
    },
    "pattern": {
      "anyOf": [
        {
          "type": "string",
          "description": "Motif de chemin, de domaine ou de fichier"
        },
        {
          "type": "null"
        }
      ]
    },
    "hostname": {
      "anyOf": [
        {
          "type": "string",
          "description": "Restriction de nom d’hôte (objectifs page)"
        },
        {
          "type": "null"
        }
      ]
    },
    "event_name": {
      "anyOf": [
        {
          "type": "string",
          "description": "Nom de l’événement personnalisé (objectifs event)"
        },
        {
          "type": "null"
        }
      ]
    },
    "conditions": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Conditions sur les propriétés de l’événement"
    },
    "scroll_threshold": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Engagement : % de défilement"
        },
        {
          "type": "null"
        }
      ]
    },
    "time_threshold_seconds": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Engagement : secondes sur la page"
        },
        {
          "type": "null"
        }
      ]
    },
    "value_mode": {
      "type": "string",
      "description": "none, fixed ou revenue"
    },
    "fixed_value_minor": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Valeur fixe en unités mineures"
        },
        {
          "type": "null"
        }
      ]
    },
    "count_mode": {
      "type": "string",
      "description": "once_per_visit ou every"
    },
    "archived": {
      "type": "boolean"
    },
    "archived_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "stats": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "completions": {
              "type": "integer",
              "description": "Événements correspondants, répétitions comprises"
            },
            "conversions": {
              "type": "integer",
              "description": "Visites avec au moins une réalisation"
            },
            "conversion_rate": {
              "type": "number",
              "description": "Conversions ÷ visites (ou ÷ visiteurs, selon le paramètre du site), %"
            },
            "value": {
              "type": "integer",
              "description": "Valeur de l’objectif en unités mineures de la devise du site"
            },
            "change": {
              "anyOf": [
                {
                  "type": "number",
                  "description": "Variation des conversions par rapport à la période précédente, %"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "description": "Statistiques de la période (liste uniquement)"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
POST /sites/:site_id/goals/:id/duplicate.json Copier un objectif goals_duplicate

Permission : content.write

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/goals/:id/duplicate.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nom de la copie"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’objectif, par ex. goal_7Q2K9XH3AB"
    },
    "name": {
      "type": "string"
    },
    "kind": {
      "type": "string",
      "description": "page, event, engagement, outbound ou download"
    },
    "match_type": {
      "type": "string",
      "description": "exact, prefix, glob ou regex"
    },
    "pattern": {
      "anyOf": [
        {
          "type": "string",
          "description": "Motif de chemin, de domaine ou de fichier"
        },
        {
          "type": "null"
        }
      ]
    },
    "hostname": {
      "anyOf": [
        {
          "type": "string",
          "description": "Restriction de nom d’hôte (objectifs page)"
        },
        {
          "type": "null"
        }
      ]
    },
    "event_name": {
      "anyOf": [
        {
          "type": "string",
          "description": "Nom de l’événement personnalisé (objectifs event)"
        },
        {
          "type": "null"
        }
      ]
    },
    "conditions": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Conditions sur les propriétés de l’événement"
    },
    "scroll_threshold": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Engagement : % de défilement"
        },
        {
          "type": "null"
        }
      ]
    },
    "time_threshold_seconds": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Engagement : secondes sur la page"
        },
        {
          "type": "null"
        }
      ]
    },
    "value_mode": {
      "type": "string",
      "description": "none, fixed ou revenue"
    },
    "fixed_value_minor": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Valeur fixe en unités mineures"
        },
        {
          "type": "null"
        }
      ]
    },
    "count_mode": {
      "type": "string",
      "description": "once_per_visit ou every"
    },
    "archived": {
      "type": "boolean"
    },
    "archived_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "stats": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "completions": {
              "type": "integer",
              "description": "Événements correspondants, répétitions comprises"
            },
            "conversions": {
              "type": "integer",
              "description": "Visites avec au moins une réalisation"
            },
            "conversion_rate": {
              "type": "number",
              "description": "Conversions ÷ visites (ou ÷ visiteurs, selon le paramètre du site), %"
            },
            "value": {
              "type": "integer",
              "description": "Valeur de l’objectif en unités mineures de la devise du site"
            },
            "change": {
              "anyOf": [
                {
                  "type": "number",
                  "description": "Variation des conversions par rapport à la période précédente, %"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "description": "Statistiques de la période (liste uniquement)"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /sites/:site_id/goals.json Lister les objectifs avec réalisations, conversions, taux et valeur pour une période goals_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/goals.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "period": {
      "type": "string",
      "description": "Préréglage de plage de dates. Utilisez custom avec from/to",
      "enum": [
        "today",
        "yesterday",
        "24h",
        "7d",
        "14d",
        "28d",
        "30d",
        "90d",
        "mtd",
        "last_month",
        "qtd",
        "last_quarter",
        "ytd",
        "12mo",
        "last_year",
        "all",
        "custom"
      ],
      "default": "30d"
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "Début de la plage personnalisée (fuseau horaire du site)"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la plage personnalisée, incluse"
    },
    "compare": {
      "type": "string",
      "description": "Période de comparaison",
      "enum": [
        "none",
        "previous_period",
        "previous_year",
        "custom"
      ],
      "default": "none"
    },
    "compare_from": {
      "type": "string",
      "format": "date",
      "description": "Début de la comparaison personnalisée"
    },
    "compare_to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la comparaison personnalisée"
    },
    "match_weekday": {
      "type": "boolean",
      "description": "Aligner les jours de la semaine de la comparaison",
      "default": false
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres : [[\"dimension\",\"operator\",\"value\"], …]. Opérateurs : is, is_not, any_of, none_of, contains, not_contains, starts_with, regex, not_regex, gt, lt, between. Encadrez les conditions dans {\"any\": [...]} pour un OU.",
      "default": []
    },
    "segment_id": {
      "type": "string",
      "description": "Appliquer un segment enregistré (seg_…)"
    },
    "include_imported": {
      "type": "boolean",
      "description": "Ajouter les données historiques importées (dates antérieures au premier événement natif, ignorées lorsque des filtres ou un segment sont appliqués)",
      "default": false
    },
    "status": {
      "type": "string",
      "description": "Objectifs active, archived ou all",
      "enum": [
        "active",
        "archived",
        "all"
      ],
      "default": "active"
    },
    "page": {
      "type": "integer",
      "description": "Numéro de page",
      "default": 1
    },
    "per_page": {
      "type": "integer",
      "description": "Objectifs par page (100 maximum)",
      "default": 25
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant d’objectif, par ex. goal_7Q2K9XH3AB"
      },
      "name": {
        "type": "string"
      },
      "kind": {
        "type": "string",
        "description": "page, event, engagement, outbound ou download"
      },
      "match_type": {
        "type": "string",
        "description": "exact, prefix, glob ou regex"
      },
      "pattern": {
        "anyOf": [
          {
            "type": "string",
            "description": "Motif de chemin, de domaine ou de fichier"
          },
          {
            "type": "null"
          }
        ]
      },
      "hostname": {
        "anyOf": [
          {
            "type": "string",
            "description": "Restriction de nom d’hôte (objectifs page)"
          },
          {
            "type": "null"
          }
        ]
      },
      "event_name": {
        "anyOf": [
          {
            "type": "string",
            "description": "Nom de l’événement personnalisé (objectifs event)"
          },
          {
            "type": "null"
          }
        ]
      },
      "conditions": {
        "type": "array",
        "items": {
          "type": "object"
        },
        "description": "Conditions sur les propriétés de l’événement"
      },
      "scroll_threshold": {
        "anyOf": [
          {
            "type": "integer",
            "description": "Engagement : % de défilement"
          },
          {
            "type": "null"
          }
        ]
      },
      "time_threshold_seconds": {
        "anyOf": [
          {
            "type": "integer",
            "description": "Engagement : secondes sur la page"
          },
          {
            "type": "null"
          }
        ]
      },
      "value_mode": {
        "type": "string",
        "description": "none, fixed ou revenue"
      },
      "fixed_value_minor": {
        "anyOf": [
          {
            "type": "integer",
            "description": "Valeur fixe en unités mineures"
          },
          {
            "type": "null"
          }
        ]
      },
      "count_mode": {
        "type": "string",
        "description": "once_per_visit ou every"
      },
      "archived": {
        "type": "boolean"
      },
      "archived_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "stats": {
        "anyOf": [
          {
            "type": "object",
            "properties": {
              "completions": {
                "type": "integer",
                "description": "Événements correspondants, répétitions comprises"
              },
              "conversions": {
                "type": "integer",
                "description": "Visites avec au moins une réalisation"
              },
              "conversion_rate": {
                "type": "number",
                "description": "Conversions ÷ visites (ou ÷ visiteurs, selon le paramètre du site), %"
              },
              "value": {
                "type": "integer",
                "description": "Valeur de l’objectif en unités mineures de la devise du site"
              },
              "change": {
                "anyOf": [
                  {
                    "type": "number",
                    "description": "Variation des conversions par rapport à la période précédente, %"
                  },
                  {
                    "type": "null"
                  }
                ]
              }
            },
            "description": "Statistiques de la période (liste uniquement)"
          },
          {
            "type": "null"
          }
        ]
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      },
      "updated_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
GET /sites/:site_id/goals/:id.json Rapport d’objectif : métriques, graphique, ventilations et parcours menant à la conversion goals_get

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/goals/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "period": {
      "type": "string",
      "description": "Préréglage de plage de dates. Utilisez custom avec from/to",
      "enum": [
        "today",
        "yesterday",
        "24h",
        "7d",
        "14d",
        "28d",
        "30d",
        "90d",
        "mtd",
        "last_month",
        "qtd",
        "last_quarter",
        "ytd",
        "12mo",
        "last_year",
        "all",
        "custom"
      ],
      "default": "30d"
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "Début de la plage personnalisée (fuseau horaire du site)"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la plage personnalisée, incluse"
    },
    "compare": {
      "type": "string",
      "description": "Période de comparaison",
      "enum": [
        "none",
        "previous_period",
        "previous_year",
        "custom"
      ],
      "default": "none"
    },
    "compare_from": {
      "type": "string",
      "format": "date",
      "description": "Début de la comparaison personnalisée"
    },
    "compare_to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la comparaison personnalisée"
    },
    "match_weekday": {
      "type": "boolean",
      "description": "Aligner les jours de la semaine de la comparaison",
      "default": false
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres : [[\"dimension\",\"operator\",\"value\"], …]. Opérateurs : is, is_not, any_of, none_of, contains, not_contains, starts_with, regex, not_regex, gt, lt, between. Encadrez les conditions dans {\"any\": [...]} pour un OU.",
      "default": []
    },
    "segment_id": {
      "type": "string",
      "description": "Appliquer un segment enregistré (seg_…)"
    },
    "include_imported": {
      "type": "boolean",
      "description": "Ajouter les données historiques importées (dates antérieures au premier événement natif, ignorées lorsque des filtres ou un segment sont appliqués)",
      "default": false
    },
    "interval": {
      "type": "string",
      "description": "Taille de l’intervalle du graphique",
      "enum": [
        "auto",
        "minute",
        "hour",
        "day",
        "week",
        "month",
        "quarter",
        "year"
      ],
      "default": "auto"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "period": {
      "type": "object",
      "description": "from/to de la période (UTC)"
    },
    "goal": {
      "type": "object",
      "properties": {
        "id": {
          "type": "string",
          "description": "Identifiant d’objectif, par ex. goal_7Q2K9XH3AB"
        },
        "name": {
          "type": "string"
        },
        "kind": {
          "type": "string",
          "description": "page, event, engagement, outbound ou download"
        },
        "match_type": {
          "type": "string",
          "description": "exact, prefix, glob ou regex"
        },
        "pattern": {
          "anyOf": [
            {
              "type": "string",
              "description": "Motif de chemin, de domaine ou de fichier"
            },
            {
              "type": "null"
            }
          ]
        },
        "hostname": {
          "anyOf": [
            {
              "type": "string",
              "description": "Restriction de nom d’hôte (objectifs page)"
            },
            {
              "type": "null"
            }
          ]
        },
        "event_name": {
          "anyOf": [
            {
              "type": "string",
              "description": "Nom de l’événement personnalisé (objectifs event)"
            },
            {
              "type": "null"
            }
          ]
        },
        "conditions": {
          "type": "array",
          "items": {
            "type": "object"
          },
          "description": "Conditions sur les propriétés de l’événement"
        },
        "scroll_threshold": {
          "anyOf": [
            {
              "type": "integer",
              "description": "Engagement : % de défilement"
            },
            {
              "type": "null"
            }
          ]
        },
        "time_threshold_seconds": {
          "anyOf": [
            {
              "type": "integer",
              "description": "Engagement : secondes sur la page"
            },
            {
              "type": "null"
            }
          ]
        },
        "value_mode": {
          "type": "string",
          "description": "none, fixed ou revenue"
        },
        "fixed_value_minor": {
          "anyOf": [
            {
              "type": "integer",
              "description": "Valeur fixe en unités mineures"
            },
            {
              "type": "null"
            }
          ]
        },
        "count_mode": {
          "type": "string",
          "description": "once_per_visit ou every"
        },
        "archived": {
          "type": "boolean"
        },
        "archived_at": {
          "anyOf": [
            {
              "type": "string",
              "format": "date-time"
            },
            {
              "type": "null"
            }
          ]
        },
        "stats": {
          "anyOf": [
            {
              "type": "object",
              "properties": {
                "completions": {
                  "type": "integer",
                  "description": "Événements correspondants, répétitions comprises"
                },
                "conversions": {
                  "type": "integer",
                  "description": "Visites avec au moins une réalisation"
                },
                "conversion_rate": {
                  "type": "number",
                  "description": "Conversions ÷ visites (ou ÷ visiteurs, selon le paramètre du site), %"
                },
                "value": {
                  "type": "integer",
                  "description": "Valeur de l’objectif en unités mineures de la devise du site"
                },
                "change": {
                  "anyOf": [
                    {
                      "type": "number",
                      "description": "Variation des conversions par rapport à la période précédente, %"
                    },
                    {
                      "type": "null"
                    }
                  ]
                }
              },
              "description": "Statistiques de la période (liste uniquement)"
            },
            {
              "type": "null"
            }
          ]
        },
        "created_at": {
          "type": "string",
          "format": "date-time"
        },
        "updated_at": {
          "type": "string",
          "format": "date-time"
        }
      },
      "description": "La définition de l’objectif"
    },
    "metrics": {
      "type": "object",
      "description": "completions, conversions, conversion_rate (%), value (unités mineures)"
    },
    "comparison_period": {
      "anyOf": [
        {
          "type": "object",
          "description": "from/to de la comparaison"
        },
        {
          "type": "null"
        }
      ]
    },
    "comparison": {
      "anyOf": [
        {
          "type": "object",
          "description": "Métriques de la période de comparaison"
        },
        {
          "type": "null"
        }
      ]
    },
    "change": {
      "anyOf": [
        {
          "type": "object",
          "description": "Variation par rapport à la comparaison, % par métrique"
        },
        {
          "type": "null"
        }
      ]
    },
    "interval": {
      "type": "string",
      "description": "Taille de l’intervalle du graphique"
    },
    "series": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Par intervalle : date, completions, conversions, conversion_rate"
    },
    "breakdowns": {
      "type": "object",
      "description": "Principales valeurs par conversions pour channel, utm_campaign, entry_page, country et device : value, completions, conversions, conversion_rate"
    },
    "journey": {
      "anyOf": [
        {
          "type": "object",
          "description": "converting_visits, median_seconds_to_convert, median_pages_before et pages_before (pages vues plus tôt dans la visite, par les visites converties)"
        },
        {
          "type": "null"
        }
      ]
    }
  }
}
POST /sites/:site_id/goals/:id/unarchive.json Restaurer un objectif archivé goals_unarchive

Permission : content.write

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/goals/:id/unarchive.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’objectif, par ex. goal_7Q2K9XH3AB"
    },
    "name": {
      "type": "string"
    },
    "kind": {
      "type": "string",
      "description": "page, event, engagement, outbound ou download"
    },
    "match_type": {
      "type": "string",
      "description": "exact, prefix, glob ou regex"
    },
    "pattern": {
      "anyOf": [
        {
          "type": "string",
          "description": "Motif de chemin, de domaine ou de fichier"
        },
        {
          "type": "null"
        }
      ]
    },
    "hostname": {
      "anyOf": [
        {
          "type": "string",
          "description": "Restriction de nom d’hôte (objectifs page)"
        },
        {
          "type": "null"
        }
      ]
    },
    "event_name": {
      "anyOf": [
        {
          "type": "string",
          "description": "Nom de l’événement personnalisé (objectifs event)"
        },
        {
          "type": "null"
        }
      ]
    },
    "conditions": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Conditions sur les propriétés de l’événement"
    },
    "scroll_threshold": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Engagement : % de défilement"
        },
        {
          "type": "null"
        }
      ]
    },
    "time_threshold_seconds": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Engagement : secondes sur la page"
        },
        {
          "type": "null"
        }
      ]
    },
    "value_mode": {
      "type": "string",
      "description": "none, fixed ou revenue"
    },
    "fixed_value_minor": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Valeur fixe en unités mineures"
        },
        {
          "type": "null"
        }
      ]
    },
    "count_mode": {
      "type": "string",
      "description": "once_per_visit ou every"
    },
    "archived": {
      "type": "boolean"
    },
    "archived_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "stats": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "completions": {
              "type": "integer",
              "description": "Événements correspondants, répétitions comprises"
            },
            "conversions": {
              "type": "integer",
              "description": "Visites avec au moins une réalisation"
            },
            "conversion_rate": {
              "type": "number",
              "description": "Conversions ÷ visites (ou ÷ visiteurs, selon le paramètre du site), %"
            },
            "value": {
              "type": "integer",
              "description": "Valeur de l’objectif en unités mineures de la devise du site"
            },
            "change": {
              "anyOf": [
                {
                  "type": "number",
                  "description": "Variation des conversions par rapport à la période précédente, %"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "description": "Statistiques de la période (liste uniquement)"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
PATCH /sites/:site_id/goals/:id.json Mettre à jour un objectif goals_update

Permission : content.write

Exemple
curl -X PATCH https://privatusanalytics.com/sites/:site_id/goals/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nom de l’objectif",
      "examples": [
        "Signed up"
      ]
    },
    "kind": {
      "type": "string",
      "description": "page (visite d’une page), event (événement personnalisé), engagement (défilement ou temps sur la page), outbound (clic sur un lien sortant) ou download (téléchargement de fichier)",
      "enum": [
        "page",
        "event",
        "engagement",
        "outbound",
        "download"
      ]
    },
    "match_type": {
      "type": "string",
      "description": "Comment pattern correspond au chemin (page, engagement), au domaine du lien (outbound) ou au fichier (download) : exact, prefix, glob (*) ou regex",
      "enum": [
        "exact",
        "prefix",
        "glob",
        "regex"
      ]
    },
    "pattern": {
      "type": "string",
      "description": "Motif de chemin, de domaine ou de fichier, par ex. /pricing, /blog/*, stripe.com ou *.pdf"
    },
    "hostname": {
      "type": "string",
      "description": "Ne compter que les pages de ce nom d’hôte (objectifs page)"
    },
    "event_name": {
      "type": "string",
      "description": "Nom de l’événement personnalisé (objectifs event)"
    },
    "conditions": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      },
      "description": "Conditions sur les propriétés de l’événement : [{\"key\": \"plan\", \"operator\": \"is|is_not|contains|gt|lt\", \"value\": \"pro\"}]"
    },
    "scroll_threshold": {
      "type": "integer",
      "description": "Engagement : % de profondeur de défilement à atteindre"
    },
    "time_threshold_seconds": {
      "type": "integer",
      "description": "Engagement : secondes sur la page"
    },
    "value_mode": {
      "type": "string",
      "description": "none, fixed (fixed_value par conversion) ou revenue (le revenu de l’événement)",
      "enum": [
        "none",
        "fixed",
        "revenue"
      ]
    },
    "fixed_value": {
      "type": "number",
      "description": "Valeur fixe par conversion dans la devise du site, par ex. 50.0"
    },
    "count_mode": {
      "type": "string",
      "description": "La valeur compte once_per_visit ou à chaque réalisation",
      "enum": [
        "once_per_visit",
        "every"
      ]
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’objectif, par ex. goal_7Q2K9XH3AB"
    },
    "name": {
      "type": "string"
    },
    "kind": {
      "type": "string",
      "description": "page, event, engagement, outbound ou download"
    },
    "match_type": {
      "type": "string",
      "description": "exact, prefix, glob ou regex"
    },
    "pattern": {
      "anyOf": [
        {
          "type": "string",
          "description": "Motif de chemin, de domaine ou de fichier"
        },
        {
          "type": "null"
        }
      ]
    },
    "hostname": {
      "anyOf": [
        {
          "type": "string",
          "description": "Restriction de nom d’hôte (objectifs page)"
        },
        {
          "type": "null"
        }
      ]
    },
    "event_name": {
      "anyOf": [
        {
          "type": "string",
          "description": "Nom de l’événement personnalisé (objectifs event)"
        },
        {
          "type": "null"
        }
      ]
    },
    "conditions": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Conditions sur les propriétés de l’événement"
    },
    "scroll_threshold": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Engagement : % de défilement"
        },
        {
          "type": "null"
        }
      ]
    },
    "time_threshold_seconds": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Engagement : secondes sur la page"
        },
        {
          "type": "null"
        }
      ]
    },
    "value_mode": {
      "type": "string",
      "description": "none, fixed ou revenue"
    },
    "fixed_value_minor": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Valeur fixe en unités mineures"
        },
        {
          "type": "null"
        }
      ]
    },
    "count_mode": {
      "type": "string",
      "description": "once_per_visit ou every"
    },
    "archived": {
      "type": "boolean"
    },
    "archived_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "stats": {
      "anyOf": [
        {
          "type": "object",
          "properties": {
            "completions": {
              "type": "integer",
              "description": "Événements correspondants, répétitions comprises"
            },
            "conversions": {
              "type": "integer",
              "description": "Visites avec au moins une réalisation"
            },
            "conversion_rate": {
              "type": "number",
              "description": "Conversions ÷ visites (ou ÷ visiteurs, selon le paramètre du site), %"
            },
            "value": {
              "type": "integer",
              "description": "Valeur de l’objectif en unités mineures de la devise du site"
            },
            "change": {
              "anyOf": [
                {
                  "type": "number",
                  "description": "Variation des conversions par rapport à la période précédente, %"
                },
                {
                  "type": "null"
                }
              ]
            }
          },
          "description": "Statistiques de la période (liste uniquement)"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

Pages d’état

GET /status/:slug/confirm/:token.json Confirmer un abonnement depuis le lien reçu par e-mail public_status_pages_confirm

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl https://privatusanalytics.com/status/:slug/confirm/:token.json
Entrées
{
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "Token de la ressource"
    },
    "slug": {
      "type": "string",
      "description": "Slug de la ressource"
    }
  },
  "required": [
    "token",
    "slug"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /status/:slug.json Page d’état publique : état actuel, barres de disponibilité sur 90 jours, incidents et publications public_status_pages_get

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl https://privatusanalytics.com/status/:slug.json
Entrées
{
  "type": "object",
  "properties": {
    "slug": {
      "type": "string",
      "description": "Slug de la ressource"
    }
  },
  "required": [
    "slug"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string"
    },
    "description": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "logo_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "brand_color": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "status": {
      "type": "string",
      "description": "operational, degraded ou outage"
    },
    "checks": {
      "type": "array",
      "description": "Chacune : {name, status, uptime_90d, days: [{date, uptime, downtime_seconds}]}"
    },
    "posts": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Identifiant de publication (spp_…)"
          },
          "title": {
            "type": "string"
          },
          "body": {
            "anyOf": [
              {
                "type": "string"
              },
              {
                "type": "null"
              }
            ]
          },
          "status": {
            "type": "string",
            "description": "investigating, identified, monitoring ou resolved"
          },
          "posted_at": {
            "type": "string",
            "format": "date-time"
          },
          "updated_at": {
            "type": "string",
            "format": "date-time"
          }
        }
      }
    },
    "incidents": {
      "type": "array",
      "description": "Incidents récents : {check, started_at, resolved_at, duration_seconds}"
    }
  }
}
POST /status/:slug/subscribers.json Abonner une adresse e-mail (double confirmation) public_status_pages_subscribe

Les clients navigateur envoient un jeton Cloudflare Turnstile dans `cf-turnstile-response`. Les requêtes avec un jeton d’API n’en ont pas besoin.

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl -X POST https://privatusanalytics.com/status/:slug/subscribers.json \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "email": {
      "type": "string",
      "description": "Adresse e-mail à prévenir",
      "examples": [
        "[email protected]"
      ]
    },
    "slug": {
      "type": "string",
      "description": "Slug de la ressource"
    }
  },
  "required": [
    "email",
    "slug"
  ]
}
Données de réponse
{
  "type": "object"
}
POST /status/:slug/unsubscribe/:token.json Se désabonner avec le jeton reçu par e-mail public_status_pages_unsubscribe

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl -X POST https://privatusanalytics.com/status/:slug/unsubscribe/:token.json \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "Token de la ressource"
    },
    "slug": {
      "type": "string",
      "description": "Slug de la ressource"
    }
  },
  "required": [
    "token",
    "slug"
  ]
}
Données de réponse
{
  "type": "object"
}
POST /status_pages/:status_page_id/posts.json Publier une mise à jour d’incident (envoie un e-mail aux abonnés) status_page_posts_create

Permission : uptime.manage

Exemple
curl -X POST https://privatusanalytics.com/status_pages/:status_page_id/posts.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "title": {
      "type": "string",
      "description": "Titre, par ex. « Taux d’erreur élevés »"
    },
    "body": {
      "type": "string",
      "description": "Texte de la mise à jour (texte brut)"
    },
    "status": {
      "type": "string",
      "description": "investigating, identified, monitoring ou resolved",
      "enum": [
        "investigating",
        "identified",
        "monitoring",
        "resolved"
      ],
      "default": "investigating"
    },
    "posted_at": {
      "type": "string",
      "format": "date-time",
      "description": "Moment des faits (par défaut maintenant)"
    },
    "notify": {
      "type": "boolean",
      "description": "Envoyer un e-mail aux abonnés confirmés",
      "default": true
    },
    "status_page_id": {
      "type": "string",
      "description": "Status page de la ressource"
    }
  },
  "required": [
    "title",
    "status_page_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de publication (spp_…)"
    },
    "title": {
      "type": "string"
    },
    "body": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "status": {
      "type": "string",
      "description": "investigating, identified, monitoring ou resolved"
    },
    "posted_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /status_pages/:status_page_id/posts/:id.json Supprimer une publication de page d’état status_page_posts_delete

Permission : uptime.manage

Exemple
curl -X DELETE https://privatusanalytics.com/status_pages/:status_page_id/posts/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "status_page_id": {
      "type": "string",
      "description": "Status page de la ressource"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "status_page_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de publication (spp_…)"
    },
    "title": {
      "type": "string"
    },
    "body": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "status": {
      "type": "string",
      "description": "investigating, identified, monitoring ou resolved"
    },
    "posted_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /status_pages/:status_page_id/posts.json Lister les publications d’une page d’état status_page_posts_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/status_pages/:status_page_id/posts.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "description": "Uniquement les publications avec ce statut",
      "enum": [
        "investigating",
        "identified",
        "monitoring",
        "resolved"
      ]
    },
    "status_page_id": {
      "type": "string",
      "description": "Status page de la ressource"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "status_page_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant de publication (spp_…)"
      },
      "title": {
        "type": "string"
      },
      "body": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "status": {
        "type": "string",
        "description": "investigating, identified, monitoring ou resolved"
      },
      "posted_at": {
        "type": "string",
        "format": "date-time"
      },
      "updated_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
PATCH /status_pages/:status_page_id/posts/:id.json Modifier une publication de page d’état status_page_posts_update

Permission : uptime.manage

Exemple
curl -X PATCH https://privatusanalytics.com/status_pages/:status_page_id/posts/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "title": {
      "type": "string",
      "description": "Titre"
    },
    "body": {
      "type": "string",
      "description": "Texte de la mise à jour (texte brut)"
    },
    "status": {
      "type": "string",
      "description": "investigating, identified, monitoring ou resolved",
      "enum": [
        "investigating",
        "identified",
        "monitoring",
        "resolved"
      ]
    },
    "notify": {
      "type": "boolean",
      "description": "Envoyer un e-mail aux abonnés confirmés si le statut change",
      "default": true
    },
    "status_page_id": {
      "type": "string",
      "description": "Status page de la ressource"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "status_page_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de publication (spp_…)"
    },
    "title": {
      "type": "string"
    },
    "body": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "status": {
      "type": "string",
      "description": "investigating, identified, monitoring ou resolved"
    },
    "posted_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /status_pages/:status_page_id/subscribers/:id.json Retirer un abonné status_page_subscribers_delete

Permission : uptime.manage

Exemple
curl -X DELETE https://privatusanalytics.com/status_pages/:status_page_id/subscribers/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "status_page_id": {
      "type": "string",
      "description": "Status page de la ressource"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "status_page_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid"
    },
    "email": {
      "type": "string"
    },
    "confirmed_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /status_pages/:status_page_id/subscribers.json Lister les abonnés d’une page d’état status_page_subscribers_list

Permission : uptime.manage

Exemple
curl https://privatusanalytics.com/status_pages/:status_page_id/subscribers.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "confirmed": {
      "type": "boolean",
      "description": "true : confirmés uniquement, false : en attente uniquement"
    },
    "status_page_id": {
      "type": "string",
      "description": "Status page de la ressource"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "status_page_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "format": "uuid"
      },
      "email": {
        "type": "string"
      },
      "confirmed_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
POST /workspaces/:workspace_id/status_pages.json Créer une page d’état status_pages_create

Permission : uptime.manage

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/status_pages.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Titre de la page, par ex. « Statut Acme »"
    },
    "slug": {
      "type": "string",
      "description": "Slug de l’URL publique : /status/<slug> (dérivé du nom par défaut)"
    },
    "description": {
      "type": "string",
      "description": "Texte d’introduction sous le titre"
    },
    "logo_url": {
      "type": "string",
      "description": "URL HTTPS d’une image de logo"
    },
    "brand_color": {
      "type": "string",
      "description": "Couleur d’accent, par ex. #06755b"
    },
    "custom_domain": {
      "type": "string",
      "description": "Domaine personnalisé (CNAME vers notre hôte), par ex. status.example.com. Vide pour le supprimer"
    },
    "check_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des vérifications de disponibilité (upc_…) à afficher"
    },
    "published": {
      "type": "boolean",
      "description": "Visible par le public",
      "default": true
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "name",
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de page d’état (sp_…)"
    },
    "workspace_id": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "slug": {
      "type": "string",
      "description": "URL publique : /status/<slug>"
    },
    "custom_domain": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "description": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "logo_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "brand_color": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "published": {
      "type": "boolean"
    },
    "check_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des vérifications de disponibilité affichées"
    },
    "subscribers": {
      "type": "integer",
      "description": "Abonnés confirmés"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /status_pages/:id.json Supprimer une page d’état status_pages_delete

Permission : uptime.manage

Exemple
curl -X DELETE https://privatusanalytics.com/status_pages/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de page d’état (sp_…)"
    },
    "workspace_id": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "slug": {
      "type": "string",
      "description": "URL publique : /status/<slug>"
    },
    "custom_domain": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "description": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "logo_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "brand_color": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "published": {
      "type": "boolean"
    },
    "check_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des vérifications de disponibilité affichées"
    },
    "subscribers": {
      "type": "integer",
      "description": "Abonnés confirmés"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /workspaces/:workspace_id/status_pages.json Lister les pages d’état status_pages_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/status_pages.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Filtrer par nom ou slug"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant de page d’état (sp_…)"
      },
      "workspace_id": {
        "type": "string"
      },
      "name": {
        "type": "string"
      },
      "slug": {
        "type": "string",
        "description": "URL publique : /status/<slug>"
      },
      "custom_domain": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "description": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "logo_url": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "brand_color": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "published": {
        "type": "boolean"
      },
      "check_ids": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "description": "Identifiants des vérifications de disponibilité affichées"
      },
      "subscribers": {
        "type": "integer",
        "description": "Abonnés confirmés"
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
GET /status_pages/:id.json Obtenir une page d’état status_pages_get

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/status_pages/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de page d’état (sp_…)"
    },
    "workspace_id": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "slug": {
      "type": "string",
      "description": "URL publique : /status/<slug>"
    },
    "custom_domain": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "description": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "logo_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "brand_color": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "published": {
      "type": "boolean"
    },
    "check_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des vérifications de disponibilité affichées"
    },
    "subscribers": {
      "type": "integer",
      "description": "Abonnés confirmés"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
PATCH /status_pages/:id.json Modifier une page d’état status_pages_update

Permission : uptime.manage

Exemple
curl -X PATCH https://privatusanalytics.com/status_pages/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Titre de la page, par ex. « Statut Acme »"
    },
    "slug": {
      "type": "string",
      "description": "Slug de l’URL publique : /status/<slug> (dérivé du nom par défaut)"
    },
    "description": {
      "type": "string",
      "description": "Texte d’introduction sous le titre"
    },
    "logo_url": {
      "type": "string",
      "description": "URL HTTPS d’une image de logo"
    },
    "brand_color": {
      "type": "string",
      "description": "Couleur d’accent, par ex. #06755b"
    },
    "custom_domain": {
      "type": "string",
      "description": "Domaine personnalisé (CNAME vers notre hôte), par ex. status.example.com. Vide pour le supprimer"
    },
    "check_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des vérifications de disponibilité (upc_…) à afficher"
    },
    "published": {
      "type": "boolean",
      "description": "Visible par le public"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de page d’état (sp_…)"
    },
    "workspace_id": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "slug": {
      "type": "string",
      "description": "URL publique : /status/<slug>"
    },
    "custom_domain": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "description": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "logo_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "brand_color": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "published": {
      "type": "boolean"
    },
    "check_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des vérifications de disponibilité affichées"
    },
    "subscribers": {
      "type": "integer",
      "description": "Abonnés confirmés"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

Partage

GET /badge/:site_id.json Badge compteur de visiteurs (SVG) pour un site public badges_get

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl https://privatusanalytics.com/badge/:site_id.json
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /share/:token/breakdown/:dimension.json Principales valeurs d’une dimension partagée shares_breakdown

Permission : public

Exemple
curl https://privatusanalytics.com/share/:token/breakdown/:dimension.json
Entrées
{
  "type": "object",
  "properties": {
    "dimension": {
      "type": "string",
      "description": "Dimension de la ressource"
    },
    "period": {
      "type": "string",
      "description": "Préréglage de plage de dates (ignoré si le lien le verrouille)",
      "enum": [
        "today",
        "yesterday",
        "24h",
        "7d",
        "14d",
        "28d",
        "30d",
        "90d",
        "mtd",
        "last_month",
        "qtd",
        "last_quarter",
        "ytd",
        "12mo",
        "last_year",
        "all",
        "custom"
      ],
      "default": "30d"
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "Début de la plage personnalisée"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la plage personnalisée, incluse"
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres supplémentaires, si le lien les autorise",
      "default": []
    },
    "limit": {
      "type": "integer",
      "description": "Lignes (100 maximum)",
      "default": 10
    },
    "token": {
      "type": "string",
      "description": "Token de la ressource"
    }
  },
  "required": [
    "dimension",
    "token"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /share/:token.json Vue d’ensemble du tableau de bord partagé pour un jeton de partage shares_overview

Permission : public

Exemple
curl https://privatusanalytics.com/share/:token.json
Entrées
{
  "type": "object",
  "properties": {
    "period": {
      "type": "string",
      "description": "Préréglage de plage de dates (ignoré si le lien le verrouille)",
      "enum": [
        "today",
        "yesterday",
        "24h",
        "7d",
        "14d",
        "28d",
        "30d",
        "90d",
        "mtd",
        "last_month",
        "qtd",
        "last_quarter",
        "ytd",
        "12mo",
        "last_year",
        "all",
        "custom"
      ],
      "default": "30d"
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "Début de la plage personnalisée"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la plage personnalisée, incluse"
    },
    "compare": {
      "type": "string",
      "description": "Période de comparaison",
      "enum": [
        "none",
        "previous_period",
        "previous_year",
        "custom"
      ],
      "default": "none"
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres supplémentaires, si le lien les autorise : [[\"dimension\",\"operator\",\"value\"], …]",
      "default": []
    },
    "interval": {
      "type": "string",
      "description": "Taille de l’intervalle du graphique",
      "enum": [
        "auto",
        "minute",
        "hour",
        "day",
        "week",
        "month",
        "quarter",
        "year"
      ],
      "default": "auto"
    },
    "token": {
      "type": "string",
      "description": "Token de la ressource"
    }
  },
  "required": [
    "token"
  ]
}
Données de réponse
{
  "type": "object"
}

Performance

GET /sites/:site_id/performance.json Web Vitals : tableau de bord p75, tendance quotidienne et ventilations par page, appareil, navigateur et pays performance_report

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/performance.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "period": {
      "type": "string",
      "description": "Préréglage de plage de dates. Utilisez custom avec from/to",
      "enum": [
        "today",
        "yesterday",
        "24h",
        "7d",
        "14d",
        "28d",
        "30d",
        "90d",
        "mtd",
        "last_month",
        "qtd",
        "last_quarter",
        "ytd",
        "12mo",
        "last_year",
        "all",
        "custom"
      ],
      "default": "30d"
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "Début de la plage personnalisée (fuseau horaire du site)"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la plage personnalisée, incluse"
    },
    "compare": {
      "type": "string",
      "description": "Période de comparaison",
      "enum": [
        "none",
        "previous_period",
        "previous_year",
        "custom"
      ],
      "default": "none"
    },
    "compare_from": {
      "type": "string",
      "format": "date",
      "description": "Début de la comparaison personnalisée"
    },
    "compare_to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la comparaison personnalisée"
    },
    "match_weekday": {
      "type": "boolean",
      "description": "Aligner les jours de la semaine de la comparaison",
      "default": false
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres : [[\"dimension\",\"operator\",\"value\"], …]. Opérateurs : is, is_not, any_of, none_of, contains, not_contains, starts_with, regex, not_regex, gt, lt, between. Encadrez les conditions dans {\"any\": [...]} pour un OU.",
      "default": []
    },
    "segment_id": {
      "type": "string",
      "description": "Appliquer un segment enregistré (seg_…)"
    },
    "include_imported": {
      "type": "boolean",
      "description": "Ajouter les données historiques importées (dates antérieures au premier événement natif, ignorées lorsque des filtres ou un segment sont appliqués)",
      "default": false
    },
    "metric": {
      "type": "string",
      "description": "Métrique pour la tendance et les ventilations",
      "enum": [
        "LCP",
        "INP",
        "CLS",
        "FCP",
        "TTFB"
      ],
      "default": "LCP"
    },
    "limit": {
      "type": "integer",
      "description": "Lignes par ventilation (100 maximum)",
      "default": 10
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}

Programme d’affiliation

GET /account/affiliate/commissions.json Lister vos commissions d’affiliation affiliate_commissions_list

Commissions, reprises pour remboursement ou rétrofacturation et annulations de reprise, les plus récentes en premier. Les montants sont en centimes.

Permission : member

Exemple
curl https://privatusanalytics.com/account/affiliate/commissions.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "description": "Uniquement les commissions ayant ce statut",
      "enum": [
        "pending",
        "approved",
        "paid",
        "void"
      ]
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": []
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "format": "uuid",
        "description": "Identifiant de la commission"
      },
      "kind": {
        "type": "string",
        "description": "commission, clawback (remboursement ou rétrofacturation) ou reversal"
      },
      "status": {
        "type": "string",
        "description": "pending (en période de blocage), approved (à verser), paid ou void"
      },
      "amount_cents": {
        "type": "integer",
        "description": "Votre part en centimes (négative pour une reprise)"
      },
      "basis_cents": {
        "type": "integer",
        "description": "Le paiement net (hors taxes) à partir duquel elle a été calculée, en centimes"
      },
      "currency": {
        "type": "string",
        "description": "Code de devise ISO"
      },
      "earned_at": {
        "type": "string",
        "format": "date-time",
        "description": "Date du paiement (ou du remboursement)"
      },
      "approved_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time",
            "description": "Date à laquelle elle est devenue payable"
          },
          {
            "type": "null"
          }
        ]
      },
      "paid_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time",
            "description": "Date du versement"
          },
          {
            "type": "null"
          }
        ]
      }
    }
  }
}
GET /account/affiliate/signup-box.json Obtenir le code et les résultats de votre encart d’inscription d’affilié affiliate_signup_box_get

Le code d’intégration de votre encart d’inscription (un script et un iframe simple) pour le thème choisi, les attributs qui préremplissent le formulaire, les événements que le script déclenche sur votre page et les chiffres de l’encart : inscriptions en attente de confirmation, inscriptions confirmées et clients payants. available vaut false tant que votre candidature d’affilié n’est pas approuvée.

Permission : member

Exemple
curl https://privatusanalytics.com/account/affiliate/signup-box.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "theme": {
      "type": "string",
      "description": "Thème de l’encart : auto (selon l’appareil du visiteur), light ou dark",
      "enum": [
        "auto",
        "light",
        "dark"
      ],
      "examples": [
        "auto"
      ],
      "default": "auto"
    }
  },
  "required": []
}
Données de réponse
{
  "type": "object",
  "properties": {
    "available": {
      "type": "boolean",
      "description": "Indique si vous disposez d’un encart d’inscription (affiliés approuvés uniquement)"
    },
    "theme": {
      "type": "string",
      "description": "Le thème pour lequel le code a été généré"
    },
    "frame_url": {
      "anyOf": [
        {
          "type": "string",
          "description": "L’adresse de l’encart, pour un iframe simple"
        },
        {
          "type": "null"
        }
      ]
    },
    "script": {
      "anyOf": [
        {
          "type": "string",
          "description": "Le code d’intégration par script : un élément et le script de chargement"
        },
        {
          "type": "null"
        }
      ]
    },
    "iframe": {
      "anyOf": [
        {
          "type": "string",
          "description": "Le code d’intégration par iframe simple"
        },
        {
          "type": "null"
        }
      ]
    },
    "prefill_attributes": {
      "type": "array",
      "description": "Attributs de l’élément qui préremplissent le formulaire pour les visiteurs connectés"
    },
    "events": {
      "type": "array",
      "description": "Événements DOM que le script déclenche sur l’élément"
    },
    "waiting": {
      "type": "integer",
      "description": "Inscriptions dont le lien envoyé par e-mail n’a pas encore été ouvert"
    },
    "signups": {
      "type": "integer",
      "description": "Inscriptions confirmées venant de l’encart"
    },
    "customers": {
      "type": "integer",
      "description": "Celles devenues clients payants"
    }
  }
}
GET /account/affiliate.json Obtenir votre statut d’affilié, votre lien de parrainage et vos statistiques affiliate_get

Le statut de votre candidature d’affiliation, votre lien de parrainage, les inscriptions et les clients payants que vous avez parrainés, et les soldes par devise (en période de blocage, à verser, versé). status vaut none si vous n’avez pas candidaté.

Permission : member

Exemple
curl https://privatusanalytics.com/account/affiliate.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {},
  "required": []
}
Données de réponse
{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "description": "none (pas de candidature), pending, approved, rejected ou suspended"
    },
    "code": {
      "anyOf": [
        {
          "type": "string",
          "description": "Votre code de parrainage"
        },
        {
          "type": "null"
        }
      ]
    },
    "referral_url": {
      "anyOf": [
        {
          "type": "string",
          "description": "Le lien à partager (affiliés approuvés uniquement)"
        },
        {
          "type": "null"
        }
      ]
    },
    "payout_method": {
      "anyOf": [
        {
          "type": "string",
          "description": "wise ou credit"
        },
        {
          "type": "null"
        }
      ]
    },
    "rejection_reason": {
      "anyOf": [
        {
          "type": "string",
          "description": "Motif du refus de la dernière candidature"
        },
        {
          "type": "null"
        }
      ]
    },
    "applied_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date de votre candidature"
        },
        {
          "type": "null"
        }
      ]
    },
    "approved_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date d’approbation de la candidature"
        },
        {
          "type": "null"
        }
      ]
    },
    "credit_blocked": {
      "anyOf": [
        {
          "type": "string",
          "description": "Pourquoi le crédit sur le compte est en attente : program (l’espace de travail participe à un programme de remise), no_subscription ou no_workspace. null si rien ne le bloque"
        },
        {
          "type": "null"
        }
      ]
    },
    "signups": {
      "type": "integer",
      "description": "Comptes créés via votre lien ou votre code"
    },
    "customers": {
      "type": "integer",
      "description": "Espaces de travail parrainés qui ont payé"
    },
    "balances": {
      "type": "array",
      "description": "Par devise : pending_cents (en période de blocage), approved_cents (à verser) et paid_cents"
    },
    "payouts": {
      "type": "array",
      "description": "Versements récents avec amount_cents, currency, payout_method, status (applied : crédit sur le compte en attente de votre prochain renouvellement, ou paid), applied_at et paid_at"
    },
    "terms": {
      "type": "object",
      "description": "Pourcentage de commission, nombre de mois, jours de blocage et seuil de versement Wise en centimes"
    }
  }
}

Rapports par e-mail

DELETE /recipients/:id.json Retirer un destinataire d’un rapport par e-mail email_report_recipients_delete

Permission : content.write

Exemple
curl -X DELETE https://privatusanalytics.com/recipients/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant du destinataire, par exemple rcp_7Q2K9XH3AB"
    },
    "email": {
      "type": "string",
      "description": "L’adresse"
    },
    "status": {
      "type": "string",
      "description": "active, pending, declined ou unsubscribed"
    },
    "invited_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date d’envoi de la dernière invitation"
        },
        {
          "type": "null"
        }
      ]
    },
    "expires_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date d’expiration d’une invitation en attente"
        },
        {
          "type": "null"
        }
      ]
    },
    "confirmed_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date à laquelle l’adresse est devenue active"
        },
        {
          "type": "null"
        }
      ]
    }
  }
}
GET /reports/:report_id/recipients.json Lister les destinataires d’un rapport par e-mail avec leur statut email_report_recipients_list

Statuts : active (reçoit les rapports), pending (invité, pas encore accepté), declined ou unsubscribed. Ajoutez ou retirez des adresses via la liste des destinataires du rapport.

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/reports/:report_id/recipients.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "description": "Uniquement les destinataires ayant ce statut",
      "enum": [
        "pending",
        "active",
        "declined",
        "unsubscribed"
      ]
    },
    "report_id": {
      "type": "string",
      "description": "Report de la ressource"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "report_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant du destinataire, par exemple rcp_7Q2K9XH3AB"
      },
      "email": {
        "type": "string",
        "description": "L’adresse"
      },
      "status": {
        "type": "string",
        "description": "active, pending, declined ou unsubscribed"
      },
      "invited_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time",
            "description": "Date d’envoi de la dernière invitation"
          },
          {
            "type": "null"
          }
        ]
      },
      "expires_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time",
            "description": "Date d’expiration d’une invitation en attente"
          },
          {
            "type": "null"
          }
        ]
      },
      "confirmed_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time",
            "description": "Date à laquelle l’adresse est devenue active"
          },
          {
            "type": "null"
          }
        ]
      }
    }
  }
}
POST /recipients/:id/resend.json Renvoyer une invitation de rapport en attente email_report_recipients_resend

Renvoie l’invitation avec de nouveaux liens. Autorisé une fois tous les 7 jours par adresse et par rapport.

Permission : content.write

Exemple
curl -X POST https://privatusanalytics.com/recipients/:id/resend.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant du destinataire, par exemple rcp_7Q2K9XH3AB"
    },
    "email": {
      "type": "string",
      "description": "L’adresse"
    },
    "status": {
      "type": "string",
      "description": "active, pending, declined ou unsubscribed"
    },
    "invited_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date d’envoi de la dernière invitation"
        },
        {
          "type": "null"
        }
      ]
    },
    "expires_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date d’expiration d’une invitation en attente"
        },
        {
          "type": "null"
        }
      ]
    },
    "confirmed_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date à laquelle l’adresse est devenue active"
        },
        {
          "type": "null"
        }
      ]
    }
  }
}
POST /workspaces/:workspace_id/reports.json Créer un rapport par e-mail email_reports_create

Permission : content.write

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/reports.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des sites (pa_…) inclus dans le rapport"
    },
    "frequency": {
      "type": "string",
      "description": "daily, weekly (un jour de la semaine) ou monthly (le 1er)",
      "enum": [
        "daily",
        "weekly",
        "monthly"
      ]
    },
    "hour": {
      "type": "integer",
      "description": "Heure d’envoi (0 à 23, fuseau horaire de l’espace de travail)"
    },
    "weekday": {
      "type": "integer",
      "description": "Rapports hebdomadaires : 0 = dimanche … 6 = samedi"
    },
    "recipients": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Adresses e-mail (aucun compte nécessaire). Les entrées peuvent être séparées par des virgules ou des retours à la ligne. Les membres de l’espace de travail sont ajoutés immédiatement. Toute autre personne reçoit une invitation et ne reçoit les rapports qu’après l’avoir acceptée. Les adresses désinscrites des rapports sont refusées"
    },
    "blocks": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Contenu : kpis, chart, pages, sources, goals, campaigns, vitals, uptime"
    },
    "attach_pdf": {
      "type": "boolean",
      "description": "Joindre une version PDF"
    },
    "intro": {
      "type": "string",
      "description": "Texte d’introduction personnalisé (2000 caractères maximum)"
    },
    "enabled": {
      "type": "boolean",
      "description": "Envoyer selon le calendrier"
    },
    "name": {
      "type": "string",
      "description": "Nom du rapport",
      "examples": [
        "Weekly traffic"
      ]
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "name",
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de rapport, par ex. rep_7Q2K9XH3AB"
    },
    "name": {
      "type": "string"
    },
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des sites du rapport"
    },
    "frequency": {
      "type": "string",
      "description": "daily, weekly ou monthly"
    },
    "hour": {
      "type": "integer",
      "description": "Heure d’envoi (fuseau horaire de l’espace de travail)"
    },
    "weekday": {
      "type": "integer",
      "description": "Hebdomadaire : 0 = dimanche … 6 = samedi"
    },
    "recipients": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Toutes les adresses du rapport, quel que soit leur statut"
    },
    "recipient_details": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Identifiant du destinataire, par exemple rcp_7Q2K9XH3AB"
          },
          "email": {
            "type": "string",
            "description": "L’adresse"
          },
          "status": {
            "type": "string",
            "description": "active, pending, declined ou unsubscribed"
          },
          "invited_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "description": "Date d’envoi de la dernière invitation"
              },
              {
                "type": "null"
              }
            ]
          },
          "expires_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "description": "Date d’expiration d’une invitation en attente"
              },
              {
                "type": "null"
              }
            ]
          },
          "confirmed_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "description": "Date à laquelle l’adresse est devenue active"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "description": "Chaque destinataire avec son statut d’acceptation (seuls les destinataires actifs reçoivent les rapports)"
    },
    "blocks": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Blocs de contenu"
    },
    "attach_pdf": {
      "type": "boolean"
    },
    "intro": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "enabled": {
      "type": "boolean"
    },
    "last_sent_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "next_run_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /reports/:id/deliveries.json Journal d’envoi d’un rapport par e-mail email_reports_deliveries

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/reports/:id/deliveries.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "description": "Uniquement les envois avec ce statut",
      "enum": [
        "sent",
        "test",
        "failed",
        "skipped"
      ]
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "status": {
        "type": "string",
        "description": "sent, test, failed ou skipped"
      },
      "recipients_count": {
        "type": "integer"
      },
      "error": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "sent_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
DELETE /reports/:id.json Supprimer un rapport par e-mail email_reports_delete

Permission : content.write

Exemple
curl -X DELETE https://privatusanalytics.com/reports/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de rapport, par ex. rep_7Q2K9XH3AB"
    },
    "name": {
      "type": "string"
    },
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des sites du rapport"
    },
    "frequency": {
      "type": "string",
      "description": "daily, weekly ou monthly"
    },
    "hour": {
      "type": "integer",
      "description": "Heure d’envoi (fuseau horaire de l’espace de travail)"
    },
    "weekday": {
      "type": "integer",
      "description": "Hebdomadaire : 0 = dimanche … 6 = samedi"
    },
    "recipients": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Toutes les adresses du rapport, quel que soit leur statut"
    },
    "recipient_details": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Identifiant du destinataire, par exemple rcp_7Q2K9XH3AB"
          },
          "email": {
            "type": "string",
            "description": "L’adresse"
          },
          "status": {
            "type": "string",
            "description": "active, pending, declined ou unsubscribed"
          },
          "invited_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "description": "Date d’envoi de la dernière invitation"
              },
              {
                "type": "null"
              }
            ]
          },
          "expires_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "description": "Date d’expiration d’une invitation en attente"
              },
              {
                "type": "null"
              }
            ]
          },
          "confirmed_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "description": "Date à laquelle l’adresse est devenue active"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "description": "Chaque destinataire avec son statut d’acceptation (seuls les destinataires actifs reçoivent les rapports)"
    },
    "blocks": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Blocs de contenu"
    },
    "attach_pdf": {
      "type": "boolean"
    },
    "intro": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "enabled": {
      "type": "boolean"
    },
    "last_sent_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "next_run_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /workspaces/:workspace_id/reports.json Lister les rapports par e-mail email_reports_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/reports.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "frequency": {
      "type": "string",
      "description": "Uniquement les rapports de cette fréquence",
      "enum": [
        "daily",
        "weekly",
        "monthly"
      ]
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant de rapport, par ex. rep_7Q2K9XH3AB"
      },
      "name": {
        "type": "string"
      },
      "site_ids": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "description": "Identifiants des sites du rapport"
      },
      "frequency": {
        "type": "string",
        "description": "daily, weekly ou monthly"
      },
      "hour": {
        "type": "integer",
        "description": "Heure d’envoi (fuseau horaire de l’espace de travail)"
      },
      "weekday": {
        "type": "integer",
        "description": "Hebdomadaire : 0 = dimanche … 6 = samedi"
      },
      "recipients": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "description": "Toutes les adresses du rapport, quel que soit leur statut"
      },
      "recipient_details": {
        "type": "array",
        "items": {
          "type": "object",
          "properties": {
            "id": {
              "type": "string",
              "description": "Identifiant du destinataire, par exemple rcp_7Q2K9XH3AB"
            },
            "email": {
              "type": "string",
              "description": "L’adresse"
            },
            "status": {
              "type": "string",
              "description": "active, pending, declined ou unsubscribed"
            },
            "invited_at": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "description": "Date d’envoi de la dernière invitation"
                },
                {
                  "type": "null"
                }
              ]
            },
            "expires_at": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "description": "Date d’expiration d’une invitation en attente"
                },
                {
                  "type": "null"
                }
              ]
            },
            "confirmed_at": {
              "anyOf": [
                {
                  "type": "string",
                  "format": "date-time",
                  "description": "Date à laquelle l’adresse est devenue active"
                },
                {
                  "type": "null"
                }
              ]
            }
          }
        },
        "description": "Chaque destinataire avec son statut d’acceptation (seuls les destinataires actifs reçoivent les rapports)"
      },
      "blocks": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "description": "Blocs de contenu"
      },
      "attach_pdf": {
        "type": "boolean"
      },
      "intro": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "enabled": {
        "type": "boolean"
      },
      "last_sent_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "next_run_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
POST /reports/:id/send_test.json Envoyer un rapport par e-mail maintenant à titre de test email_reports_send_test

Permission : content.write

Exemple
curl -X POST https://privatusanalytics.com/reports/:id/send_test.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "recipient": {
      "type": "string",
      "description": "Envoyer le test ici (par défaut : votre e-mail)"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "description": "sent, test, failed ou skipped"
    },
    "recipients_count": {
      "type": "integer"
    },
    "error": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "sent_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /reports/:id.json Obtenir un rapport par e-mail email_reports_get

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/reports/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de rapport, par ex. rep_7Q2K9XH3AB"
    },
    "name": {
      "type": "string"
    },
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des sites du rapport"
    },
    "frequency": {
      "type": "string",
      "description": "daily, weekly ou monthly"
    },
    "hour": {
      "type": "integer",
      "description": "Heure d’envoi (fuseau horaire de l’espace de travail)"
    },
    "weekday": {
      "type": "integer",
      "description": "Hebdomadaire : 0 = dimanche … 6 = samedi"
    },
    "recipients": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Toutes les adresses du rapport, quel que soit leur statut"
    },
    "recipient_details": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Identifiant du destinataire, par exemple rcp_7Q2K9XH3AB"
          },
          "email": {
            "type": "string",
            "description": "L’adresse"
          },
          "status": {
            "type": "string",
            "description": "active, pending, declined ou unsubscribed"
          },
          "invited_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "description": "Date d’envoi de la dernière invitation"
              },
              {
                "type": "null"
              }
            ]
          },
          "expires_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "description": "Date d’expiration d’une invitation en attente"
              },
              {
                "type": "null"
              }
            ]
          },
          "confirmed_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "description": "Date à laquelle l’adresse est devenue active"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "description": "Chaque destinataire avec son statut d’acceptation (seuls les destinataires actifs reçoivent les rapports)"
    },
    "blocks": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Blocs de contenu"
    },
    "attach_pdf": {
      "type": "boolean"
    },
    "intro": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "enabled": {
      "type": "boolean"
    },
    "last_sent_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "next_run_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
PATCH /reports/:id.json Mettre à jour un rapport par e-mail email_reports_update

Permission : content.write

Exemple
curl -X PATCH https://privatusanalytics.com/reports/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des sites (pa_…) inclus dans le rapport"
    },
    "frequency": {
      "type": "string",
      "description": "daily, weekly (un jour de la semaine) ou monthly (le 1er)",
      "enum": [
        "daily",
        "weekly",
        "monthly"
      ]
    },
    "hour": {
      "type": "integer",
      "description": "Heure d’envoi (0 à 23, fuseau horaire de l’espace de travail)"
    },
    "weekday": {
      "type": "integer",
      "description": "Rapports hebdomadaires : 0 = dimanche … 6 = samedi"
    },
    "recipients": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Adresses e-mail (aucun compte nécessaire). Les entrées peuvent être séparées par des virgules ou des retours à la ligne. Les membres de l’espace de travail sont ajoutés immédiatement. Toute autre personne reçoit une invitation et ne reçoit les rapports qu’après l’avoir acceptée. Les adresses désinscrites des rapports sont refusées"
    },
    "blocks": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Contenu : kpis, chart, pages, sources, goals, campaigns, vitals, uptime"
    },
    "attach_pdf": {
      "type": "boolean",
      "description": "Joindre une version PDF"
    },
    "intro": {
      "type": "string",
      "description": "Texte d’introduction personnalisé (2000 caractères maximum)"
    },
    "enabled": {
      "type": "boolean",
      "description": "Envoyer selon le calendrier"
    },
    "name": {
      "type": "string",
      "description": "Nom du rapport"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de rapport, par ex. rep_7Q2K9XH3AB"
    },
    "name": {
      "type": "string"
    },
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Identifiants des sites du rapport"
    },
    "frequency": {
      "type": "string",
      "description": "daily, weekly ou monthly"
    },
    "hour": {
      "type": "integer",
      "description": "Heure d’envoi (fuseau horaire de l’espace de travail)"
    },
    "weekday": {
      "type": "integer",
      "description": "Hebdomadaire : 0 = dimanche … 6 = samedi"
    },
    "recipients": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Toutes les adresses du rapport, quel que soit leur statut"
    },
    "recipient_details": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "id": {
            "type": "string",
            "description": "Identifiant du destinataire, par exemple rcp_7Q2K9XH3AB"
          },
          "email": {
            "type": "string",
            "description": "L’adresse"
          },
          "status": {
            "type": "string",
            "description": "active, pending, declined ou unsubscribed"
          },
          "invited_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "description": "Date d’envoi de la dernière invitation"
              },
              {
                "type": "null"
              }
            ]
          },
          "expires_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "description": "Date d’expiration d’une invitation en attente"
              },
              {
                "type": "null"
              }
            ]
          },
          "confirmed_at": {
            "anyOf": [
              {
                "type": "string",
                "format": "date-time",
                "description": "Date à laquelle l’adresse est devenue active"
              },
              {
                "type": "null"
              }
            ]
          }
        }
      },
      "description": "Chaque destinataire avec son statut d’acceptation (seuls les destinataires actifs reçoivent les rapports)"
    },
    "blocks": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Blocs de contenu"
    },
    "attach_pdf": {
      "type": "boolean"
    },
    "intro": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "enabled": {
      "type": "boolean"
    },
    "last_sent_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "next_run_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
POST /reports/invites/:token/accept.json Accepter une invitation à un rapport report_invites_accept

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl -X POST https://privatusanalytics.com/reports/invites/:token/accept.json \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "Token de la ressource"
    }
  },
  "required": [
    "token"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant du destinataire, par exemple rcp_7Q2K9XH3AB"
    },
    "email": {
      "type": "string",
      "description": "L’adresse"
    },
    "status": {
      "type": "string",
      "description": "active, pending, declined ou unsubscribed"
    },
    "invited_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date d’envoi de la dernière invitation"
        },
        {
          "type": "null"
        }
      ]
    },
    "expires_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date d’expiration d’une invitation en attente"
        },
        {
          "type": "null"
        }
      ]
    },
    "confirmed_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date à laquelle l’adresse est devenue active"
        },
        {
          "type": "null"
        }
      ]
    }
  }
}
POST /reports/invites/:token/decline.json Refuser une invitation à un rapport report_invites_decline

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl -X POST https://privatusanalytics.com/reports/invites/:token/decline.json \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "Token de la ressource"
    }
  },
  "required": [
    "token"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant du destinataire, par exemple rcp_7Q2K9XH3AB"
    },
    "email": {
      "type": "string",
      "description": "L’adresse"
    },
    "status": {
      "type": "string",
      "description": "active, pending, declined ou unsubscribed"
    },
    "invited_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date d’envoi de la dernière invitation"
        },
        {
          "type": "null"
        }
      ]
    },
    "expires_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date d’expiration d’une invitation en attente"
        },
        {
          "type": "null"
        }
      ]
    },
    "confirmed_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date à laquelle l’adresse est devenue active"
        },
        {
          "type": "null"
        }
      ]
    }
  }
}
POST /reports/resubscribe/:token.json Recevoir de nouveau les rapports après une désinscription report_resubscribes_confirm

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl -X POST https://privatusanalytics.com/reports/resubscribe/:token.json \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "Token de la ressource"
    }
  },
  "required": [
    "token"
  ]
}
Données de réponse
{
  "type": "object"
}
POST /reports/unsubscribe/:token/resubscribe.json Envoyer à une adresse un lien pour recevoir de nouveau les rapports report_resubscribes_create

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl -X POST https://privatusanalytics.com/reports/unsubscribe/:token/resubscribe.json \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "Token de la ressource"
    }
  },
  "required": [
    "token"
  ]
}
Données de réponse
{
  "type": "object"
}
POST /reports/unsubscribe/:token.json Désabonner une adresse d’un rapport par e-mail report_unsubscribes_create

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl -X POST https://privatusanalytics.com/reports/unsubscribe/:token.json \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "Token de la ressource"
    }
  },
  "required": [
    "token"
  ]
}
Données de réponse
{
  "type": "object"
}

Recherche

GET /sites/:site_id/search.json Rapport de recherche : clics, impressions, CTR, position, principales requêtes/pages, pages de destination et opportunités search_report

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/search.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "period": {
      "type": "string",
      "description": "Préréglage de plage de dates. Utilisez custom avec from/to",
      "enum": [
        "today",
        "yesterday",
        "24h",
        "7d",
        "14d",
        "28d",
        "30d",
        "90d",
        "mtd",
        "last_month",
        "qtd",
        "last_quarter",
        "ytd",
        "12mo",
        "last_year",
        "all",
        "custom"
      ],
      "default": "30d"
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "Début de la plage personnalisée (fuseau horaire du site)"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la plage personnalisée, incluse"
    },
    "compare": {
      "type": "string",
      "description": "Période de comparaison",
      "enum": [
        "none",
        "previous_period",
        "previous_year",
        "custom"
      ],
      "default": "none"
    },
    "compare_from": {
      "type": "string",
      "format": "date",
      "description": "Début de la comparaison personnalisée"
    },
    "compare_to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la comparaison personnalisée"
    },
    "match_weekday": {
      "type": "boolean",
      "description": "Aligner les jours de la semaine de la comparaison",
      "default": false
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres : [[\"dimension\",\"operator\",\"value\"], …]. Opérateurs : is, is_not, any_of, none_of, contains, not_contains, starts_with, regex, not_regex, gt, lt, between. Encadrez les conditions dans {\"any\": [...]} pour un OU.",
      "default": []
    },
    "segment_id": {
      "type": "string",
      "description": "Appliquer un segment enregistré (seg_…)"
    },
    "include_imported": {
      "type": "boolean",
      "description": "Ajouter les données historiques importées (dates antérieures au premier événement natif, ignorées lorsque des filtres ou un segment sont appliqués)",
      "default": false
    },
    "provider": {
      "type": "string",
      "description": "google (Search Console) ou bing",
      "enum": [
        "google",
        "bing"
      ],
      "default": "google"
    },
    "limit": {
      "type": "integer",
      "description": "Lignes par tableau (100 maximum)",
      "default": 25
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
POST /sites/:site_id/search/connections.json Connecter une propriété Search Console ou un site Bing search_connect

Permission : sites.manage

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/search/connections.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "provider": {
      "type": "string",
      "description": "google ou bing",
      "enum": [
        "google",
        "bing"
      ],
      "default": "google"
    },
    "property": {
      "type": "string",
      "description": "Propriété Search Console (par ex. sc-domain:example.com) ou URL du site Bing",
      "examples": [
        "sc-domain:example.com"
      ]
    },
    "bing_api_key": {
      "type": "string",
      "description": "Votre propre clé d’API Bing Webmaster Tools (Settings > API access). Obligatoire lorsque provider vaut bing. Stockée chiffrée et jamais renvoyée."
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "property",
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "provider": {
      "type": "string",
      "description": "google ou bing"
    },
    "property": {
      "type": "string",
      "description": "Propriété Search Console ou URL du site Bing"
    },
    "status": {
      "type": "string",
      "description": "active ou error"
    },
    "last_synced_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /sites/:site_id/search/connections/:provider.json Déconnecter Search Console ou Bing et supprimer ses données search_disconnect

Permission : sites.manage

Exemple
curl -X DELETE https://privatusanalytics.com/sites/:site_id/search/connections/:provider.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "provider": {
      "type": "string",
      "description": "Provider de la ressource"
    }
  },
  "required": [
    "site_id",
    "provider"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "provider": {
      "type": "string",
      "description": "google ou bing"
    },
    "property": {
      "type": "string",
      "description": "Propriété Search Console ou URL du site Bing"
    },
    "status": {
      "type": "string",
      "description": "active ou error"
    },
    "last_synced_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
POST /sites/:site_id/search/properties.json Lister les propriétés que vous pouvez connecter (Search Console nécessite une autorisation Google depuis le navigateur) search_properties

Permission : sites.manage

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/search/properties.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "provider": {
      "type": "string",
      "description": "google ou bing",
      "enum": [
        "google",
        "bing"
      ],
      "default": "google"
    },
    "bing_api_key": {
      "type": "string",
      "description": "Votre propre clé d’API Bing Webmaster Tools (Settings > API access). Obligatoire lorsque provider vaut bing. Utilisée uniquement pour lister les sites auxquels elle donne accès."
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
POST /sites/:site_id/search/sync.json Importer les données de recherche maintenant search_sync

Permission : sites.manage

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/search/sync.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "provider": {
      "type": "string",
      "description": "google ou bing",
      "enum": [
        "google",
        "bing"
      ],
      "default": "google"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "provider": {
      "type": "string",
      "description": "google ou bing"
    },
    "property": {
      "type": "string",
      "description": "Propriété Search Console ou URL du site Bing"
    },
    "status": {
      "type": "string",
      "description": "active ou error"
    },
    "last_synced_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

Robots d’exploration

POST /sites/:site_id/crawlers/connection.json Synchroniser les visites des robots d’IA depuis une zone Cloudflare (nécessite une autorisation Cloudflare depuis le navigateur) crawlers_cloudflare_connect

Permission : sites.manage

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/crawlers/connection.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "zone_id": {
      "type": "string",
      "description": "Identifiant de la zone Cloudflare, issu de crawlers_cloudflare_zones",
      "examples": [
        "023e105f4ecef8ad9ca31a8372d0c353"
      ]
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "zone_id",
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "zone_id": {
      "type": "string",
      "description": "Identifiant de la zone Cloudflare"
    },
    "zone_name": {
      "type": "string",
      "description": "Nom de la zone Cloudflare, par exemple example.com"
    },
    "status": {
      "type": "string",
      "description": "active ou error"
    },
    "last_synced_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date du dernier import des visites de robots, ou null avant le premier import"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /sites/:site_id/crawlers/connection.json Déconnecter Cloudflare et supprimer les visites de robots qu’il a importées crawlers_cloudflare_disconnect

Permission : sites.manage

Exemple
curl -X DELETE https://privatusanalytics.com/sites/:site_id/crawlers/connection.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "zone_id": {
      "type": "string",
      "description": "Identifiant de la zone Cloudflare"
    },
    "zone_name": {
      "type": "string",
      "description": "Nom de la zone Cloudflare, par exemple example.com"
    },
    "status": {
      "type": "string",
      "description": "active ou error"
    },
    "last_synced_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date du dernier import des visites de robots, ou null avant le premier import"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
POST /sites/:site_id/crawlers/sync.json Importer maintenant les visites de robots depuis Cloudflare crawlers_cloudflare_sync

Permission : sites.manage

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/crawlers/sync.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "zone_id": {
      "type": "string",
      "description": "Identifiant de la zone Cloudflare"
    },
    "zone_name": {
      "type": "string",
      "description": "Nom de la zone Cloudflare, par exemple example.com"
    },
    "status": {
      "type": "string",
      "description": "active ou error"
    },
    "last_synced_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time",
          "description": "Date du dernier import des visites de robots, ou null avant le premier import"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /sites/:site_id/crawlers/zones.json Lister les zones Cloudflare que vous pouvez connecter (nécessite une autorisation Cloudflare depuis le navigateur) crawlers_cloudflare_zones

Permission : sites.manage

Exemple
curl https://privatusanalytics.com/sites/:site_id/crawlers/zones.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /sites/:site_id/crawlers.json Rapport sur les robots d’IA : hits par robot dans le temps, principaux chemins par robot, par catégorie crawlers_report

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/crawlers.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "period": {
      "type": "string",
      "description": "Préréglage de plage de dates. Utilisez custom avec from/to",
      "enum": [
        "today",
        "yesterday",
        "24h",
        "7d",
        "14d",
        "28d",
        "30d",
        "90d",
        "mtd",
        "last_month",
        "qtd",
        "last_quarter",
        "ytd",
        "12mo",
        "last_year",
        "all",
        "custom"
      ],
      "default": "30d"
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "Début de la plage personnalisée (fuseau horaire du site)"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la plage personnalisée, incluse"
    },
    "category": {
      "type": "string",
      "description": "ai, search, seo, other ou all",
      "enum": [
        "all",
        "ai",
        "search",
        "seo",
        "other"
      ],
      "default": "ai"
    },
    "crawler": {
      "type": "string",
      "description": "Uniquement ce robot, par ex. GPTBot"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}

Règles de canaux

POST /sites/:site_id/channel_rules.json Ajouter une règle de canal channel_rules_create

Permission : sites.manage

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/channel_rules.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "channel": {
      "type": "string",
      "description": "Nom du canal à attribuer, par ex. Partenaires"
    },
    "conditions": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "field": {
            "type": "string"
          },
          "operator": {
            "type": "string"
          },
          "value": {
            "type": "string"
          }
        }
      },
      "description": "Conditions qui doivent toutes correspondre : [{\"field\": \"utm_source\", \"operator\": \"is\", \"value\": \"newsletter\"}]. Champs : referrer_host, utm_source, utm_medium, utm_campaign, ref, path. Opérateurs : is, contains, starts_with, regex."
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "channel",
    "conditions",
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Identifiant de règle"
    },
    "channel": {
      "type": "string",
      "description": "Canal attribué lorsque toutes les conditions correspondent"
    },
    "position": {
      "type": "integer",
      "description": "Ordre d’évaluation (la première correspondance l’emporte)"
    },
    "conditions": {
      "type": "array",
      "description": "Conditions : field, operator, value"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /sites/:site_id/channel_rules/:id.json Supprimer une règle de canal channel_rules_delete

Permission : sites.manage

Exemple
curl -X DELETE https://privatusanalytics.com/sites/:site_id/channel_rules/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Identifiant de règle"
    },
    "channel": {
      "type": "string",
      "description": "Canal attribué lorsque toutes les conditions correspondent"
    },
    "position": {
      "type": "integer",
      "description": "Ordre d’évaluation (la première correspondance l’emporte)"
    },
    "conditions": {
      "type": "array",
      "description": "Conditions : field, operator, value"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /sites/:site_id/channel_rules.json Lister les règles de canal dans l’ordre channel_rules_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/channel_rules.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Identifiant de règle"
    },
    "channel": {
      "type": "string",
      "description": "Canal attribué lorsque toutes les conditions correspondent"
    },
    "position": {
      "type": "integer",
      "description": "Ordre d’évaluation (la première correspondance l’emporte)"
    },
    "conditions": {
      "type": "array",
      "description": "Conditions : field, operator, value"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
PATCH /sites/:site_id/channel_rules/:id/move.json Déplacer une règle de canal vers le haut ou le bas channel_rules_move

Permission : sites.manage

Exemple
curl -X PATCH https://privatusanalytics.com/sites/:site_id/channel_rules/:id/move.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "direction": {
      "type": "string",
      "description": "Où déplacer la règle",
      "enum": [
        "up",
        "down",
        "top",
        "bottom"
      ]
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "direction",
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Identifiant de règle"
    },
    "channel": {
      "type": "string",
      "description": "Canal attribué lorsque toutes les conditions correspondent"
    },
    "position": {
      "type": "integer",
      "description": "Ordre d’évaluation (la première correspondance l’emporte)"
    },
    "conditions": {
      "type": "array",
      "description": "Conditions : field, operator, value"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
POST /sites/:site_id/channel_rules/preview.json Prévisualiser le canal pour un référent et des balises UTM d’exemple channel_rules_preview

Permission : analytics.read

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/channel_rules/preview.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "referrer": {
      "type": "string",
      "description": "URL ou nom d’hôte du référent"
    },
    "utm_source": {
      "type": "string",
      "description": "Valeur utm_source"
    },
    "utm_medium": {
      "type": "string",
      "description": "Valeur utm_medium"
    },
    "utm_campaign": {
      "type": "string",
      "description": "Valeur utm_campaign"
    },
    "ref": {
      "type": "string",
      "description": "Paramètre ref / via / source"
    },
    "path": {
      "type": "string",
      "description": "Chemin de la page de destination, par ex. /pricing"
    },
    "paid_click": {
      "type": "boolean",
      "description": "L’URL contenait un identifiant de clic tel que gclid",
      "default": false
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
PATCH /sites/:site_id/channel_rules/:id.json Modifier une règle de canal channel_rules_update

Permission : sites.manage

Exemple
curl -X PATCH https://privatusanalytics.com/sites/:site_id/channel_rules/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "channel": {
      "type": "string",
      "description": "Nom du canal à attribuer"
    },
    "conditions": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "field": {
            "type": "string"
          },
          "operator": {
            "type": "string"
          },
          "value": {
            "type": "string"
          }
        }
      },
      "description": "Conditions qui doivent toutes correspondre : [{\"field\": \"utm_source\", \"operator\": \"is\", \"value\": \"newsletter\"}]. Champs : referrer_host, utm_source, utm_medium, utm_campaign, ref, path. Opérateurs : is, contains, starts_with, regex."
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Identifiant de règle"
    },
    "channel": {
      "type": "string",
      "description": "Canal attribué lorsque toutes les conditions correspondent"
    },
    "position": {
      "type": "integer",
      "description": "Ordre d’évaluation (la première correspondance l’emporte)"
    },
    "conditions": {
      "type": "array",
      "description": "Conditions : field, operator, value"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

Règles de trafic

POST /sites/:site_id/traffic_rules.json Ajouter une règle de trafic traffic_rules_create

Permission : sites.manage

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/traffic_rules.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "list": {
      "type": "string",
      "description": "hostnames, paths, referrers, countries, ip_ranges, user_agents ou events",
      "enum": [
        "hostnames",
        "paths",
        "referrers",
        "countries",
        "ip_ranges",
        "user_agents",
        "events"
      ]
    },
    "pattern": {
      "type": "string",
      "description": "Valeur à faire correspondre. * est un joker. ip_ranges acceptent une IP ou un CIDR (v4/v6), countries un code ISO",
      "examples": [
        "/admin/*"
      ]
    },
    "label": {
      "type": "string",
      "description": "Note facultative, par ex. « Bureau »"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "list",
    "pattern",
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Identifiant de règle"
    },
    "list": {
      "type": "string",
      "description": "hostnames, paths, referrers, countries, ip_ranges, user_agents ou events"
    },
    "pattern": {
      "type": "string",
      "description": "Motif (jokers *, CIDR pour ip_ranges)"
    },
    "label": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "mode": {
      "type": "string",
      "description": "block ou allow (le mode de sa liste)"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /sites/:site_id/traffic_rules/:id.json Supprimer une règle de trafic traffic_rules_delete

Permission : sites.manage

Exemple
curl -X DELETE https://privatusanalytics.com/sites/:site_id/traffic_rules/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Identifiant de règle"
    },
    "list": {
      "type": "string",
      "description": "hostnames, paths, referrers, countries, ip_ranges, user_agents ou events"
    },
    "pattern": {
      "type": "string",
      "description": "Motif (jokers *, CIDR pour ip_ranges)"
    },
    "label": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "mode": {
      "type": "string",
      "description": "block ou allow (le mode de sa liste)"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /sites/:site_id/traffic_rules.json Lister les règles de trafic traffic_rules_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/traffic_rules.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "list": {
      "type": "string",
      "description": "Uniquement les règles de cette liste",
      "enum": [
        "hostnames",
        "paths",
        "referrers",
        "countries",
        "ip_ranges",
        "user_agents",
        "events"
      ]
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Identifiant de règle"
    },
    "list": {
      "type": "string",
      "description": "hostnames, paths, referrers, countries, ip_ranges, user_agents ou events"
    },
    "pattern": {
      "type": "string",
      "description": "Motif (jokers *, CIDR pour ip_ranges)"
    },
    "label": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "mode": {
      "type": "string",
      "description": "block ou allow (le mode de sa liste)"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
POST /sites/:site_id/traffic_rules/test.json Tester si un hit serait compté avec les règles actuelles du site traffic_rules_test

Permission : analytics.read

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/traffic_rules/test.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "URL de la page, par ex. https://example.com/a"
    },
    "referrer": {
      "type": "string",
      "description": "URL ou nom d’hôte du référent"
    },
    "country": {
      "type": "string",
      "description": "Code pays ISO, par ex. US"
    },
    "ip": {
      "type": "string",
      "description": "Adresse IP à tester par rapport à ip_ranges (non stockée)"
    },
    "user_agent": {
      "type": "string",
      "description": "Chaîne User-Agent (réduite au navigateur et à la version majeure, comme à l’ingestion)"
    },
    "event": {
      "type": "string",
      "description": "Nom de l’événement personnalisé"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
PATCH /sites/:site_id/traffic_rules/:id.json Modifier une règle de trafic traffic_rules_update

Permission : sites.manage

Exemple
curl -X PATCH https://privatusanalytics.com/sites/:site_id/traffic_rules/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "pattern": {
      "type": "string",
      "description": "Nouveau motif"
    },
    "label": {
      "type": "string",
      "description": "Nouveau libellé"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Identifiant de règle"
    },
    "list": {
      "type": "string",
      "description": "hostnames, paths, referrers, countries, ip_ranges, user_agents ou events"
    },
    "pattern": {
      "type": "string",
      "description": "Motif (jokers *, CIDR pour ip_ranges)"
    },
    "label": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "mode": {
      "type": "string",
      "description": "block ou allow (le mode de sa liste)"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

Rôles

POST /workspaces/:workspace_id/roles.json Créer un rôle personnalisé roles_create

Permission : members.manage

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/roles.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nom du rôle",
      "examples": [
        "Client reviewer"
      ]
    },
    "permissions": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "analytics.read",
          "analytics.export",
          "content.write",
          "sites.manage",
          "uptime.manage",
          "members.manage",
          "tokens.manage",
          "billing.manage",
          "workspace.manage"
        ]
      },
      "description": "Permissions accordées par le rôle"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "name",
    "permissions",
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Identifiant de rôle personnalisé (custom_role_id sur les membres)"
    },
    "name": {
      "type": "string"
    },
    "permissions": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Permissions accordées"
    },
    "members": {
      "type": "integer",
      "description": "Membres ayant ce rôle"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /workspaces/:workspace_id/roles/:id.json Supprimer un rôle personnalisé (doit être inutilisé) roles_delete

Permission : members.manage

Exemple
curl -X DELETE https://privatusanalytics.com/workspaces/:workspace_id/roles/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "workspace_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Identifiant de rôle personnalisé (custom_role_id sur les membres)"
    },
    "name": {
      "type": "string"
    },
    "permissions": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Permissions accordées"
    },
    "members": {
      "type": "integer",
      "description": "Membres ayant ce rôle"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /workspaces/:workspace_id/roles.json Lister les rôles personnalisés roles_list

Permission : member

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/roles.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "format": "uuid",
        "description": "Identifiant de rôle personnalisé (custom_role_id sur les membres)"
      },
      "name": {
        "type": "string"
      },
      "permissions": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "description": "Permissions accordées"
      },
      "members": {
        "type": "integer",
        "description": "Membres ayant ce rôle"
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
PATCH /workspaces/:workspace_id/roles/:id.json Mettre à jour un rôle personnalisé roles_update

Permission : members.manage

Exemple
curl -X PATCH https://privatusanalytics.com/workspaces/:workspace_id/roles/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nom du rôle"
    },
    "permissions": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "analytics.read",
          "analytics.export",
          "content.write",
          "sites.manage",
          "uptime.manage",
          "members.manage",
          "tokens.manage",
          "billing.manage",
          "workspace.manage"
        ]
      },
      "description": "Permissions accordées par le rôle"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "workspace_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "format": "uuid",
      "description": "Identifiant de rôle personnalisé (custom_role_id sur les membres)"
    },
    "name": {
      "type": "string"
    },
    "permissions": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Permissions accordées"
    },
    "members": {
      "type": "integer",
      "description": "Membres ayant ce rôle"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

SCIM

POST /scim/v2/Users.json Provisionner un utilisateur scim_users_create

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl -X POST https://privatusanalytics.com/scim/v2/Users.json \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "userName": {
      "type": "string",
      "description": "Adresse e-mail"
    },
    "name": {
      "type": "object",
      "additionalProperties": true,
      "description": "givenName, familyName, formatted",
      "default": {}
    },
    "active": {
      "type": "boolean",
      "description": "Membre de l’espace de travail",
      "default": true
    }
  },
  "required": [
    "userName"
  ]
}
Données de réponse
{
  "type": "object"
}
DELETE /scim/v2/Users/:id.json Déprovisionner un utilisateur scim_users_delete

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl -X DELETE https://privatusanalytics.com/scim/v2/Users/:id.json \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /scim/v2/Users.json Lister les utilisateurs provisionnés scim_users_list

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl https://privatusanalytics.com/scim/v2/Users.json
Entrées
{
  "type": "object",
  "properties": {
    "scim_filter": {
      "type": "string",
      "description": "Filtre SCIM (paramètre de requête `filter`), par ex. userName eq \"[email protected]\""
    },
    "startIndex": {
      "type": "integer",
      "description": "Index du premier résultat, à partir de 1",
      "default": 1
    },
    "count": {
      "type": "integer",
      "description": "Taille de page (200 maximum)",
      "default": 100
    }
  },
  "required": []
}
Données de réponse
{
  "type": "object"
}
GET /scim/v2/Users/:id.json Obtenir un utilisateur provisionné scim_users_get

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl https://privatusanalytics.com/scim/v2/Users/:id.json
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object"
}
PATCH /scim/v2/Users/:id.json Mettre à jour un utilisateur (PATCH active, name) scim_users_update

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl -X PATCH https://privatusanalytics.com/scim/v2/Users/:id.json \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "Operations": {
      "type": "array",
      "items": {
        "type": "object",
        "additionalProperties": true
      },
      "description": "Opérations SCIM PatchOp"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "Operations",
    "id"
  ]
}
Données de réponse
{
  "type": "object"
}

SSO

POST /workspaces/:workspace_id/sso/activate.json Activer une configuration SSO testée sso_activate

Permission : workspace.manage

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/sso/activate.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "protocol": {
      "type": "string",
      "description": "saml ou oidc"
    },
    "status": {
      "type": "string",
      "description": "draft, testing, tested ou active"
    },
    "enforced": {
      "type": "boolean",
      "description": "Le SSO est la seule voie d’accès (propriétaire excepté)"
    },
    "domains": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Domaines e-mail vérifiés"
    },
    "idp_sso_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "idp_entity_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "idp_cert_present": {
      "type": "boolean"
    },
    "oidc_issuer": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "oidc_client_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "oidc_client_secret_present": {
      "type": "boolean"
    },
    "default_role": {
      "type": "string"
    },
    "jit_provisioning": {
      "type": "boolean"
    },
    "scim_enabled": {
      "type": "boolean"
    }
  }
}
POST /workspaces/:workspace_id/sso/deactivate.json Désactiver le SSO (retour au brouillon) sso_deactivate

Permission : workspace.manage

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/sso/deactivate.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "protocol": {
      "type": "string",
      "description": "saml ou oidc"
    },
    "status": {
      "type": "string",
      "description": "draft, testing, tested ou active"
    },
    "enforced": {
      "type": "boolean",
      "description": "Le SSO est la seule voie d’accès (propriétaire excepté)"
    },
    "domains": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Domaines e-mail vérifiés"
    },
    "idp_sso_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "idp_entity_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "idp_cert_present": {
      "type": "boolean"
    },
    "oidc_issuer": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "oidc_client_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "oidc_client_secret_present": {
      "type": "boolean"
    },
    "default_role": {
      "type": "string"
    },
    "jit_provisioning": {
      "type": "boolean"
    },
    "scim_enabled": {
      "type": "boolean"
    }
  }
}
POST /workspaces/:workspace_id/sso/scim_token.json Générer un nouveau jeton SCIM (affiché une seule fois) sso_scim_token

Permission : workspace.manage · HTTP uniquement (pas un outil MCP)

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/sso/scim_token.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /workspaces/:workspace_id/sso.json Obtenir les paramètres SSO sso_get

Permission : workspace.manage

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/sso.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "protocol": {
      "type": "string",
      "description": "saml ou oidc"
    },
    "status": {
      "type": "string",
      "description": "draft, testing, tested ou active"
    },
    "enforced": {
      "type": "boolean",
      "description": "Le SSO est la seule voie d’accès (propriétaire excepté)"
    },
    "domains": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Domaines e-mail vérifiés"
    },
    "idp_sso_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "idp_entity_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "idp_cert_present": {
      "type": "boolean"
    },
    "oidc_issuer": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "oidc_client_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "oidc_client_secret_present": {
      "type": "boolean"
    },
    "default_role": {
      "type": "string"
    },
    "jit_provisioning": {
      "type": "boolean"
    },
    "scim_enabled": {
      "type": "boolean"
    }
  }
}
PATCH /workspaces/:workspace_id/sso.json Créer ou mettre à jour les paramètres SSO sso_update

Permission : workspace.manage

Exemple
curl -X PATCH https://privatusanalytics.com/workspaces/:workspace_id/sso.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "protocol": {
      "type": "string",
      "description": "saml ou oidc",
      "enum": [
        "saml",
        "oidc"
      ]
    },
    "idp_sso_url": {
      "type": "string",
      "description": "SAML : URL d’authentification unique de l’IdP"
    },
    "idp_entity_id": {
      "type": "string",
      "description": "SAML : identifiant d’entité de l’IdP (émetteur)"
    },
    "idp_cert": {
      "type": "string",
      "description": "SAML : certificat de signature X.509 de l’IdP (PEM)"
    },
    "oidc_issuer": {
      "type": "string",
      "description": "OIDC : URL de l’émetteur (découverte)"
    },
    "oidc_client_id": {
      "type": "string",
      "description": "OIDC : identifiant client"
    },
    "oidc_client_secret": {
      "type": "string",
      "description": "OIDC : secret client (écriture seule)"
    },
    "domains": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Domaines e-mail vérifiés qui utilisent ce SSO"
    },
    "default_role": {
      "type": "string",
      "description": "Rôle des membres créés par JIT ou SCIM",
      "enum": [
        "admin",
        "editor",
        "analyst",
        "viewer",
        "billing"
      ]
    },
    "jit_provisioning": {
      "type": "boolean",
      "description": "Créer les membres à la première connexion SSO"
    },
    "enforced": {
      "type": "boolean",
      "description": "N’autoriser que les connexions SSO (nécessite une configuration active)"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "protocol": {
      "type": "string",
      "description": "saml ou oidc"
    },
    "status": {
      "type": "string",
      "description": "draft, testing, tested ou active"
    },
    "enforced": {
      "type": "boolean",
      "description": "Le SSO est la seule voie d’accès (propriétaire excepté)"
    },
    "domains": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Domaines e-mail vérifiés"
    },
    "idp_sso_url": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "idp_entity_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "idp_cert_present": {
      "type": "boolean"
    },
    "oidc_issuer": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "oidc_client_id": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "oidc_client_secret_present": {
      "type": "boolean"
    },
    "default_role": {
      "type": "string"
    },
    "jit_provisioning": {
      "type": "boolean"
    },
    "scim_enabled": {
      "type": "boolean"
    }
  }
}

Segments

POST /sites/:site_id/segments.json Enregistrer des filtres comme segment segments_create

Permission : content.write

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/segments.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nom du segment, par exemple « Visiteurs mobiles venant des publicités »",
      "examples": [
        "Mobile visitors from ads"
      ]
    },
    "description": {
      "type": "string",
      "description": "Note facultative sur l’utilité du segment (300 caractères au plus)",
      "examples": [
        "People who might buy the Pro plan"
      ]
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres, qui doivent tous correspondre. Chaque élément est une condition [\"dimension\", \"operator\", \"value\"], ou {\"any\": [conditions]} lorsqu’une seule condition parmi plusieurs suffit. Dimensions : page, entry_page, exit_page, hostname, channel, referrer, referrer_url, ref, utm_source, utm_medium, utm_campaign, utm_content, utm_term, country (code ISO, par exemple US), language, device (desktop, mobile, tablet, tv, other), browser, browser_version, os, os_version, screen, goal (identifiant d’objectif), event (nom d’événement personnalisé) et prop:<key> (propriété d’événement personnalisé). Opérateurs : is, is_not, contains, not_contains, starts_with, regex, not_regex, any_of et none_of (la valeur est une liste), gt et lt (un nombre), between (une liste de deux nombres). Les lignes du formulaire de segment sont aussi acceptées : {\"dimension\", \"operator\", \"value\", \"property\" (pour la dimension prop), \"join\": \"and\" ou \"or\" (or combine la ligne avec la précédente)}. Exemple : [[\"country\", \"is\", \"US\"], [\"device\", \"is\", \"mobile\"], {\"any\": [[\"page\", \"starts_with\", \"/pricing\"], [\"goal\", \"is\", \"goal_7Q2K9XH3AB\"]]}]",
      "examples": [
        [
          [
            "country",
            "is",
            "US"
          ],
          [
            "device",
            "is",
            "mobile"
          ],
          {
            "any": [
              [
                "page",
                "starts_with",
                "/pricing"
              ],
              [
                "goal",
                "is",
                "goal_7Q2K9XH3AB"
              ]
            ]
          }
        ]
      ]
    },
    "shared": {
      "type": "boolean",
      "description": "Visible par toute personne ayant accès au site (false : vous seul)",
      "default": true
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "name",
    "filters",
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de segment, par ex. seg_7Q2K9XH3AB"
    },
    "site_id": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "description": {
      "anyOf": [
        {
          "type": "string",
          "description": "L’utilité du segment, ou null"
        },
        {
          "type": "null"
        }
      ]
    },
    "filters": {
      "type": "array",
      "description": "Filtres au format des filtres de statistiques : des conditions [\"dimension\", \"operator\", \"value\"] qui doivent toutes correspondre, et des groupes {\"any\": [conditions]}"
    },
    "summary": {
      "type": "string",
      "description": "Les filtres en langage naturel, par exemple « Visiteurs des États-Unis sur mobile ayant vu /pricing »"
    },
    "shared": {
      "type": "boolean",
      "description": "Visible par toute personne ayant accès au site"
    },
    "mine": {
      "type": "boolean",
      "description": "Créé par vous"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /sites/:site_id/segments/:id.json Supprimer un segment segments_delete

Permission : content.write

Exemple
curl -X DELETE https://privatusanalytics.com/sites/:site_id/segments/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de segment, par ex. seg_7Q2K9XH3AB"
    },
    "site_id": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "description": {
      "anyOf": [
        {
          "type": "string",
          "description": "L’utilité du segment, ou null"
        },
        {
          "type": "null"
        }
      ]
    },
    "filters": {
      "type": "array",
      "description": "Filtres au format des filtres de statistiques : des conditions [\"dimension\", \"operator\", \"value\"] qui doivent toutes correspondre, et des groupes {\"any\": [conditions]}"
    },
    "summary": {
      "type": "string",
      "description": "Les filtres en langage naturel, par exemple « Visiteurs des États-Unis sur mobile ayant vu /pricing »"
    },
    "shared": {
      "type": "boolean",
      "description": "Visible par toute personne ayant accès au site"
    },
    "mine": {
      "type": "boolean",
      "description": "Créé par vous"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /sites/:site_id/segments.json Lister les segments utilisables sur un site segments_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/segments.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant de segment, par ex. seg_7Q2K9XH3AB"
      },
      "site_id": {
        "type": "string"
      },
      "name": {
        "type": "string"
      },
      "description": {
        "anyOf": [
          {
            "type": "string",
            "description": "L’utilité du segment, ou null"
          },
          {
            "type": "null"
          }
        ]
      },
      "filters": {
        "type": "array",
        "description": "Filtres au format des filtres de statistiques : des conditions [\"dimension\", \"operator\", \"value\"] qui doivent toutes correspondre, et des groupes {\"any\": [conditions]}"
      },
      "summary": {
        "type": "string",
        "description": "Les filtres en langage naturel, par exemple « Visiteurs des États-Unis sur mobile ayant vu /pricing »"
      },
      "shared": {
        "type": "boolean",
        "description": "Visible par toute personne ayant accès au site"
      },
      "mine": {
        "type": "boolean",
        "description": "Créé par vous"
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      },
      "updated_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
POST /sites/:site_id/segments/preview.json Décrire des filtres en langage naturel et compter les visiteurs correspondants sur les 30 derniers jours segments_preview

Permission : analytics.read

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/segments/preview.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres, qui doivent tous correspondre. Chaque élément est une condition [\"dimension\", \"operator\", \"value\"], ou {\"any\": [conditions]} lorsqu’une seule condition parmi plusieurs suffit. Dimensions : page, entry_page, exit_page, hostname, channel, referrer, referrer_url, ref, utm_source, utm_medium, utm_campaign, utm_content, utm_term, country (code ISO, par exemple US), language, device (desktop, mobile, tablet, tv, other), browser, browser_version, os, os_version, screen, goal (identifiant d’objectif), event (nom d’événement personnalisé) et prop:<key> (propriété d’événement personnalisé). Opérateurs : is, is_not, contains, not_contains, starts_with, regex, not_regex, any_of et none_of (la valeur est une liste), gt et lt (un nombre), between (une liste de deux nombres). Les lignes du formulaire de segment sont aussi acceptées : {\"dimension\", \"operator\", \"value\", \"property\" (pour la dimension prop), \"join\": \"and\" ou \"or\" (or combine la ligne avec la précédente)}. Exemple : [[\"country\", \"is\", \"US\"], [\"device\", \"is\", \"mobile\"], {\"any\": [[\"page\", \"starts_with\", \"/pricing\"], [\"goal\", \"is\", \"goal_7Q2K9XH3AB\"]]}]",
      "examples": [
        [
          [
            "country",
            "is",
            "US"
          ],
          [
            "device",
            "is",
            "mobile"
          ],
          {
            "any": [
              [
                "page",
                "starts_with",
                "/pricing"
              ],
              [
                "goal",
                "is",
                "goal_7Q2K9XH3AB"
              ]
            ]
          }
        ]
      ],
      "default": []
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /sites/:site_id/segments/:id.json Obtenir un segment segments_get

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/segments/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de segment, par ex. seg_7Q2K9XH3AB"
    },
    "site_id": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "description": {
      "anyOf": [
        {
          "type": "string",
          "description": "L’utilité du segment, ou null"
        },
        {
          "type": "null"
        }
      ]
    },
    "filters": {
      "type": "array",
      "description": "Filtres au format des filtres de statistiques : des conditions [\"dimension\", \"operator\", \"value\"] qui doivent toutes correspondre, et des groupes {\"any\": [conditions]}"
    },
    "summary": {
      "type": "string",
      "description": "Les filtres en langage naturel, par exemple « Visiteurs des États-Unis sur mobile ayant vu /pricing »"
    },
    "shared": {
      "type": "boolean",
      "description": "Visible par toute personne ayant accès au site"
    },
    "mine": {
      "type": "boolean",
      "description": "Créé par vous"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
PATCH /sites/:site_id/segments/:id.json Renommer un segment ou modifier ses filtres ou son partage segments_update

Permission : content.write

Exemple
curl -X PATCH https://privatusanalytics.com/sites/:site_id/segments/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nom du segment"
    },
    "description": {
      "type": "string",
      "description": "Note facultative sur l’utilité du segment (300 caractères au plus, vide pour l’effacer)"
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres de remplacement, au même format qu’à la création. Filtres, qui doivent tous correspondre. Chaque élément est une condition [\"dimension\", \"operator\", \"value\"], ou {\"any\": [conditions]} lorsqu’une seule condition parmi plusieurs suffit. Dimensions : page, entry_page, exit_page, hostname, channel, referrer, referrer_url, ref, utm_source, utm_medium, utm_campaign, utm_content, utm_term, country (code ISO, par exemple US), language, device (desktop, mobile, tablet, tv, other), browser, browser_version, os, os_version, screen, goal (identifiant d’objectif), event (nom d’événement personnalisé) et prop:<key> (propriété d’événement personnalisé). Opérateurs : is, is_not, contains, not_contains, starts_with, regex, not_regex, any_of et none_of (la valeur est une liste), gt et lt (un nombre), between (une liste de deux nombres). Les lignes du formulaire de segment sont aussi acceptées : {\"dimension\", \"operator\", \"value\", \"property\" (pour la dimension prop), \"join\": \"and\" ou \"or\" (or combine la ligne avec la précédente)}. Exemple : [[\"country\", \"is\", \"US\"], [\"device\", \"is\", \"mobile\"], {\"any\": [[\"page\", \"starts_with\", \"/pricing\"], [\"goal\", \"is\", \"goal_7Q2K9XH3AB\"]]}]",
      "examples": [
        [
          [
            "country",
            "is",
            "US"
          ],
          [
            "device",
            "is",
            "mobile"
          ],
          {
            "any": [
              [
                "page",
                "starts_with",
                "/pricing"
              ],
              [
                "goal",
                "is",
                "goal_7Q2K9XH3AB"
              ]
            ]
          }
        ]
      ]
    },
    "shared": {
      "type": "boolean",
      "description": "Visible par tous ceux qui ont accès au site"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "site_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de segment, par ex. seg_7Q2K9XH3AB"
    },
    "site_id": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "description": {
      "anyOf": [
        {
          "type": "string",
          "description": "L’utilité du segment, ou null"
        },
        {
          "type": "null"
        }
      ]
    },
    "filters": {
      "type": "array",
      "description": "Filtres au format des filtres de statistiques : des conditions [\"dimension\", \"operator\", \"value\"] qui doivent toutes correspondre, et des groupes {\"any\": [conditions]}"
    },
    "summary": {
      "type": "string",
      "description": "Les filtres en langage naturel, par exemple « Visiteurs des États-Unis sur mobile ayant vu /pricing »"
    },
    "shared": {
      "type": "boolean",
      "description": "Visible par toute personne ayant accès au site"
    },
    "mine": {
      "type": "boolean",
      "description": "Créé par vous"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

Site web

GET /changelog.json Lister les entrées du journal des modifications changelog_list

Mises à jour publiées du produit, les plus récentes en premier. Disponible aussi en RSS sur /changelog.rss.

Permission : public

Exemple
curl https://privatusanalytics.com/changelog.json
Entrées
{
  "type": "object",
  "properties": {
    "area": {
      "type": "string",
      "description": "Uniquement les entrées de ce domaine du produit",
      "enum": [
        "product",
        "dashboard",
        "tracker",
        "privacy",
        "api",
        "integrations",
        "billing",
        "docs"
      ]
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": []
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant d’entrée, par ex. chg_7Q2K9XH3AB"
      },
      "title": {
        "type": "string",
        "description": "Titre"
      },
      "area": {
        "type": "string",
        "description": "Domaine du produit, par ex. dashboard, tracker, api"
      },
      "body": {
        "type": "string",
        "description": "Corps en Markdown"
      },
      "published_at": {
        "type": "string",
        "format": "date-time",
        "description": "Date de publication"
      },
      "url": {
        "type": "string",
        "description": "Lien permanent"
      }
    }
  }
}
GET /changelog/:id.json Obtenir une entrée du journal des modifications changelog_get

Permission : public

Exemple
curl https://privatusanalytics.com/changelog/:id.json
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’entrée, par ex. chg_7Q2K9XH3AB"
    },
    "title": {
      "type": "string",
      "description": "Titre"
    },
    "area": {
      "type": "string",
      "description": "Domaine du produit, par ex. dashboard, tracker, api"
    },
    "body": {
      "type": "string",
      "description": "Corps en Markdown"
    },
    "published_at": {
      "type": "string",
      "format": "date-time",
      "description": "Date de publication"
    },
    "url": {
      "type": "string",
      "description": "Lien permanent"
    }
  }
}
POST /contact.json Envoyer un message à l’équipe Privatus Analytics contact_create

Les clients navigateur envoient un jeton Cloudflare Turnstile dans `cf-turnstile-response`. Les requêtes avec un jeton d’API n’en ont pas besoin.

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl -X POST https://privatusanalytics.com/contact.json \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Votre nom",
      "examples": [
        "Ada Lovelace"
      ]
    },
    "email": {
      "type": "string",
      "description": "Adresse où nous devons répondre",
      "examples": [
        "[email protected]"
      ]
    },
    "company": {
      "type": "string",
      "description": "Société ou organisation (facultatif)"
    },
    "topic": {
      "type": "string",
      "description": "Sujet du message",
      "enum": [
        "general",
        "sales",
        "support",
        "privacy",
        "security",
        "partnerships",
        "press"
      ],
      "default": "general"
    },
    "message": {
      "type": "string",
      "description": "Votre message (10 à 5 000 caractères)"
    },
    "website": {
      "type": "string",
      "description": "Laissez vide. Piège à spam pour les bots. Les envois remplis sont ignorés"
    }
  },
  "required": [
    "name",
    "email",
    "message"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "received": {
      "type": "boolean",
      "description": "Toujours true lorsque l’envoi a été accepté"
    },
    "message": {
      "type": "string",
      "description": "Ce qui se passe ensuite"
    }
  }
}
POST /newsletter/confirm.json Confirmer un abonnement à la newsletter (jeton signé) newsletter_confirm

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl -X POST https://privatusanalytics.com/newsletter/confirm.json \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "Jeton signé de l’e-mail de confirmation"
    }
  },
  "required": [
    "token"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "received": {
      "type": "boolean",
      "description": "Toujours true lorsque l’envoi a été accepté"
    },
    "message": {
      "type": "string",
      "description": "Ce qui se passe ensuite"
    }
  }
}
POST /newsletter.json Abonner une adresse e-mail à la newsletter newsletter_subscribe

Les clients navigateur envoient un jeton Cloudflare Turnstile dans `cf-turnstile-response`. Les requêtes avec un jeton d’API n’en ont pas besoin.

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl -X POST https://privatusanalytics.com/newsletter.json \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "email": {
      "type": "string",
      "description": "Adresse e-mail à abonner. Un lien de confirmation lui est envoyé",
      "examples": [
        "[email protected]"
      ]
    },
    "website": {
      "type": "string",
      "description": "Laissez vide. Piège à spam pour les bots. Les envois remplis sont ignorés"
    }
  },
  "required": [
    "email"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "received": {
      "type": "boolean",
      "description": "Toujours true lorsque l’envoi a été accepté"
    },
    "message": {
      "type": "string",
      "description": "Ce qui se passe ensuite"
    }
  }
}
POST /newsletter/unsubscribe.json Se désabonner avec un jeton de lien signé newsletter_unsubscribe

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl -X POST https://privatusanalytics.com/newsletter/unsubscribe.json \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "Jeton signé du lien de désabonnement"
    },
    "list": {
      "type": "string",
      "description": "newsletter (par défaut : la liste concernée par le lien) ou marketing (tous les e-mails marketing)",
      "enum": [
        "newsletter",
        "marketing"
      ]
    }
  },
  "required": [
    "token"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "received": {
      "type": "boolean",
      "description": "Toujours true lorsque l’envoi a été accepté"
    },
    "message": {
      "type": "string",
      "description": "Ce qui se passe ensuite"
    }
  }
}
GET /pricing.json Obtenir les forfaits, prix et limites des forfaits pricing_get

Les mêmes données que la page des tarifs : l’échelle d’événements, chaque limite de forfait et ce qui compte comme un événement. Passez events pour obtenir le palier correspondant.

Permission : public

Exemple
curl https://privatusanalytics.com/pricing.json
Entrées
{
  "type": "object",
  "properties": {
    "events": {
      "type": "integer",
      "description": "Pages vues et événements personnalisés attendus par mois. Renvoie le palier correspondant dans `recommendation`",
      "examples": [
        750000
      ]
    },
    "interval": {
      "type": "string",
      "description": "Intervalle de facturation des prix affichés : month, ou year (10 fois le prix mensuel)",
      "enum": [
        "month",
        "year"
      ],
      "default": "month"
    }
  },
  "required": []
}
Données de réponse
{
  "type": "object",
  "properties": {
    "currency": {
      "type": "string",
      "description": "Devise de chaque prix (USD)"
    },
    "tax_included": {
      "type": "boolean",
      "description": "Toujours true. Les prix incluent la TVA ou la taxe de vente, le prix affiché est donc le prix payé"
    },
    "interval": {
      "type": "string",
      "description": "month ou year. Les prix sont pour cet intervalle"
    },
    "annual_multiplier": {
      "type": "integer",
      "description": "Prix annuel = prix mensuel x ce facteur (deux mois offerts)"
    },
    "free_events": {
      "type": "integer",
      "description": "Événements mensuels inclus dans le forfait Free"
    },
    "badge_bonus": {
      "type": "integer",
      "description": "Événements gratuits supplémentaires par mois lorsque le badge facultatif est affiché"
    },
    "tiers": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Échelle d’événements : prix { events, pro, business } pour l’intervalle (pro vaut null lorsque seul Business est proposé), plus les prix mensuels"
    },
    "plans": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Forfaits avec { id, name, from_price, limits }. Des limites à null signifient illimité"
    },
    "counted": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Ce qui compte comme un événement facturable"
    },
    "not_counted": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Ce qui ne compte jamais dans l’utilisation"
    },
    "recommendation": {
      "anyOf": [
        {
          "type": "object",
          "description": "{ events, plan, tier_events, price } pour l’entrée `events`, ou null lorsqu’aucun volume n’a été donné"
        },
        {
          "type": "null"
        }
      ]
    }
  }
}
GET /status.json Obtenir l’état actuel du système status_get

État de la base de données, de Redis et des tâches d’arrière-plan, vérifié au plus toutes les 15 secondes.

Permission : public

Exemple
curl https://privatusanalytics.com/status.json
Entrées
{
  "type": "object",
  "properties": {
    "fresh": {
      "type": "boolean",
      "description": "Ignorer le cache de 15 secondes et vérifier à nouveau maintenant",
      "default": false
    }
  },
  "required": []
}
Données de réponse
{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "description": "Global : operational, degraded ou outage"
    },
    "checked_at": {
      "type": "string",
      "format": "date-time",
      "description": "Moment d’exécution des vérifications (en cache jusqu’à 15 s)"
    },
    "components": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Par composant : { id, name, status, detail, latency_ms }, plus queue_latency_s et queue_depth pour les files"
    }
  }
}
GET /tools/header-checker.json Vérifier le Referrer-Policy et la CSP d’une page pour l’analytics tools_header_check

Permission : public

Exemple
curl https://privatusanalytics.com/tools/header-checker.json
Entrées
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "Page publique à vérifier (http ou https)",
      "examples": [
        "https://example.com"
      ]
    }
  },
  "required": [
    "url"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "URL finale après redirections"
    },
    "status": {
      "type": "integer",
      "description": "Statut HTTP de la réponse finale"
    },
    "findings": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Vérifications : { check, value, level (ok, warn, info), note }"
    }
  }
}
GET /tools/privacy-policy-generator.json Rédiger un paragraphe de politique de confidentialité pour Privatus Analytics tools_privacy_policy

Permission : public

Exemple
curl https://privatusanalytics.com/tools/privacy-policy-generator.json
Entrées
{
  "type": "object",
  "properties": {
    "site_name": {
      "type": "string",
      "description": "Le nom de votre site web ou de votre société",
      "examples": [
        "Example Books"
      ]
    },
    "contact_email": {
      "type": "string",
      "description": "Contact confidentialité à mentionner (facultatif)"
    },
    "honors_gpc": {
      "type": "boolean",
      "description": "Indique si Do Not Track et Global Privacy Control sont respectés (par défaut)",
      "default": true
    }
  },
  "required": [
    "site_name"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "site_name": {
      "type": "string",
      "description": "Entrée : nom du site ou de la société"
    },
    "paragraphs": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Le texte de la politique, un paragraphe par élément"
    },
    "text": {
      "type": "string",
      "description": "Les paragraphes joints par des lignes vides"
    }
  }
}
GET /tools/qr-code.json Générer un QR code au format SVG tools_qr_code

Permission : public

Exemple
curl https://privatusanalytics.com/tools/qr-code.json
Entrées
{
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "description": "URL ou texte à encoder (jusqu’à 1 000 caractères)",
      "examples": [
        "https://example.com/?utm_source=poster"
      ]
    },
    "level": {
      "type": "string",
      "description": "Correction d’erreur : l (7 %), m (15 %), q (25 %), h (30 %)",
      "enum": [
        "l",
        "m",
        "q",
        "h"
      ],
      "default": "m"
    }
  },
  "required": [
    "text"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "text": {
      "type": "string",
      "description": "Le texte encodé"
    },
    "level": {
      "type": "string",
      "description": "Niveau de correction d’erreur"
    },
    "size": {
      "type": "integer",
      "description": "Modules par côté"
    },
    "svg": {
      "type": "string",
      "description": "Document SVG autonome"
    }
  }
}
GET /tools/tracker-scanner.json Lister les cookies et traqueurs connus d’une page tools_tracker_scan

Permission : public

Exemple
curl https://privatusanalytics.com/tools/tracker-scanner.json
Entrées
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "Page publique à analyser (http ou https)",
      "examples": [
        "https://example.com"
      ]
    }
  },
  "required": [
    "url"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "URL finale après redirections"
    },
    "status": {
      "type": "integer",
      "description": "Statut HTTP de la réponse finale"
    },
    "truncated": {
      "type": "boolean",
      "description": "True lorsque la page dépassait 1 Mo et que seul le premier Mo a été analysé"
    },
    "cookies": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Cookies définis par la réponse HTTP : { name, domain, path, expires, secure, http_only, same_site }. Les valeurs ne sont jamais renvoyées"
    },
    "trackers": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Outils connus référencés par la page : { name, category, match, evidence }"
    },
    "third_party_hosts": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Autres domaines depuis lesquels la page charge des ressources"
    }
  }
}
GET /tools/utm-builder.json Générer une URL de campagne avec paramètres UTM tools_utm_builder

Permission : public

Exemple
curl https://privatusanalytics.com/tools/utm-builder.json
Entrées
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "URL de la page de destination",
      "examples": [
        "https://example.com/pricing"
      ]
    },
    "source": {
      "type": "string",
      "description": "utm_source : origine du trafic",
      "examples": [
        "newsletter"
      ]
    },
    "medium": {
      "type": "string",
      "description": "utm_medium : le canal, par ex. email, cpc, social",
      "examples": [
        "email"
      ]
    },
    "campaign": {
      "type": "string",
      "description": "utm_campaign : le nom de la campagne",
      "examples": [
        "fall_launch"
      ]
    },
    "term": {
      "type": "string",
      "description": "utm_term : mot-clé de recherche payante (facultatif)"
    },
    "content": {
      "type": "string",
      "description": "utm_content : quel lien ou quelle création (facultatif)"
    }
  },
  "required": [
    "url",
    "source",
    "medium",
    "campaign"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "L’URL de la page de destination avec les paramètres UTM"
    },
    "params": {
      "type": "object",
      "description": "Les paramètres UTM ajoutés"
    },
    "warnings": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Problèmes à corriger (casse, espaces, données personnelles)"
    }
  }
}
POST /waitlist.json Rejoindre une liste d’attente (hébergement UE) waitlist_join

Les clients navigateur envoient un jeton Cloudflare Turnstile dans `cf-turnstile-response`. Les requêtes avec un jeton d’API n’en ont pas besoin.

Permission : public · HTTP uniquement (pas un outil MCP)

Exemple
curl -X POST https://privatusanalytics.com/waitlist.json \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "email": {
      "type": "string",
      "description": "Adresse e-mail à prévenir",
      "examples": [
        "[email protected]"
      ]
    },
    "list": {
      "type": "string",
      "description": "Liste d’attente à rejoindre",
      "enum": [
        "eu_hosting"
      ],
      "default": "eu_hosting"
    },
    "website": {
      "type": "string",
      "description": "Laissez vide. Piège à spam pour les bots. Les envois remplis sont ignorés"
    }
  },
  "required": [
    "email"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "received": {
      "type": "boolean",
      "description": "Toujours true lorsque l’envoi a été accepté"
    },
    "message": {
      "type": "string",
      "description": "Ce qui se passe ensuite"
    }
  }
}

Sites

POST /sites/:site_id/data_reset.json Supprimer tous les événements et visites d’une plage de dates (s’exécute en arrière-plan, irréversible) sites_reset_data

Permission : sites.manage

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/data_reset.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "from": {
      "type": "string",
      "format": "date",
      "description": "Premier jour à supprimer (fuseau horaire du site)"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Dernier jour à supprimer, inclus"
    },
    "confirm": {
      "type": "string",
      "description": "Saisissez le domaine pour confirmer"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "from",
    "to",
    "confirm",
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /sites/:site_id/filter_stats.json Résumé du trafic filtré : bots, règles de trafic ou masquages de données personnelles par motif et par pays (comptages uniquement) sites_filter_stats

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/filter_stats.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "kind": {
      "type": "string",
      "description": "bot (bots filtrés), rule (règles de trafic) ou redaction (masquage des données personnelles)",
      "enum": [
        "bot",
        "rule",
        "redaction"
      ],
      "default": "bot"
    },
    "days": {
      "type": "integer",
      "description": "Nombre de jours à remonter (1-395)",
      "default": 30
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /sites/:site_id/access.json Lister les membres et indiquer s’ils peuvent voir ce site sites_access_list

Permission : members.manage

Exemple
curl https://privatusanalytics.com/sites/:site_id/access.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "membership_id": {
      "type": "string",
      "format": "uuid",
      "description": "Identifiant d’appartenance"
    },
    "email": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "role": {
      "type": "string"
    },
    "access": {
      "type": "boolean",
      "description": "Peut voir ce site"
    },
    "locked": {
      "type": "boolean",
      "description": "Les propriétaires et administrateurs ont toujours accès"
    }
  }
}
PATCH /sites/:site_id/access.json Accorder ou retirer l’accès d’un membre à ce site sites_access_update

Permission : members.manage

Exemple
curl -X PATCH https://privatusanalytics.com/sites/:site_id/access.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "membership_id": {
      "type": "string",
      "description": "Identifiant d’appartenance issu de sites_access_list"
    },
    "access": {
      "type": "boolean",
      "description": "true pour accorder l’accès, false pour le retirer"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "membership_id",
    "access",
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "membership_id": {
      "type": "string",
      "format": "uuid",
      "description": "Identifiant d’appartenance"
    },
    "email": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "role": {
      "type": "string"
    },
    "access": {
      "type": "boolean",
      "description": "Peut voir ce site"
    },
    "locked": {
      "type": "boolean",
      "description": "Les propriétaires et administrateurs ont toujours accès"
    }
  }
}
POST /sites/:site_id/favorite.json Mettre un site en favori (épinglé en premier dans Tous les sites) sites_favorite

Permission : analytics.read

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/favorite.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant du site utilisé dans le code de suivi"
    },
    "workspace_id": {
      "type": "string"
    },
    "domain": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "extra_domains": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "multi_domain_mode": {
      "type": "string"
    },
    "timezone": {
      "type": "string"
    },
    "currency": {
      "type": "string"
    },
    "week_start": {
      "type": "integer"
    },
    "labels": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "honor_dnt": {
      "type": "boolean"
    },
    "honor_gpc": {
      "type": "boolean"
    },
    "pii_scrubber": {
      "type": "boolean"
    },
    "redaction_rules": {
      "type": "array"
    },
    "allowed_params": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "path_masks": {
      "type": "array"
    },
    "retention_months": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "bot_filtering": {
      "type": "boolean"
    },
    "traffic_rule_modes": {
      "type": "object"
    },
    "vitals_sample_rate": {
      "type": "integer"
    },
    "conversion_denominator": {
      "type": "string"
    },
    "public_dashboard": {
      "type": "boolean"
    },
    "public_indexable": {
      "type": "boolean"
    },
    "ingest_key_prefix": {
      "anyOf": [
        {
          "type": "string",
          "description": "Début de la clé d’ingestion serveur"
        },
        {
          "type": "null"
        }
      ]
    },
    "verified_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "first_event_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_event_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "snippet": {
      "type": "string",
      "description": "Code de suivi HTML"
    },
    "favorite": {
      "type": "boolean",
      "description": "Mis en favori par vous"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /sites/:site_id/favorite.json Retirer un site des favoris sites_unfavorite

Permission : analytics.read

Exemple
curl -X DELETE https://privatusanalytics.com/sites/:site_id/favorite.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant du site utilisé dans le code de suivi"
    },
    "workspace_id": {
      "type": "string"
    },
    "domain": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "extra_domains": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "multi_domain_mode": {
      "type": "string"
    },
    "timezone": {
      "type": "string"
    },
    "currency": {
      "type": "string"
    },
    "week_start": {
      "type": "integer"
    },
    "labels": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "honor_dnt": {
      "type": "boolean"
    },
    "honor_gpc": {
      "type": "boolean"
    },
    "pii_scrubber": {
      "type": "boolean"
    },
    "redaction_rules": {
      "type": "array"
    },
    "allowed_params": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "path_masks": {
      "type": "array"
    },
    "retention_months": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "bot_filtering": {
      "type": "boolean"
    },
    "traffic_rule_modes": {
      "type": "object"
    },
    "vitals_sample_rate": {
      "type": "integer"
    },
    "conversion_denominator": {
      "type": "string"
    },
    "public_dashboard": {
      "type": "boolean"
    },
    "public_indexable": {
      "type": "boolean"
    },
    "ingest_key_prefix": {
      "anyOf": [
        {
          "type": "string",
          "description": "Début de la clé d’ingestion serveur"
        },
        {
          "type": "null"
        }
      ]
    },
    "verified_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "first_event_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_event_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "snippet": {
      "type": "string",
      "description": "Code de suivi HTML"
    },
    "favorite": {
      "type": "boolean",
      "description": "Mis en favori par vous"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /sites/:site_id/setup.json État de l’installation et code d’intégration d’un site sites_setup_get

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/setup.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
POST /transfers/:token/accept.json Accepter le transfert d’un site vers l’un de vos espaces de travail site_transfers_accept

Permission : public

Exemple
curl -X POST https://privatusanalytics.com/transfers/:token/accept.json \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Espace de travail dans lequel déplacer le site (ws_…)"
    },
    "token": {
      "type": "string",
      "description": "Token de la ressource"
    }
  },
  "required": [
    "workspace_id",
    "token"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Site en cours de transfert"
    },
    "site_domain": {
      "type": "string"
    },
    "from_workspace": {
      "type": "string",
      "description": "Nom de l’espace de travail actuel"
    },
    "to_workspace_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Espace de travail destinataire"
        },
        {
          "type": "null"
        }
      ]
    },
    "to_email": {
      "type": "string",
      "description": "E-mail du destinataire"
    },
    "status": {
      "type": "string",
      "description": "pending, accepted ou canceled"
    },
    "expires_at": {
      "type": "string",
      "format": "date-time"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
POST /sites/:site_id/transfer.json Démarrer le transfert d’un site vers un autre espace de travail (envoie un e-mail au destinataire) sites_transfer_start

Permission : sites.manage

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/transfer.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "email": {
      "type": "string",
      "description": "E-mail de la personne qui recevra le site (elle choisit l’un de ses espaces de travail)"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "email",
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Site en cours de transfert"
    },
    "site_domain": {
      "type": "string"
    },
    "from_workspace": {
      "type": "string",
      "description": "Nom de l’espace de travail actuel"
    },
    "to_workspace_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Espace de travail destinataire"
        },
        {
          "type": "null"
        }
      ]
    },
    "to_email": {
      "type": "string",
      "description": "E-mail du destinataire"
    },
    "status": {
      "type": "string",
      "description": "pending, accepted ou canceled"
    },
    "expires_at": {
      "type": "string",
      "format": "date-time"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /sites/:site_id/transfer.json Annuler un transfert de site en attente sites_transfer_cancel

Permission : sites.manage

Exemple
curl -X DELETE https://privatusanalytics.com/sites/:site_id/transfer.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Site en cours de transfert"
    },
    "site_domain": {
      "type": "string"
    },
    "from_workspace": {
      "type": "string",
      "description": "Nom de l’espace de travail actuel"
    },
    "to_workspace_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Espace de travail destinataire"
        },
        {
          "type": "null"
        }
      ]
    },
    "to_email": {
      "type": "string",
      "description": "E-mail du destinataire"
    },
    "status": {
      "type": "string",
      "description": "pending, accepted ou canceled"
    },
    "expires_at": {
      "type": "string",
      "format": "date-time"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /transfers/:token.json Obtenir un transfert en attente à partir du jeton reçu par e-mail site_transfers_get

Permission : public

Exemple
curl https://privatusanalytics.com/transfers/:token.json
Entrées
{
  "type": "object",
  "properties": {
    "token": {
      "type": "string",
      "description": "Token de la ressource"
    }
  },
  "required": [
    "token"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Site en cours de transfert"
    },
    "site_domain": {
      "type": "string"
    },
    "from_workspace": {
      "type": "string",
      "description": "Nom de l’espace de travail actuel"
    },
    "to_workspace_id": {
      "anyOf": [
        {
          "type": "string",
          "description": "Espace de travail destinataire"
        },
        {
          "type": "null"
        }
      ]
    },
    "to_email": {
      "type": "string",
      "description": "E-mail du destinataire"
    },
    "status": {
      "type": "string",
      "description": "pending, accepted ou canceled"
    },
    "expires_at": {
      "type": "string",
      "format": "date-time"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
POST /workspaces/:workspace_id/sites.json Ajouter un site sites_create

Permission : sites.manage

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/sites.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "domain": {
      "type": "string",
      "description": "Domaine principal, par ex. example.com",
      "examples": [
        "example.com"
      ]
    },
    "name": {
      "type": "string",
      "description": "Nom d’affichage (par défaut, le domaine)"
    },
    "timezone": {
      "type": "string",
      "description": "Fuseau horaire des rapports"
    },
    "currency": {
      "type": "string",
      "description": "Devise des revenus (ISO 4217)"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "domain",
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant du site utilisé dans le code de suivi"
    },
    "workspace_id": {
      "type": "string"
    },
    "domain": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "extra_domains": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "multi_domain_mode": {
      "type": "string"
    },
    "timezone": {
      "type": "string"
    },
    "currency": {
      "type": "string"
    },
    "week_start": {
      "type": "integer"
    },
    "labels": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "honor_dnt": {
      "type": "boolean"
    },
    "honor_gpc": {
      "type": "boolean"
    },
    "pii_scrubber": {
      "type": "boolean"
    },
    "redaction_rules": {
      "type": "array"
    },
    "allowed_params": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "path_masks": {
      "type": "array"
    },
    "retention_months": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "bot_filtering": {
      "type": "boolean"
    },
    "traffic_rule_modes": {
      "type": "object"
    },
    "vitals_sample_rate": {
      "type": "integer"
    },
    "conversion_denominator": {
      "type": "string"
    },
    "public_dashboard": {
      "type": "boolean"
    },
    "public_indexable": {
      "type": "boolean"
    },
    "ingest_key_prefix": {
      "anyOf": [
        {
          "type": "string",
          "description": "Début de la clé d’ingestion serveur"
        },
        {
          "type": "null"
        }
      ]
    },
    "verified_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "first_event_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_event_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "snippet": {
      "type": "string",
      "description": "Code de suivi HTML"
    },
    "favorite": {
      "type": "boolean",
      "description": "Mis en favori par vous"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /sites/:id.json Supprimer un site (purgé après 7 jours) sites_delete

Permission : sites.manage

Exemple
curl -X DELETE https://privatusanalytics.com/sites/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "confirm": {
      "type": "string",
      "description": "Saisissez le domaine pour confirmer"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "confirm",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant du site utilisé dans le code de suivi"
    },
    "workspace_id": {
      "type": "string"
    },
    "domain": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "extra_domains": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "multi_domain_mode": {
      "type": "string"
    },
    "timezone": {
      "type": "string"
    },
    "currency": {
      "type": "string"
    },
    "week_start": {
      "type": "integer"
    },
    "labels": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "honor_dnt": {
      "type": "boolean"
    },
    "honor_gpc": {
      "type": "boolean"
    },
    "pii_scrubber": {
      "type": "boolean"
    },
    "redaction_rules": {
      "type": "array"
    },
    "allowed_params": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "path_masks": {
      "type": "array"
    },
    "retention_months": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "bot_filtering": {
      "type": "boolean"
    },
    "traffic_rule_modes": {
      "type": "object"
    },
    "vitals_sample_rate": {
      "type": "integer"
    },
    "conversion_denominator": {
      "type": "string"
    },
    "public_dashboard": {
      "type": "boolean"
    },
    "public_indexable": {
      "type": "boolean"
    },
    "ingest_key_prefix": {
      "anyOf": [
        {
          "type": "string",
          "description": "Début de la clé d’ingestion serveur"
        },
        {
          "type": "null"
        }
      ]
    },
    "verified_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "first_event_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_event_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "snippet": {
      "type": "string",
      "description": "Code de suivi HTML"
    },
    "favorite": {
      "type": "boolean",
      "description": "Mis en favori par vous"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /workspaces/:workspace_id/sites.json Lister les sites d’un espace de travail sites_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/sites.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "query": {
      "type": "string",
      "description": "Filtrer par domaine ou nom"
    },
    "label": {
      "type": "string",
      "description": "Uniquement les sites avec cette étiquette"
    },
    "sort": {
      "type": "string",
      "description": "position (votre ordre), name, ou visitors sur les 30 derniers jours (les plus élevés en premier)",
      "enum": [
        "position",
        "name",
        "visitors"
      ],
      "default": "position"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant du site utilisé dans le code de suivi"
      },
      "workspace_id": {
        "type": "string"
      },
      "domain": {
        "type": "string"
      },
      "name": {
        "type": "string"
      },
      "extra_domains": {
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "multi_domain_mode": {
        "type": "string"
      },
      "timezone": {
        "type": "string"
      },
      "currency": {
        "type": "string"
      },
      "week_start": {
        "type": "integer"
      },
      "labels": {
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "honor_dnt": {
        "type": "boolean"
      },
      "honor_gpc": {
        "type": "boolean"
      },
      "pii_scrubber": {
        "type": "boolean"
      },
      "redaction_rules": {
        "type": "array"
      },
      "allowed_params": {
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "path_masks": {
        "type": "array"
      },
      "retention_months": {
        "anyOf": [
          {
            "type": "integer"
          },
          {
            "type": "null"
          }
        ]
      },
      "bot_filtering": {
        "type": "boolean"
      },
      "traffic_rule_modes": {
        "type": "object"
      },
      "vitals_sample_rate": {
        "type": "integer"
      },
      "conversion_denominator": {
        "type": "string"
      },
      "public_dashboard": {
        "type": "boolean"
      },
      "public_indexable": {
        "type": "boolean"
      },
      "ingest_key_prefix": {
        "anyOf": [
          {
            "type": "string",
            "description": "Début de la clé d’ingestion serveur"
          },
          {
            "type": "null"
          }
        ]
      },
      "verified_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "first_event_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "last_event_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "snippet": {
        "type": "string",
        "description": "Code de suivi HTML"
      },
      "favorite": {
        "type": "boolean",
        "description": "Mis en favori par vous"
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
GET /sites/:id.json Obtenir un site et tous ses paramètres sites_get

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant du site utilisé dans le code de suivi"
    },
    "workspace_id": {
      "type": "string"
    },
    "domain": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "extra_domains": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "multi_domain_mode": {
      "type": "string"
    },
    "timezone": {
      "type": "string"
    },
    "currency": {
      "type": "string"
    },
    "week_start": {
      "type": "integer"
    },
    "labels": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "honor_dnt": {
      "type": "boolean"
    },
    "honor_gpc": {
      "type": "boolean"
    },
    "pii_scrubber": {
      "type": "boolean"
    },
    "redaction_rules": {
      "type": "array"
    },
    "allowed_params": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "path_masks": {
      "type": "array"
    },
    "retention_months": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "bot_filtering": {
      "type": "boolean"
    },
    "traffic_rule_modes": {
      "type": "object"
    },
    "vitals_sample_rate": {
      "type": "integer"
    },
    "conversion_denominator": {
      "type": "string"
    },
    "public_dashboard": {
      "type": "boolean"
    },
    "public_indexable": {
      "type": "boolean"
    },
    "ingest_key_prefix": {
      "anyOf": [
        {
          "type": "string",
          "description": "Début de la clé d’ingestion serveur"
        },
        {
          "type": "null"
        }
      ]
    },
    "verified_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "first_event_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_event_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "snippet": {
      "type": "string",
      "description": "Code de suivi HTML"
    },
    "favorite": {
      "type": "boolean",
      "description": "Mis en favori par vous"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
PATCH /sites/:id.json Mettre à jour les paramètres d’un site sites_update

Permission : sites.manage

Exemple
curl -X PATCH https://privatusanalytics.com/sites/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nom d’affichage"
    },
    "domain": {
      "type": "string",
      "description": "Domaine principal"
    },
    "extra_domains": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Noms d’hôte supplémentaires"
    },
    "multi_domain_mode": {
      "type": "string",
      "description": "combined : un même visiteur sur tous les domaines",
      "enum": [
        "combined",
        "separate"
      ]
    },
    "timezone": {
      "type": "string",
      "description": "Fuseau horaire des rapports"
    },
    "currency": {
      "type": "string",
      "description": "Devise des revenus (ISO 4217)"
    },
    "week_start": {
      "type": "integer",
      "description": "0 = dimanche, 1 = lundi"
    },
    "labels": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Étiquettes pour regrouper les sites"
    },
    "honor_dnt": {
      "type": "boolean",
      "description": "Ignorer les visiteurs qui envoient DNT"
    },
    "honor_gpc": {
      "type": "boolean",
      "description": "Ignorer les visiteurs qui envoient GPC"
    },
    "pii_scrubber": {
      "type": "boolean",
      "description": "Masquer les e-mails, jetons, identifiants"
    },
    "redaction_rules": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "name": {
            "type": "string"
          },
          "pattern": {
            "type": "string"
          }
        }
      },
      "description": "Expressions régulières de masquage personnalisées"
    },
    "allowed_params": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Paramètres de requête à conserver dans les chemins"
    },
    "path_masks": {
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "pattern": {
            "type": "string"
          },
          "replacement": {
            "type": "string"
          }
        }
      },
      "description": "Règles de masquage de chemin, par ex. /u/* -> /u/:id"
    },
    "retention_months": {
      "type": "integer",
      "description": "Supprimer les données plus anciennes que cette durée"
    },
    "bot_filtering": {
      "type": "boolean",
      "description": "Filtrer le trafic des bots"
    },
    "traffic_rule_modes": {
      "type": "object",
      "additionalProperties": true,
      "description": "block ou allow pour chaque liste de règles de trafic"
    },
    "vitals_sample_rate": {
      "type": "integer",
      "description": "% d’échantillonnage des Web Vitals"
    },
    "conversion_denominator": {
      "type": "string",
      "description": "Taux de conversion sur les visites ou les visiteurs",
      "enum": [
        "visits",
        "visitors"
      ]
    },
    "public_dashboard": {
      "type": "boolean",
      "description": "Toute personne disposant du lien peut voir les statistiques"
    },
    "public_indexable": {
      "type": "boolean",
      "description": "Autoriser les moteurs de recherche à indexer la page publique"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant du site utilisé dans le code de suivi"
    },
    "workspace_id": {
      "type": "string"
    },
    "domain": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "extra_domains": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "multi_domain_mode": {
      "type": "string"
    },
    "timezone": {
      "type": "string"
    },
    "currency": {
      "type": "string"
    },
    "week_start": {
      "type": "integer"
    },
    "labels": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "honor_dnt": {
      "type": "boolean"
    },
    "honor_gpc": {
      "type": "boolean"
    },
    "pii_scrubber": {
      "type": "boolean"
    },
    "redaction_rules": {
      "type": "array"
    },
    "allowed_params": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "path_masks": {
      "type": "array"
    },
    "retention_months": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "bot_filtering": {
      "type": "boolean"
    },
    "traffic_rule_modes": {
      "type": "object"
    },
    "vitals_sample_rate": {
      "type": "integer"
    },
    "conversion_denominator": {
      "type": "string"
    },
    "public_dashboard": {
      "type": "boolean"
    },
    "public_indexable": {
      "type": "boolean"
    },
    "ingest_key_prefix": {
      "anyOf": [
        {
          "type": "string",
          "description": "Début de la clé d’ingestion serveur"
        },
        {
          "type": "null"
        }
      ]
    },
    "verified_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "first_event_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_event_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "snippet": {
      "type": "string",
      "description": "Code de suivi HTML"
    },
    "favorite": {
      "type": "boolean",
      "description": "Mis en favori par vous"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

Suivi

POST /sites/:site_id/tracking/ingest_key.json Créer ou renouveler la clé d’ingestion serveur (affichée une seule fois) tracking_ingest_key_rotate

Permission : sites.manage

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/tracking/ingest_key.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site"
    },
    "key": {
      "type": "string",
      "description": "La clé d’ingestion. Affichée une seule fois : conservez-la maintenant. Envoyez-la comme jeton Bearer à POST /api/events"
    },
    "prefix": {
      "type": "string",
      "description": "Préfixe de la clé affiché dans les paramètres"
    }
  }
}
DELETE /sites/:site_id/tracking/ingest_key.json Révoquer la clé d’ingestion serveur tracking_ingest_key_revoke

Permission : sites.manage

Exemple
curl -X DELETE https://privatusanalytics.com/sites/:site_id/tracking/ingest_key.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant du site utilisé dans le code de suivi"
    },
    "workspace_id": {
      "type": "string"
    },
    "domain": {
      "type": "string"
    },
    "name": {
      "type": "string"
    },
    "extra_domains": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "multi_domain_mode": {
      "type": "string"
    },
    "timezone": {
      "type": "string"
    },
    "currency": {
      "type": "string"
    },
    "week_start": {
      "type": "integer"
    },
    "labels": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "honor_dnt": {
      "type": "boolean"
    },
    "honor_gpc": {
      "type": "boolean"
    },
    "pii_scrubber": {
      "type": "boolean"
    },
    "redaction_rules": {
      "type": "array"
    },
    "allowed_params": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "path_masks": {
      "type": "array"
    },
    "retention_months": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "bot_filtering": {
      "type": "boolean"
    },
    "traffic_rule_modes": {
      "type": "object"
    },
    "vitals_sample_rate": {
      "type": "integer"
    },
    "conversion_denominator": {
      "type": "string"
    },
    "public_dashboard": {
      "type": "boolean"
    },
    "public_indexable": {
      "type": "boolean"
    },
    "ingest_key_prefix": {
      "anyOf": [
        {
          "type": "string",
          "description": "Début de la clé d’ingestion serveur"
        },
        {
          "type": "null"
        }
      ]
    },
    "verified_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "first_event_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_event_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "snippet": {
      "type": "string",
      "description": "Code de suivi HTML"
    },
    "favorite": {
      "type": "boolean",
      "description": "Mis en favori par vous"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
POST /sites/:site_id/tracking/verify.json Vérifier que le traqueur est installé sur le site (balise script, identifiant du site, CSP et politique de référent) tracking_verify

Permission : sites.manage

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/tracking/verify.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "Page à vérifier (par défaut https://<domaine>/)"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /sites/:site_id/tracking/snippet.json Générer le code de suivi pour les options choisies tracking_snippet

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/tracking/snippet.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "modules": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Modules facultatifs : auto (liens sortants, téléchargements, formulaires, 404), engage (temps et défilement), vitals (Web Vitals), clicks",
      "default": [
        "engage"
      ]
    },
    "manual": {
      "type": "boolean",
      "description": "Désactiver la page vue automatique",
      "default": false
    },
    "spa": {
      "type": "string",
      "description": "Suivi de la navigation des applications monopage",
      "enum": [
        "auto",
        "history",
        "hash",
        "off"
      ],
      "default": "auto"
    },
    "domains": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Ne suivre que ces noms d’hôte",
      "default": []
    },
    "exclude": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Motifs glob de chemins à ne pas suivre, par ex. /admin/*",
      "default": []
    },
    "query_params": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Paramètres de requête supplémentaires à conserver, par ex. page",
      "default": []
    },
    "mask": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Masques de chemin côté client, par ex. /u/*->/u/:id",
      "default": []
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}

Synchronisation entrepôt

POST /workspaces/:workspace_id/warehouses.json Ajouter une destination d’entrepôt warehouse_destinations_create

Permission : workspace.manage

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/warehouses.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nom d’affichage, par ex. Data lake"
    },
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Sites à envoyer (pa_…). Vide envoie tous les sites"
    },
    "bucket": {
      "type": "string",
      "description": "s3 : nom du bucket"
    },
    "region": {
      "type": "string",
      "description": "s3 : région, par ex. us-east-1 (auto pour R2)"
    },
    "prefix": {
      "type": "string",
      "description": "s3/azure : préfixe de chemin, par ex. privatus/events"
    },
    "endpoint": {
      "type": "string",
      "description": "s3 : point d’accès https pour un stockage compatible S3 (interopérabilité GCS, R2, MinIO)"
    },
    "access_key_id": {
      "type": "string",
      "description": "s3 : identifiant de clé d’accès"
    },
    "secret_access_key": {
      "type": "string",
      "description": "s3 : clé d’accès secrète (écriture seule)"
    },
    "service_account_json": {
      "type": "string",
      "description": "bigquery : clé JSON de compte de service avec BigQuery Data Editor (écriture seule)"
    },
    "project_id": {
      "type": "string",
      "description": "bigquery : identifiant du projet (par défaut : celui de la clé)"
    },
    "dataset": {
      "type": "string",
      "description": "bigquery : identifiant du jeu de données"
    },
    "table": {
      "type": "string",
      "description": "bigquery/snowflake : nom de la table (colonnes : schéma v1)"
    },
    "account": {
      "type": "string",
      "description": "snowflake : identifiant du compte, par ex. xy12345.us-east-1 ou myorg-myaccount"
    },
    "user": {
      "type": "string",
      "description": "snowflake : utilisateur avec authentification par paire de clés"
    },
    "private_key": {
      "type": "string",
      "description": "snowflake : clé privée RSA PEM (écriture seule)"
    },
    "database": {
      "type": "string",
      "description": "snowflake : base de données"
    },
    "schema": {
      "type": "string",
      "description": "snowflake : schéma"
    },
    "warehouse": {
      "type": "string",
      "description": "snowflake : entrepôt virtuel"
    },
    "role": {
      "type": "string",
      "description": "snowflake : rôle (facultatif)"
    },
    "sas_url": {
      "type": "string",
      "description": "azure : URL SAS du conteneur avec permission de création/écriture (écriture seule)"
    },
    "kind": {
      "type": "string",
      "description": "s3 (aussi GCS/R2/MinIO), bigquery, snowflake ou azure",
      "enum": [
        "s3",
        "bigquery",
        "snowflake",
        "azure"
      ]
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "kind",
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de destination, par ex. whd_7Q2K9XH3AB"
    },
    "kind": {
      "type": "string",
      "description": "s3, bigquery, snowflake ou azure"
    },
    "name": {
      "type": "string"
    },
    "target": {
      "type": "string",
      "description": "Destination des données : s3://bucket/prefix, project.dataset.table, account/database.schema.table ou le conteneur Azure"
    },
    "configured": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Noms des paramètres renseignés (les valeurs ne sont jamais renvoyées)"
    },
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Sites envoyés (pa_…). Vide signifie tous les sites"
    },
    "schedule": {
      "type": "string",
      "description": "daily : 02:00 UTC, envoie le jour UTC précédent"
    },
    "schema_version": {
      "type": "string",
      "description": "Schéma de ligne envoyé"
    },
    "last_run_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "next_run_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_error": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /warehouses/:id.json Supprimer une destination d’entrepôt warehouse_destinations_delete

Permission : workspace.manage

Exemple
curl -X DELETE https://privatusanalytics.com/warehouses/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de destination, par ex. whd_7Q2K9XH3AB"
    },
    "kind": {
      "type": "string",
      "description": "s3, bigquery, snowflake ou azure"
    },
    "name": {
      "type": "string"
    },
    "target": {
      "type": "string",
      "description": "Destination des données : s3://bucket/prefix, project.dataset.table, account/database.schema.table ou le conteneur Azure"
    },
    "configured": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Noms des paramètres renseignés (les valeurs ne sont jamais renvoyées)"
    },
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Sites envoyés (pa_…). Vide signifie tous les sites"
    },
    "schedule": {
      "type": "string",
      "description": "daily : 02:00 UTC, envoie le jour UTC précédent"
    },
    "schema_version": {
      "type": "string",
      "description": "Schéma de ligne envoyé"
    },
    "last_run_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "next_run_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_error": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /workspaces/:workspace_id/warehouses.json Lister les destinations d’entrepôt warehouse_destinations_list

Permission : workspace.manage

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/warehouses.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "kind": {
      "type": "string",
      "description": "Uniquement les destinations de ce type",
      "enum": [
        "s3",
        "bigquery",
        "snowflake",
        "azure"
      ]
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant de destination, par ex. whd_7Q2K9XH3AB"
      },
      "kind": {
        "type": "string",
        "description": "s3, bigquery, snowflake ou azure"
      },
      "name": {
        "type": "string"
      },
      "target": {
        "type": "string",
        "description": "Destination des données : s3://bucket/prefix, project.dataset.table, account/database.schema.table ou le conteneur Azure"
      },
      "configured": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "description": "Noms des paramètres renseignés (les valeurs ne sont jamais renvoyées)"
      },
      "site_ids": {
        "type": "array",
        "items": {
          "type": "string"
        },
        "description": "Sites envoyés (pa_…). Vide signifie tous les sites"
      },
      "schedule": {
        "type": "string",
        "description": "daily : 02:00 UTC, envoie le jour UTC précédent"
      },
      "schema_version": {
        "type": "string",
        "description": "Schéma de ligne envoyé"
      },
      "last_run_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "next_run_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "last_error": {
        "anyOf": [
          {
            "type": "string"
          },
          {
            "type": "null"
          }
        ]
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
GET /warehouses/:id.json Obtenir une destination d’entrepôt (sans secrets) warehouse_destinations_get

Permission : workspace.manage

Exemple
curl https://privatusanalytics.com/warehouses/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de destination, par ex. whd_7Q2K9XH3AB"
    },
    "kind": {
      "type": "string",
      "description": "s3, bigquery, snowflake ou azure"
    },
    "name": {
      "type": "string"
    },
    "target": {
      "type": "string",
      "description": "Destination des données : s3://bucket/prefix, project.dataset.table, account/database.schema.table ou le conteneur Azure"
    },
    "configured": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Noms des paramètres renseignés (les valeurs ne sont jamais renvoyées)"
    },
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Sites envoyés (pa_…). Vide signifie tous les sites"
    },
    "schedule": {
      "type": "string",
      "description": "daily : 02:00 UTC, envoie le jour UTC précédent"
    },
    "schema_version": {
      "type": "string",
      "description": "Schéma de ligne envoyé"
    },
    "last_run_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "next_run_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_error": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
POST /warehouses/:id/sync.json Mettre en file d’attente la synchronisation d’une journée maintenant warehouse_destinations_sync

Permission : workspace.manage

Exemple
curl -X POST https://privatusanalytics.com/warehouses/:id/sync.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "date": {
      "type": "string",
      "format": "date",
      "description": "Jour UTC à envoyer, par ex. 2026-09-28 (par défaut : hier)"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de destination, par ex. whd_7Q2K9XH3AB"
    },
    "kind": {
      "type": "string",
      "description": "s3, bigquery, snowflake ou azure"
    },
    "name": {
      "type": "string"
    },
    "target": {
      "type": "string",
      "description": "Destination des données : s3://bucket/prefix, project.dataset.table, account/database.schema.table ou le conteneur Azure"
    },
    "configured": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Noms des paramètres renseignés (les valeurs ne sont jamais renvoyées)"
    },
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Sites envoyés (pa_…). Vide signifie tous les sites"
    },
    "schedule": {
      "type": "string",
      "description": "daily : 02:00 UTC, envoie le jour UTC précédent"
    },
    "schema_version": {
      "type": "string",
      "description": "Schéma de ligne envoyé"
    },
    "last_run_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "next_run_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_error": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
PATCH /warehouses/:id.json Mettre à jour une destination d’entrepôt (les secrets vides sont conservés) warehouse_destinations_update

Permission : workspace.manage

Exemple
curl -X PATCH https://privatusanalytics.com/warehouses/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nom d’affichage, par ex. Data lake"
    },
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Sites à envoyer (pa_…). Vide envoie tous les sites"
    },
    "bucket": {
      "type": "string",
      "description": "s3 : nom du bucket"
    },
    "region": {
      "type": "string",
      "description": "s3 : région, par ex. us-east-1 (auto pour R2)"
    },
    "prefix": {
      "type": "string",
      "description": "s3/azure : préfixe de chemin, par ex. privatus/events"
    },
    "endpoint": {
      "type": "string",
      "description": "s3 : point d’accès https pour un stockage compatible S3 (interopérabilité GCS, R2, MinIO)"
    },
    "access_key_id": {
      "type": "string",
      "description": "s3 : identifiant de clé d’accès"
    },
    "secret_access_key": {
      "type": "string",
      "description": "s3 : clé d’accès secrète (écriture seule)"
    },
    "service_account_json": {
      "type": "string",
      "description": "bigquery : clé JSON de compte de service avec BigQuery Data Editor (écriture seule)"
    },
    "project_id": {
      "type": "string",
      "description": "bigquery : identifiant du projet (par défaut : celui de la clé)"
    },
    "dataset": {
      "type": "string",
      "description": "bigquery : identifiant du jeu de données"
    },
    "table": {
      "type": "string",
      "description": "bigquery/snowflake : nom de la table (colonnes : schéma v1)"
    },
    "account": {
      "type": "string",
      "description": "snowflake : identifiant du compte, par ex. xy12345.us-east-1 ou myorg-myaccount"
    },
    "user": {
      "type": "string",
      "description": "snowflake : utilisateur avec authentification par paire de clés"
    },
    "private_key": {
      "type": "string",
      "description": "snowflake : clé privée RSA PEM (écriture seule)"
    },
    "database": {
      "type": "string",
      "description": "snowflake : base de données"
    },
    "schema": {
      "type": "string",
      "description": "snowflake : schéma"
    },
    "warehouse": {
      "type": "string",
      "description": "snowflake : entrepôt virtuel"
    },
    "role": {
      "type": "string",
      "description": "snowflake : rôle (facultatif)"
    },
    "sas_url": {
      "type": "string",
      "description": "azure : URL SAS du conteneur avec permission de création/écriture (écriture seule)"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de destination, par ex. whd_7Q2K9XH3AB"
    },
    "kind": {
      "type": "string",
      "description": "s3, bigquery, snowflake ou azure"
    },
    "name": {
      "type": "string"
    },
    "target": {
      "type": "string",
      "description": "Destination des données : s3://bucket/prefix, project.dataset.table, account/database.schema.table ou le conteneur Azure"
    },
    "configured": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Noms des paramètres renseignés (les valeurs ne sont jamais renvoyées)"
    },
    "site_ids": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Sites envoyés (pa_…). Vide signifie tous les sites"
    },
    "schedule": {
      "type": "string",
      "description": "daily : 02:00 UTC, envoie le jour UTC précédent"
    },
    "schema_version": {
      "type": "string",
      "description": "Schéma de ligne envoyé"
    },
    "last_run_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "next_run_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_error": {
      "anyOf": [
        {
          "type": "string"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

Tableaux de bord

GET /workspaces/:workspace_id/dashboards/:id/cards/:index.json Données d’une carte d’un tableau de bord personnalisé dashboards_card

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/dashboards/:id/cards/:index.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    },
    "index": {
      "type": "string",
      "description": "Index de la ressource"
    }
  },
  "required": [
    "workspace_id",
    "id",
    "index"
  ]
}
Données de réponse
{
  "type": "object"
}
POST /workspaces/:workspace_id/dashboards.json Créer un tableau de bord personnalisé dashboards_create

Permission : content.write

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/dashboards.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nom du tableau de bord",
      "examples": [
        "Client: Acme"
      ]
    },
    "cards": {
      "type": "array",
      "items": {},
      "description": "Cartes dans l’ordre (40 maximum) : [{\"type\": \"metric|chart|breakdown|goal|live|funnel|uptime|vitals\", \"site_id\": \"pa_…\", \"title\": \"optional\", \"params\": {\"period\": \"30d\", \"metric\": \"visitors\", \"dimension\": \"page\", \"funnel_id\": \"fun_…\"}}]. Les paramètres inutilisés par un type sont ignorés",
      "default": []
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "name",
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de tableau de bord, par ex. dash_7Q2K9XH3AB"
    },
    "name": {
      "type": "string"
    },
    "cards": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Cartes dans l’ordre : [{type, site_id, title, params}]"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /workspaces/:workspace_id/dashboards/:id.json Supprimer un tableau de bord personnalisé dashboards_delete

Permission : content.write

Exemple
curl -X DELETE https://privatusanalytics.com/workspaces/:workspace_id/dashboards/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "workspace_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de tableau de bord, par ex. dash_7Q2K9XH3AB"
    },
    "name": {
      "type": "string"
    },
    "cards": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Cartes dans l’ordre : [{type, site_id, title, params}]"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /workspaces/:workspace_id/dashboards.json Lister les tableaux de bord personnalisés dashboards_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/dashboards.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant de tableau de bord, par ex. dash_7Q2K9XH3AB"
      },
      "name": {
        "type": "string"
      },
      "cards": {
        "type": "array",
        "items": {
          "type": "object"
        },
        "description": "Cartes dans l’ordre : [{type, site_id, title, params}]"
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      },
      "updated_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
GET /workspaces/:workspace_id/dashboards/:id.json Obtenir un tableau de bord personnalisé et ses cartes dashboards_get

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/dashboards/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "workspace_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de tableau de bord, par ex. dash_7Q2K9XH3AB"
    },
    "name": {
      "type": "string"
    },
    "cards": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Cartes dans l’ordre : [{type, site_id, title, params}]"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
PATCH /workspaces/:workspace_id/dashboards/:id.json Renommer un tableau de bord personnalisé ou remplacer ses cartes dashboards_update

Permission : content.write

Exemple
curl -X PATCH https://privatusanalytics.com/workspaces/:workspace_id/dashboards/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nouveau nom (inchangé si vide)"
    },
    "cards": {
      "type": "array",
      "items": {},
      "description": "Remplace toutes les cartes. Cartes dans l’ordre (40 maximum) : [{\"type\": \"metric|chart|breakdown|goal|live|funnel|uptime|vitals\", \"site_id\": \"pa_…\", \"title\": \"optional\", \"params\": {\"period\": \"30d\", \"metric\": \"visitors\", \"dimension\": \"page\", \"funnel_id\": \"fun_…\"}}]. Les paramètres inutilisés par un type sont ignorés"
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "workspace_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de tableau de bord, par ex. dash_7Q2K9XH3AB"
    },
    "name": {
      "type": "string"
    },
    "cards": {
      "type": "array",
      "items": {
        "type": "object"
      },
      "description": "Cartes dans l’ordre : [{type, site_id, title, params}]"
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

Webhooks

GET /workspaces/:workspace_id/webhooks/:webhook_id/deliveries.json Lister les envois d’un webhook webhook_deliveries_list

Permission : workspace.manage

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/webhooks/:webhook_id/deliveries.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "status": {
      "type": "string",
      "description": "Uniquement les envois réussis ou échoués",
      "enum": [
        "succeeded",
        "failed"
      ]
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "webhook_id": {
      "type": "string",
      "description": "Webhook de la ressource"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "workspace_id",
    "webhook_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant d’envoi, par ex. whd_123"
      },
      "event": {
        "type": "string"
      },
      "status": {
        "type": "string",
        "description": "pending, succeeded ou failed"
      },
      "status_code": {
        "anyOf": [
          {
            "type": "integer",
            "description": "Statut HTTP de la dernière tentative"
          },
          {
            "type": "null"
          }
        ]
      },
      "error": {
        "anyOf": [
          {
            "type": "string",
            "description": "Erreur de connexion de la dernière tentative"
          },
          {
            "type": "null"
          }
        ]
      },
      "attempt": {
        "type": "integer"
      },
      "duration_ms": {
        "anyOf": [
          {
            "type": "integer"
          },
          {
            "type": "null"
          }
        ]
      },
      "payload": {
        "type": "object"
      },
      "response_body": {
        "anyOf": [
          {
            "type": "string",
            "description": "2 000 premiers caractères"
          },
          {
            "type": "null"
          }
        ]
      },
      "delivered_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
POST /workspaces/:workspace_id/webhooks/:webhook_id/deliveries/:id/redeliver.json Renvoyer un envoi webhook_deliveries_redeliver

Permission : workspace.manage

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/webhooks/:webhook_id/deliveries/:id/redeliver.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "webhook_id": {
      "type": "string",
      "description": "Webhook de la ressource"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "workspace_id",
    "webhook_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’envoi, par ex. whd_123"
    },
    "event": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "description": "pending, succeeded ou failed"
    },
    "status_code": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Statut HTTP de la dernière tentative"
        },
        {
          "type": "null"
        }
      ]
    },
    "error": {
      "anyOf": [
        {
          "type": "string",
          "description": "Erreur de connexion de la dernière tentative"
        },
        {
          "type": "null"
        }
      ]
    },
    "attempt": {
      "type": "integer"
    },
    "duration_ms": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "payload": {
      "type": "object"
    },
    "response_body": {
      "anyOf": [
        {
          "type": "string",
          "description": "2 000 premiers caractères"
        },
        {
          "type": "null"
        }
      ]
    },
    "delivered_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
POST /workspaces/:workspace_id/webhooks.json Ajouter un point d’accès webhook webhooks_create

Permission : workspace.manage

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/webhooks.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "Point d’accès HTTPS qui reçoit le JSON envoyé en POST",
      "examples": [
        "https://example.com/hooks/privatus"
      ]
    },
    "events": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "alert.triggered",
          "alert.resolved",
          "goal.completed_threshold",
          "uptime.down",
          "uptime.up",
          "export.ready",
          "import.completed",
          "import.failed",
          "site.created",
          "site.deleted",
          "member.added",
          "usage.threshold"
        ]
      },
      "description": "Événements à envoyer"
    },
    "enabled": {
      "type": "boolean",
      "description": "Envoyer les livraisons",
      "default": true
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    }
  },
  "required": [
    "url",
    "events",
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de webhook, par ex. wh_7Q2K9XH3AB"
    },
    "url": {
      "type": "string"
    },
    "events": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "enabled": {
      "type": "boolean"
    },
    "status": {
      "type": "string",
      "description": "active, failing ou disabled"
    },
    "secret": {
      "type": "string",
      "description": "Secret de signature pour Privatus-Signature"
    },
    "consecutive_failures": {
      "type": "integer"
    },
    "last_success_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_failure_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
DELETE /workspaces/:workspace_id/webhooks/:id.json Supprimer un webhook webhooks_delete

Permission : workspace.manage

Exemple
curl -X DELETE https://privatusanalytics.com/workspaces/:workspace_id/webhooks/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "workspace_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de webhook, par ex. wh_7Q2K9XH3AB"
    },
    "url": {
      "type": "string"
    },
    "events": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "enabled": {
      "type": "boolean"
    },
    "status": {
      "type": "string",
      "description": "active, failing ou disabled"
    },
    "secret": {
      "type": "string",
      "description": "Secret de signature pour Privatus-Signature"
    },
    "consecutive_failures": {
      "type": "integer"
    },
    "last_success_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_failure_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /workspaces/:workspace_id/webhooks.json Lister les webhooks webhooks_list

Permission : workspace.manage

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/webhooks.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "page": {
      "type": "integer",
      "description": "Page (à partir de 1)"
    },
    "per_page": {
      "type": "integer",
      "description": "Résultats par page (100 maximum)"
    }
  },
  "required": [
    "workspace_id"
  ]
}
Données de réponse
{
  "type": "array",
  "items": {
    "type": "object",
    "properties": {
      "id": {
        "type": "string",
        "description": "Identifiant de webhook, par ex. wh_7Q2K9XH3AB"
      },
      "url": {
        "type": "string"
      },
      "events": {
        "type": "array",
        "items": {
          "type": "string"
        }
      },
      "enabled": {
        "type": "boolean"
      },
      "status": {
        "type": "string",
        "description": "active, failing ou disabled"
      },
      "secret": {
        "type": "string",
        "description": "Secret de signature pour Privatus-Signature"
      },
      "consecutive_failures": {
        "type": "integer"
      },
      "last_success_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "last_failure_at": {
        "anyOf": [
          {
            "type": "string",
            "format": "date-time"
          },
          {
            "type": "null"
          }
        ]
      },
      "created_at": {
        "type": "string",
        "format": "date-time"
      }
    }
  }
}
GET /workspaces/:workspace_id/webhooks/:id.json Obtenir un webhook webhooks_get

Permission : workspace.manage

Exemple
curl https://privatusanalytics.com/workspaces/:workspace_id/webhooks/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "workspace_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de webhook, par ex. wh_7Q2K9XH3AB"
    },
    "url": {
      "type": "string"
    },
    "events": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "enabled": {
      "type": "boolean"
    },
    "status": {
      "type": "string",
      "description": "active, failing ou disabled"
    },
    "secret": {
      "type": "string",
      "description": "Secret de signature pour Privatus-Signature"
    },
    "consecutive_failures": {
      "type": "integer"
    },
    "last_success_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_failure_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
POST /workspaces/:workspace_id/webhooks/:id/test.json Envoyer un envoi de test webhooks_test

Permission : workspace.manage

Exemple
curl -X POST https://privatusanalytics.com/workspaces/:workspace_id/webhooks/:id/test.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "workspace_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant d’envoi, par ex. whd_123"
    },
    "event": {
      "type": "string"
    },
    "status": {
      "type": "string",
      "description": "pending, succeeded ou failed"
    },
    "status_code": {
      "anyOf": [
        {
          "type": "integer",
          "description": "Statut HTTP de la dernière tentative"
        },
        {
          "type": "null"
        }
      ]
    },
    "error": {
      "anyOf": [
        {
          "type": "string",
          "description": "Erreur de connexion de la dernière tentative"
        },
        {
          "type": "null"
        }
      ]
    },
    "attempt": {
      "type": "integer"
    },
    "duration_ms": {
      "anyOf": [
        {
          "type": "integer"
        },
        {
          "type": "null"
        }
      ]
    },
    "payload": {
      "type": "object"
    },
    "response_body": {
      "anyOf": [
        {
          "type": "string",
          "description": "2 000 premiers caractères"
        },
        {
          "type": "null"
        }
      ]
    },
    "delivered_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
PATCH /workspaces/:workspace_id/webhooks/:id.json Mettre à jour un webhook (événements, URL, activé, renouvellement du secret) webhooks_update

Permission : workspace.manage

Exemple
curl -X PATCH https://privatusanalytics.com/workspaces/:workspace_id/webhooks/:id.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "url": {
      "type": "string",
      "description": "Point d’accès HTTPS"
    },
    "events": {
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "alert.triggered",
          "alert.resolved",
          "goal.completed_threshold",
          "uptime.down",
          "uptime.up",
          "export.ready",
          "import.completed",
          "import.failed",
          "site.created",
          "site.deleted",
          "member.added",
          "usage.threshold"
        ]
      },
      "description": "Événements à envoyer"
    },
    "enabled": {
      "type": "boolean",
      "description": "Envoyer les livraisons"
    },
    "rotate_secret": {
      "type": "boolean",
      "description": "Remplacer le secret de signature",
      "default": false
    },
    "workspace_id": {
      "type": "string",
      "description": "Identifiant de l’espace de travail, par ex. ws_7Q2K9XH3AB"
    },
    "id": {
      "type": "string",
      "description": "Id de la ressource"
    }
  },
  "required": [
    "workspace_id",
    "id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "id": {
      "type": "string",
      "description": "Identifiant de webhook, par ex. wh_7Q2K9XH3AB"
    },
    "url": {
      "type": "string"
    },
    "events": {
      "type": "array",
      "items": {
        "type": "string"
      }
    },
    "enabled": {
      "type": "boolean"
    },
    "status": {
      "type": "string",
      "description": "active, failing ou disabled"
    },
    "secret": {
      "type": "string",
      "description": "Secret de signature pour Privatus-Signature"
    },
    "consecutive_failures": {
      "type": "integer"
    },
    "last_success_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "last_failure_at": {
      "anyOf": [
        {
          "type": "string",
          "format": "date-time"
        },
        {
          "type": "null"
        }
      ]
    },
    "created_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}

Événements

GET /sites/:site_id/events/properties.json Lister les clés de propriétés d’événement vues au cours des 30 derniers jours event_properties_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/events/properties.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "event": {
      "type": "string",
      "description": "Uniquement les clés vues sur ce nom d’événement brut"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
PATCH /sites/:site_id/events/properties.json Renommer ou masquer une clé de propriété d’événement event_properties_update

Permission : sites.manage

Exemple
curl -X PATCH https://privatusanalytics.com/sites/:site_id/events/properties.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "key": {
      "type": "string",
      "description": "Clé de propriété telle que stockée, par ex. plan"
    },
    "display_name": {
      "type": "string",
      "description": "Libellé à afficher à la place (vide pour le retirer)"
    },
    "hidden": {
      "type": "boolean",
      "description": "Masquer cette clé dans les rapports"
    },
    "export_safe": {
      "type": "boolean",
      "description": "La clé ne contient aucune donnée personnelle, elle est donc incluse dans les exports bruts et les synchronisations d’entrepôt"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "key",
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
DELETE /sites/:site_id/events.json Supprimer un événement et son historique (s’exécute en arrière-plan, confirmez en saisissant le nom) events_delete

Permission : sites.manage

Exemple
curl -X DELETE https://privatusanalytics.com/sites/:site_id/events.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nom d’événement brut à supprimer"
    },
    "confirm": {
      "type": "string",
      "description": "Saisissez à nouveau le nom de l’événement pour confirmer"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "name",
    "confirm",
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
GET /sites/:site_id/events.json Lister les événements avec réalisations, visites, taux de conversion et première/dernière apparition events_list

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/events.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "period": {
      "type": "string",
      "description": "Préréglage de plage de dates. Utilisez custom avec from/to",
      "enum": [
        "today",
        "yesterday",
        "24h",
        "7d",
        "14d",
        "28d",
        "30d",
        "90d",
        "mtd",
        "last_month",
        "qtd",
        "last_quarter",
        "ytd",
        "12mo",
        "last_year",
        "all",
        "custom"
      ],
      "default": "30d"
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "Début de la plage personnalisée (fuseau horaire du site)"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la plage personnalisée, incluse"
    },
    "compare": {
      "type": "string",
      "description": "Période de comparaison",
      "enum": [
        "none",
        "previous_period",
        "previous_year",
        "custom"
      ],
      "default": "none"
    },
    "compare_from": {
      "type": "string",
      "format": "date",
      "description": "Début de la comparaison personnalisée"
    },
    "compare_to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la comparaison personnalisée"
    },
    "match_weekday": {
      "type": "boolean",
      "description": "Aligner les jours de la semaine de la comparaison",
      "default": false
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres : [[\"dimension\",\"operator\",\"value\"], …]. Opérateurs : is, is_not, any_of, none_of, contains, not_contains, starts_with, regex, not_regex, gt, lt, between. Encadrez les conditions dans {\"any\": [...]} pour un OU.",
      "default": []
    },
    "segment_id": {
      "type": "string",
      "description": "Appliquer un segment enregistré (seg_…)"
    },
    "include_imported": {
      "type": "boolean",
      "description": "Ajouter les données historiques importées (dates antérieures au premier événement natif, ignorées lorsque des filtres ou un segment sont appliqués)",
      "default": false
    },
    "search": {
      "type": "string",
      "description": "Uniquement les événements dont le nom contient ceci"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
POST /sites/:site_id/events/merge.json Fusionner plusieurs événements sous un seul nom d’affichage events_merge

Permission : sites.manage

Exemple
curl -X POST https://privatusanalytics.com/sites/:site_id/events/merge.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "names": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Noms d’événements bruts à fusionner"
    },
    "into": {
      "type": "string",
      "description": "Nom d’affichage de l’événement fusionné",
      "examples": [
        "Signup"
      ]
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "names",
    "into",
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nom d’événement brut tel qu’envoyé par le traqueur"
    },
    "display_name": {
      "anyOf": [
        {
          "type": "string",
          "description": "Nom affiché dans les rapports"
        },
        {
          "type": "null"
        }
      ]
    },
    "hidden": {
      "type": "boolean",
      "description": "Masqué dans les rapports"
    },
    "currency": {
      "anyOf": [
        {
          "type": "string",
          "description": "Devise des revenus"
        },
        {
          "type": "null"
        }
      ]
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}
GET /sites/:site_id/events/detail.json Un événement : graphique, pivot des propriétés, agrégats des propriétés numériques, pages et sources events_get

Permission : analytics.read

Exemple
curl https://privatusanalytics.com/sites/:site_id/events/detail.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN"
Entrées
{
  "type": "object",
  "properties": {
    "period": {
      "type": "string",
      "description": "Préréglage de plage de dates. Utilisez custom avec from/to",
      "enum": [
        "today",
        "yesterday",
        "24h",
        "7d",
        "14d",
        "28d",
        "30d",
        "90d",
        "mtd",
        "last_month",
        "qtd",
        "last_quarter",
        "ytd",
        "12mo",
        "last_year",
        "all",
        "custom"
      ],
      "default": "30d"
    },
    "from": {
      "type": "string",
      "format": "date",
      "description": "Début de la plage personnalisée (fuseau horaire du site)"
    },
    "to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la plage personnalisée, incluse"
    },
    "compare": {
      "type": "string",
      "description": "Période de comparaison",
      "enum": [
        "none",
        "previous_period",
        "previous_year",
        "custom"
      ],
      "default": "none"
    },
    "compare_from": {
      "type": "string",
      "format": "date",
      "description": "Début de la comparaison personnalisée"
    },
    "compare_to": {
      "type": "string",
      "format": "date",
      "description": "Fin de la comparaison personnalisée"
    },
    "match_weekday": {
      "type": "boolean",
      "description": "Aligner les jours de la semaine de la comparaison",
      "default": false
    },
    "filters": {
      "type": "array",
      "items": {},
      "description": "Filtres : [[\"dimension\",\"operator\",\"value\"], …]. Opérateurs : is, is_not, any_of, none_of, contains, not_contains, starts_with, regex, not_regex, gt, lt, between. Encadrez les conditions dans {\"any\": [...]} pour un OU.",
      "default": []
    },
    "segment_id": {
      "type": "string",
      "description": "Appliquer un segment enregistré (seg_…)"
    },
    "include_imported": {
      "type": "boolean",
      "description": "Ajouter les données historiques importées (dates antérieures au premier événement natif, ignorées lorsque des filtres ou un segment sont appliqués)",
      "default": false
    },
    "name": {
      "type": "string",
      "description": "Nom de l’événement tel qu’affiché (après renommages)",
      "examples": [
        "Signup"
      ]
    },
    "properties": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Jusqu’à 3 clés de propriété pour le pivot",
      "default": []
    },
    "interval": {
      "type": "string",
      "description": "Taille de l’intervalle du graphique",
      "enum": [
        "auto",
        "minute",
        "hour",
        "day",
        "week",
        "month",
        "quarter",
        "year"
      ],
      "default": "auto"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "name",
    "site_id"
  ]
}
Données de réponse
{
  "type": "object"
}
PATCH /sites/:site_id/events/settings.json Renommer, masquer ou réafficher un événement, ou définir sa devise events_update

Permission : sites.manage

Exemple
curl -X PATCH https://privatusanalytics.com/sites/:site_id/events/settings.json \
  -H "Authorization: Bearer $PRIVATUS_TOKEN" \
  -H "Content-Type: application/json" -d '{…}'
Entrées
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nom d’événement brut tel qu’envoyé par le traqueur",
      "examples": [
        "signup_click"
      ]
    },
    "display_name": {
      "type": "string",
      "description": "Nom à afficher à la place (vide annule le renommage)"
    },
    "hidden": {
      "type": "boolean",
      "description": "Masquer dans les rapports (les données sont conservées)"
    },
    "currency": {
      "type": "string",
      "description": "Devise des revenus de cet événement (ISO 4217)"
    },
    "site_id": {
      "type": "string",
      "description": "Identifiant du site, par ex. pa_7Q2K9XH3AB"
    }
  },
  "required": [
    "name",
    "site_id"
  ]
}
Données de réponse
{
  "type": "object",
  "properties": {
    "name": {
      "type": "string",
      "description": "Nom d’événement brut tel qu’envoyé par le traqueur"
    },
    "display_name": {
      "anyOf": [
        {
          "type": "string",
          "description": "Nom affiché dans les rapports"
        },
        {
          "type": "null"
        }
      ]
    },
    "hidden": {
      "type": "boolean",
      "description": "Masqué dans les rapports"
    },
    "currency": {
      "anyOf": [
        {
          "type": "string",
          "description": "Devise des revenus"
        },
        {
          "type": "null"
        }
      ]
    },
    "updated_at": {
      "type": "string",
      "format": "date-time"
    }
  }
}