Matomo Scheduled Reports API

The ScheduledReports API lets you manage Scheduled Email reports, as well as generate, download or email any existing report.

Operations 6

GET /index.php?module=API&method=ScheduledReports.addReport Scheduled reports add report #
GET /index.php?module=API&method=ScheduledReports.updateReport Scheduled reports update report #
GET /index.php?module=API&method=ScheduledReports.deleteReport Scheduled reports delete report #
GET /index.php?module=API&method=ScheduledReports.getReports Scheduled reports get reports #
GET /index.php?module=API&method=ScheduledReports.generateReport Scheduled reports generate report #
GET /index.php?module=API&method=ScheduledReports.sendReport Scheduled reports send report #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/matomo-scheduled-reports-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

matomo-scheduled-reports-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Matomo Reporting API for plugin Scheduled Reports API
  version: 1.0.0
  description: The ScheduledReports API lets you manage Scheduled Email reports, as well as generate, download or email any existing report.
servers:
- url: https://demo-proxy.innocraft.cloud/
  description: Current Matomo instance
security:
- MatomoToken: []
tags:
- name: Scheduled Reports
  description: The ScheduledReports API lets you manage Scheduled Email reports, as well as generate, download or email any existing report.
paths:
  /index.php?module=API&method=ScheduledReports.addReport:
    get:
      tags:
      - Scheduled Reports
      description: Creates and schedules a new report.
      operationId: ScheduledReports.addReport
      parameters:
      - $ref: '#/components/parameters/formatOptional'
      - name: idSite
        in: query
        description: The numeric ID of the website to report on.
        required: true
        schema:
          type: integer
          example: 1
      - name: description
        in: query
        description: The report title shown in the UI and used in generated filenames. Truncated to 250 characters.
        required: true
        schema:
          type: string
          example: Compare the pricing page signup experience for New Zealand traffic.
      - name: period
        in: query
        description: The delivery schedule for the report.
        required: true
        schema:
          type: string
          enum:
          - day
          - week
          - month
          - never
          example: never
      - name: hour
        in: query
        description: The hour of day (0–23) when the report should be sent.
        required: true
        schema:
          type: integer
          example: 9
      - name: reportType
        in: query
        description: The transport medium identifier, such as `'email'`.
        required: true
        schema:
          type: string
          example: table
      - name: reportFormat
        in: query
        description: The output format identifier, such as `'pdf'` or `'html'`.
        required: true
        schema:
          type: string
          example: pdf
      - name: reports
        in: query
        description: The report unique IDs to include, e.g. `['VisitsSummary_get', 'Actions_get']`.
        required: true
        schema:
          type: array
          items:
            type: string
          example:
          - VisitsSummary.get
          - Goals.get
      - name: parameters
        in: query
        description: Transport-specific parameters, e.g. `['emailMe' => true, 'additionalEmails' => ['user@example.com']]` for email reports.
        required: true
        schema:
          type: array
          items:
            type: string
      - name: idSegment
        in: query
        description: The saved segment ID to apply, or `false` for no segment filter.
        required: false
        schema:
          oneOf:
          - type: integer
          - type: string
      - name: evolutionPeriodFor
        in: query
        description: Whether evolution graphs compare previous periods (`'prev'`) or each day within the selected period (`'each'`).
        required: false
        schema:
          type: string
          default: prev
          enum:
          - prev
          - each
      - name: evolutionPeriodN
        in: query
        description: The number of previous periods to include when `$evolutionPeriodFor` is `'prev'`. Defaults to the configured graph evolution periods.
        required: false
        schema:
          oneOf:
          - type: integer
          - type: string
      - name: periodParam
        in: query
        description: The data period to generate on each scheduled send. Defaults to the delivery schedule period.
        required: false
        schema:
          type: string
      responses:
        '200':
          description: 'The newly created scheduled report ID.


            Example responses require Super User access. Use Try it out to see a live response.'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/ServerError'
        default:
          $ref: '#/components/responses/DefaultError'
      summary: Scheduled reports add report
      x-summary-source: derived
  /index.php?module=API&method=ScheduledReports.updateReport:
    get:
      tags:
      - Scheduled Reports
      description: Updates an existing report.
      operationId: ScheduledReports.updateReport
      parameters:
      - $ref: '#/components/parameters/formatOptional'
      - name: idReport
        in: query
        description: The scheduled report ID to update.
        required: true
        schema:
          type: integer
          example: 1
      - name: idSite
        in: query
        description: The numeric ID of the website the report belongs to.
        required: true
        schema:
          type: integer
          example: 1
      - name: description
        in: query
        description: The report title shown in the UI and used in generated filenames. Truncated to 250 characters.
        required: true
        schema:
          type: string
          example: Compare the pricing page signup experience for New Zealand traffic.
      - name: period
        in: query
        description: The delivery schedule for the report.
        required: true
        schema:
          type: string
          enum:
          - day
          - week
          - month
          - never
          example: never
      - name: hour
        in: query
        description: The hour of day (0–23) when the report should be sent.
        required: true
        schema:
          type: integer
          example: 9
      - name: reportType
        in: query
        description: The transport medium identifier, such as `'email'`.
        required: true
        schema:
          type: string
          example: table
      - name: reportFormat
        in: query
        description: The output format identifier, such as `'pdf'` or `'html'`.
        required: true
        schema:
          type: string
          example: pdf
      - name: reports
        in: query
        description: The report unique IDs to include, e.g. `['VisitsSummary_get', 'Actions_get']`.
        required: true
        schema:
          type: array
          items:
            type: string
          example:
          - VisitsSummary.get
          - Goals.get
      - name: parameters
        in: query
        description: Transport-specific parameters, e.g. `['emailMe' => true, 'additionalEmails' => ['user@example.com']]` for email reports.
        required: true
        schema:
          type: array
          items:
            type: string
      - name: idSegment
        in: query
        description: The saved segment ID to apply, or `false` for no segment filter.
        required: false
        schema:
          oneOf:
          - type: integer
          - type: string
      - name: evolutionPeriodFor
        in: query
        description: Whether evolution graphs compare previous periods (`'prev'`) or each day within the selected period (`'each'`).
        required: false
        schema:
          type: string
          default: prev
          enum:
          - prev
          - each
      - name: evolutionPeriodN
        in: query
        description: The number of previous periods to include when `$evolutionPeriodFor` is `'prev'`. Defaults to the configured graph evolution periods.
        required: false
        schema:
          oneOf:
          - type: integer
          - type: string
      - name: periodParam
        in: query
        description: The data period to generate on each scheduled send. Defaults to the delivery schedule period.
        required: false
        schema:
          type: string
      responses:
        '200':
          $ref: '#/components/responses/GenericSuccess'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/ServerError'
        default:
          $ref: '#/components/responses/DefaultError'
      summary: Scheduled reports update report
      x-summary-source: derived
  /index.php?module=API&method=ScheduledReports.deleteReport:
    get:
      tags:
      - Scheduled Reports
      description: Marks a scheduled report as deleted. The report row is retained in the database with `deleted = 1`.
      operationId: ScheduledReports.deleteReport
      parameters:
      - $ref: '#/components/parameters/formatOptional'
      - name: idReport
        in: query
        description: The scheduled report ID to delete.
        required: true
        schema:
          type: integer
          example: 1
      responses:
        '200':
          $ref: '#/components/responses/GenericSuccess'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/ServerError'
        default:
          $ref: '#/components/responses/DefaultError'
      summary: Scheduled reports delete report
      x-summary-source: derived
  /index.php?module=API&method=ScheduledReports.getReports:
    get:
      tags:
      - Scheduled Reports
      description: Returns scheduled reports that match the supplied filters. All filter parameters are optional; passing `false` disables that filter.
      operationId: ScheduledReports.getReports
      parameters:
      - $ref: '#/components/parameters/formatOptional'
      - name: idSite
        in: query
        description: Filters reports to a specific website when provided.
        required: false
        schema:
          oneOf:
          - type: integer
          - type: string
      - name: period
        in: query
        description: Filters reports by delivery schedule when provided.
        required: false
        schema:
          type: string
      - name: idReport
        in: query
        description: Returns a single scheduled report when provided. Throws if not found.
        required: false
        schema:
          oneOf:
          - type: integer
          - type: string
      - name: ifSuperUserReturnOnlySuperUserReports
        in: query
        description: When `true`, super users only receive their own reports instead of all reports.
        required: false
        schema:
          type: boolean
          default: false
      - name: idSegment
        in: query
        description: Filters reports to a specific saved segment when provided.
        required: false
        schema:
          oneOf:
          - type: integer
          - type: string
      responses:
        '200':
          description: 'The matching scheduled reports, ordered by description. Each entry has decoded `parameters` and `reports` fields.


            Example responses require Super User access. Use Try it out to see a live response.'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/ServerError'
        default:
          $ref: '#/components/responses/DefaultError'
      summary: Scheduled reports get reports
      x-summary-source: derived
  /index.php?module=API&method=ScheduledReports.generateReport:
    get:
      tags:
      - Scheduled Reports
      description: Generates a scheduled report in the requested output mode.
      operationId: ScheduledReports.generateReport
      parameters:
      - $ref: '#/components/parameters/formatOptional'
      - name: idReport
        in: query
        description: The scheduled report ID to generate.
        required: true
        schema:
          type: integer
          example: 1
      - name: date
        in: query
        description: The date or date range to process. `'YYYY-MM-DD'`, magic keywords (`today`, `yesterday`, `lastWeek`, `lastMonth`, `lastYear`), or date range (e.g. `'YYYY-MM-DD,YYYY-MM-DD'`, `lastX`, `previousX`).
        required: true
        schema:
          type: string
          example: yesterday
      - name: language
        in: query
        description: The ISO language code to render the report in (e.g. `'en'`, `'de'`), or `false` to use the default language.
        required: false
        schema:
          type: string
      - name: outputType
        in: query
        description: The output mode controlling how the generated report is delivered. Use `OUTPUT_DOWNLOAD` (browser download), `OUTPUT_SAVE_ON_DISK` (temp file for sending), `OUTPUT_INLINE` (browser inline display), or `OUTPUT_RETURN` (return contents as string). Defaults to `OUTPUT_DOWNLOAD`.
        required: false
        schema:
          oneOf:
          - type: integer
          - type: string
      - name: period
        in: query
        description: The data period to generate, or `false` to use the report's stored period.
        required: false
        schema:
          type: string
      - name: reportFormat
        in: query
        description: The output format identifier (e.g. `'pdf'`, `'html'`), or `false` to use the stored format.
        required: false
        schema:
          type: string
      - name: parameters
        in: query
        description: Transport-specific parameters to override for this generation, or `false` to use the stored parameters.
        required: false
        schema:
          oneOf:
          - type: array
            items:
              type: string
          - type: string
      responses:
        '200':
          description: 'Returns a 5-element array `[$outputFilename, $prettyDate, $reportSubject, $reportTitle, $additionalFiles]` when using `OUTPUT_SAVE_ON_DISK`, the rendered report string when using `OUTPUT_RETURN`, or void when streaming to the browser (`OUTPUT_DOWNLOAD` / `OUTPUT_INLINE`).


            Example responses require Super User access. Use Try it out to see a live response.'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/ServerError'
        default:
          $ref: '#/components/responses/DefaultError'
      summary: Scheduled reports generate report
      x-summary-source: derived
  /index.php?module=API&method=ScheduledReports.sendReport:
    get:
      tags:
      - Scheduled Reports
      description: Sends a scheduled report immediately. Generates the report, saves it to a temporary file, dispatches it via the configured transport medium, and cleans up.
      operationId: ScheduledReports.sendReport
      parameters:
      - $ref: '#/components/parameters/formatOptional'
      - name: idReport
        in: query
        description: The scheduled report ID to send.
        required: true
        schema:
          type: integer
          example: 1
      - name: period
        in: query
        description: The data period to send, or `false` to use the report's stored period.
        required: false
        schema:
          type: string
      - name: date
        in: query
        description: The date to generate the report for (e.g. `'2024-01-15'`), or `false` to use the previous scheduled period.
        required: false
        schema:
          type: string
      - name: force
        in: query
        description: Whether to send the report even if it has already been sent for the same period.
        required: false
        schema:
          type: boolean
          default: false
      responses:
        '200':
          $ref: '#/components/responses/GenericSuccess'
        '400':
          $ref: '#/components/responses/BadRequest'
        '401':
          $ref: '#/components/responses/Unauthorized'
        '403':
          $ref: '#/components/responses/Forbidden'
        '404':
          $ref: '#/components/responses/NotFound'
        '500':
          $ref: '#/components/responses/ServerError'
        default:
          $ref: '#/components/responses/DefaultError'
      summary: Scheduled reports send report
      x-summary-source: derived
components:
  schemas:
    GenericSuccess:
      description: Generic Matomo success payload.
      required:
      - result
      - message
      properties:
        result:
          type: string
          example: success
        message:
          type: string
          example: ok
        code:
          type: integer
          example: '200'
      type: object
      example:
        result: success
        message: ok
      additionalProperties: true
    GenericSuccessXml:
      description: Generic Matomo success payload in XML.
      required:
      - success
      properties:
        success:
          properties:
            message:
              type: string
              xml:
                attribute: true
              example: ok
          type: object
          xml:
            name: success
      type: object
      xml:
        name: result
      example:
        success:
          message: ok
      additionalProperties: true
    ErrorXml:
      description: Generic Matomo error payload in XML.
      properties:
        error:
          properties:
            message:
              type: string
              xml:
                attribute: true
              example: There was an error
          type: object
          xml:
            name: error
      type: object
      xml:
        name: result
    Error:
      description: Generic Matomo error payload.
      required:
      - result
      - message
      properties:
        result:
          type: string
          example: error
        message:
          type: string
          example: There was an error
        code:
          type: integer
      type: object
      additionalProperties: true
  responses:
    Forbidden:
      description: Authenticated but not allowed to access the resource.
      content:
        text/plain:
          schema:
            type: string
          example: 'Error: Not authorised.'
        text/html:
          schema:
            type: string
          example: Not authorised.
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
        application/xml:
          schema:
            $ref: '#/components/schemas/ErrorXml'
    DefaultError:
      description: Default error response (any non-2xx).
      content:
        text/plain:
          schema:
            type: string
          example: 'Error: There was an error.'
        text/html:
          schema:
            type: string
          example: There was an error.
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
        application/xml:
          schema:
            $ref: '#/components/schemas/ErrorXml'
    Unauthorized:
      description: Authentication failed or missing token.
      content:
        text/plain:
          schema:
            type: string
          example: 'Error: You must be logged in to access this functionality.'
        text/html:
          schema:
            type: string
          example: You must be logged in to access this functionality.
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
        application/xml:
          schema:
            $ref: '#/components/schemas/ErrorXml'
    ServerError:
      description: Unexpected server error.
      content:
        text/plain:
          schema:
            type: string
          example: 'Error: There was an error.'
        text/html:
          schema:
            type: string
          example: There was an error.
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
        application/xml:
          schema:
            $ref: '#/components/schemas/ErrorXml'
    NotFound:
      description: Resource not found.
      content:
        text/plain:
          schema:
            type: string
          example: 'Error: The method is not available.'
        text/html:
          schema:
            type: string
          example: The method is not available.
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
        application/xml:
          schema:
            $ref: '#/components/schemas/ErrorXml'
    GenericSuccess:
      description: Generic 200 response
      content:
        text/plain:
          schema:
            type: string
          example: Success:ok
        text/html:
          schema:
            type: string
          example: '<!-- Success: ok -->'
        application/json:
          schema:
            $ref: '#/components/schemas/GenericSuccess'
        application/xml:
          schema:
            $ref: '#/components/schemas/GenericSuccessXml'
    BadRequest:
      description: Bad request (validation or missing parameters).
      content:
        text/plain:
          schema:
            type: string
          example: 'Error: There was an error.'
        text/html:
          schema:
            type: string
          example: There was an error.
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
        application/xml:
          schema:
            $ref: '#/components/schemas/ErrorXml'
  parameters:
    formatOptional:
      name: format
      in: query
      description: Response format. Defaults to `xml`. Use `original` to get the original PHP data structure.
      required: false
      schema:
        type: string
        default: xml
        enum:
        - xml
        - json
        - csv
        - tsv
        - html
        - rss
        - original
  securitySchemes:
    MatomoToken:
      type: http
      description: Paste your token generated from Personal > Security. Swagger will send it as a Bearer token.
      scheme: bearer
externalDocs:
  description: Matomo Reporting API developer page
  url: https://developer.matomo.org/api-reference/reporting-api/