SSRS and Power BI Report Server Integration

Connect PBRS to SSRS and Power BI Report Server, configure report parameters and destinations, and create, update, and execute schedules through the REST API.

Use the PBRS REST API to create, retrieve, update, and execute schedules for SQL Server Reporting Services (SSRS) and Power BI Report Server.

The two integrations use different connection fields and parameter models. Choose the request schema for your report source.

Before you begin

Make sure you have:

  • A running PBRS API service and its configured base URL.
  • A valid PBRS API access token.
  • Permission to create, modify, and execute schedules.
  • Access from the PBRS execution server to the reporting server.
  • A configured reporting account or the connection details required by the selected operation.
  • The report path, required parameter values, and intended destinations.
  • A PBRS folder in which to store the schedule.

API authentication and report-server authentication are separate. A valid API token does not grant access to the report or its underlying data sources.

Send these headers with JSON requests:

Authorization: bearer YOUR_ACCESS_TOKEN
Content-Type: application/json
Accept: application/json

All endpoint paths below are relative to your configured PBRS API base URL.

Choose the integration

SettingSSRSPower BI Report Server
CreatePOST /api/SingleSchedule/CreateForSSRSPOST /api/SingleSchedule/CreatePbirs
RetrieveGET /api/SingleSchedule/GetForSSRS?Id=101GET /api/SingleSchedule/GetPBirs?Id=102
UpdatePOST /api/SingleSchedule/UpdateForSSRSPOST /api/SingleSchedule/UpdateForPbirs
Configured account fieldSSRSAccountName with UseSSRSAccount: trueSqlServerAccountId
Parameter valuesParameterValues dictionaryString-valued ParameterValue
Report rendering configurationFields exposed by the SSRS request and destination modelsRenderingSettings
Bulk creationPOST /api/SingleSchedule/CreateMultipleForSSRSNo dedicated bulk-create operation in this interface

Use the route spelling shown above.

Power BI Service paginated reports use a separate API workflow. Do not substitute their creation endpoint for an SSRS or Power BI Report Server endpoint.

Configure the reporting connection

SSRS configured accounts

In the PBRS application:

  1. Open Integrations and select SSRS Accounts.
  2. Add an account.
  3. Enter its name, reporting-services URL, username, and password.
  4. Select Connect to verify the connection.
  5. Select Save & Close.

See Add SSRS accounts in PBRS.

List configured accounts with:

GET /api/SSRSAccount/GetAll

Example response:

[
  {
    "AccountId": 1,
    "AccountName": "Reporting Server"
  }
]

Use the returned account name in an SSRS schedule:

{
  "UseSSRSAccount": true,
  "SSRSAccountName": "Reporting Server"
}

This is a connection fragment, not a complete schedule request.

The SSRS report-discovery operations use numeric AccountId instead.

SSRS direct connections

The SSRS schedule model also supports a direct connection.

Set UseSSRSAccount to false and provide a nonempty ServerUrl. Configure ServerUserId, ServerPassword, UseFormsAuth, and VirtualDirectory as required by that reporting server.

Use the reporting-services URL for the deployment. Do not substitute the PBRS API URL or assume that a browser-facing portal URL is the required service URL.

Power BI Report Server connections

The Power BI Report Server schedule request requires a nonzero numeric SqlServerAccountId.

Use the configured account identifier associated with the intended reporting-server connection. For an existing schedule, retrieve its definition with GetPBirs and inspect this field.

Despite its name, SqlServerAccountId is a PBRS configuration identifier. Do not substitute a database name, connection string, or Power BI cloud account identifier.

The request also uses:

  • ObjectType, set to PBIRSITEM in the example below.
  • ReportPath, identifying the report on the reporting server.
  • VirtualDirectory, matching the deployment.

Distinguish storage and report paths

FieldMeaning
FolderPathThe PBRS folder where the schedule is stored
ReportPathThe report's path on the reporting server
VirtualDirectoryThe reporting-server virtual directory used by the integration

For example:

{
  "FolderPath": "/API Reports",
  "ReportPath": "/Sales/Daily Sales",
  "VirtualDirectory": "reports"
}

Use actual values from your environment. The default virtual-directory value is reports, but your deployment may use another value.

Discover SSRS parameters and data sources

Retrieve parameter definitions

POST /api/SsrsReport/GetReportParameters
{
  "AccountId": 1,
  "ReportPath": "/Sales/Daily Sales"
}

The response contains parameter definitions using the SSRS parameter model.

Resolve dependent parameters

For cascading parameters, supply the current selections:

POST /api/SsrsReport/GetReportParametersWithValues
{
  "AccountId": 1,
  "ReportPath": "/Sales/Daily Sales",
  "CurrentValues": [
    {
      "Name": "Region",
      "Value": "West"
    }
  ]
}

Use the returned definitions to resolve dependent selections before creating or updating the schedule.

Retrieve data-source definitions

POST /api/SsrsReport/GetReportDatasources
{
  "AccountId": 1,
  "ReportPath": "/Sales/Daily Sales"
}

These operations contact the configured reporting service. Their results depend on report availability and the reporting account's permissions.

Use the correct parameter model

SSRS parameters

SSRS uses ParameterValues, a string-to-string dictionary.

Example parameter collection:

{
  "Parameters": [
    {
      "ParameterName": "Region",
      "ParameterValues": {
        "West": "West"
      },
      "IsMultiValue": false,
      "IsNull": false,
      "ParameterIndex": 0,
      "ParentId": 0,
      "Prompt": "Region"
    }
  ]
}

Use the report's actual parameter names and dictionary entries. Preserve applicable metadata from parameter discovery.

  • Do not replace ParameterValues with an array.
  • Use IsMultiValue for parameters that accept multiple selections.
  • Use IsNull only when the report permits a null value.
  • Do not assume an empty dictionary and a null parameter have the same meaning.

Power BI Report Server parameters

The Power BI Report Server request uses a different structure:

  • ParameterName
  • ParameterValue
  • ParameterType
  • IsNull
  • ParameterId, where applicable

ParameterValue remains a string, including for numeric, date, and boolean parameter types. Select ParameterType from the endpoint's schema and use IsNull for a null value.

Preserve existing ParameterId values when modifying parameters.

Do not send SSRS ParameterValues dictionaries to this model.

Create an SSRS schedule

POST /api/SingleSchedule/CreateForSSRS

This example creates a disabled daily schedule with an email destination. Replace the account, paths, date, and recipient before submitting it.

The example uses no explicit parameters or data-source overrides. Add them if the report requires them.

{
  "ScheduleName": "Daily SSRS Sales",
  "FolderPath": "/API Reports",
  "Description": "Daily sales report from SSRS",
  "Keywords": "ssrs,sales",
  "Schedule": {
    "Frequency": "Daily",
    "StartDate": "2026-10-01",
    "ExecutionTime": "09:00",
    "HasEndDate": false,
    "Repeat": false,
    "Enabled": false,
    "DailyRepeatInterval": 1
  },
  "EmailDestinations": [
    {
      "DestinationName": "Operations email",
      "DestinationType": "Email",
      "Enabled": true,
      "OutputFormat": "Acrobat Format (*.pdf)",
      "To": [
        "[email protected]"
      ],
      "Cc": [],
      "Bcc": [],
      "Subject": "Daily SSRS sales report",
      "Body": "Attached is the daily sales report.",
      "BodyFormat": "TEXT"
    }
  ],
  "DiskDestinations": [],
  "DataDriven": false,
  "SSRSAccountName": "Reporting Server",
  "UseSSRSAccount": true,
  "ReportPath": "/Sales/Daily Sales",
  "VirtualDirectory": "reports",
  "Datasources": [],
  "Parameters": []
}

Successful response:

{
  "uniqueid": 101
}

Store the returned identifier and retrieve the saved schedule:

GET /api/SingleSchedule/GetForSSRS?Id=101

Data-source overrides

When the report requires explicit data-source credentials, populate Datasources using the exposed fields:

  • DatasourceName
  • UserId
  • Password

Use names returned by data-source discovery and credentials authorized for those sources.

Report-server credentials and data-source credentials serve different purposes. Successfully connecting to the report server does not prove that its report queries can run.

Create a Power BI Report Server schedule

POST /api/SingleSchedule/CreatePbirs

Replace the account identifier, report path, date, and recipient with your deployment values.

This example selects all report pages with an empty PagesToRender string and creates the schedule disabled.

{
  "ScheduleName": "Daily Report Server Sales",
  "FolderPath": "/API Reports",
  "Description": "Daily sales report from Power BI Report Server",
  "Keywords": "pbirs,sales",
  "Schedule": {
    "Frequency": "Daily",
    "StartDate": "2026-10-01",
    "ExecutionTime": "09:00",
    "HasEndDate": false,
    "Repeat": false,
    "Enabled": false,
    "DailyRepeatInterval": 1
  },
  "EmailDestinations": [
    {
      "DestinationName": "Operations email",
      "DestinationType": "Email",
      "Enabled": true,
      "OutputFormat": "Acrobat Format (*.pdf)",
      "To": [
        "[email protected]"
      ],
      "Cc": [],
      "Bcc": [],
      "Subject": "Daily Report Server sales report",
      "Body": "Attached is the daily sales report.",
      "BodyFormat": "TEXT"
    }
  ],
  "DiskDestinations": [],
  "DataDriven": false,
  "SqlServerAccountId": 1,
  "ObjectType": "PBIRSITEM",
  "ReportPath": "/Sales/Daily Sales",
  "ReportTitle": "Daily Sales",
  "Parameters": [],
  "VirtualDirectory": "reports",
  "RenderingSettings": {
    "MinLoadingTime": 10,
    "MaxLoadingTime": 60,
    "PageWidth": 1300,
    "PageHeight": 800,
    "PagesToRender": "",
    "RenderingMethod": 1
  }
}

Successful response:

{
  "uniqueid": 102
}

Retrieve the saved schedule:

GET /api/SingleSchedule/GetPBirs?Id=102

Rendering settings

FieldMeaning
MinLoadingTimeLoading wait in seconds before rendering
MaxLoadingTimeMaximum loading wait in seconds
PageWidth and PageHeightRendering dimensions in pixels
PagesToRenderOne-based page selection, such as 1,2,5-10; an empty string selects all pages
RenderingMethod0 = Webkit, 1 = Chromium, 2 = Image

Loading waits are separate from API execution timeouts.

Inspect the output from a controlled execution before choosing production rendering settings. Confirm that every intended page is present and that visuals have finished loading.

Configure destinations

The schedule requests in this guide expose EmailDestinations and DiskDestinations.

Provide at least one supported destination. Include both collections explicitly, using [] for an unused collection.

For email delivery, configure PBRS email settings and verify the selected recipients and output format. See Set up an email destination in PBRS.

For disk delivery, verify that the executing PBRS server and its execution identity can write to the intended path. A local path refers to that server, not to the API client's computer.

Destination types available in the PBRS application are not automatically writable through these request models. Use only fields and destination types supported by the selected API operation.

Update an existing schedule

Use the endpoint matching the report source:

POST /api/SingleSchedule/UpdateForSSRS
POST /api/SingleSchedule/UpdateForPbirs

These are full-definition updates.

  1. Retrieve the current schedule.
  2. Compare it with the configuration maintained by your integration.
  3. Add its uniqueid to the update body.
  4. Preserve the intended connection settings, recurrence, enabled state, parameters, and rendering options.
  5. Include complete destination collections.
  6. Submit the update.
  7. Retrieve the schedule again to verify the changes.

Preserve existing destinations

Both update operations require complete, non-null EmailDestinations and DiskDestinations arrays.

  • Retain the DestinationId of every existing destination you keep.
  • Include every destination that should remain.
  • Use an empty array only when that destination collection should be empty.

Existing destinations absent from the submitted lists are removed.

Preserve credentials and writable settings

Do not submit a read response unchanged as an update request.

Read models may omit credentials or expose masked values. A masked password is not a new credential, and there is no universal rule that a masking string preserves credentials across endpoints.

Maintain the authorized connection configuration needed by your integration. Preserve SSRS data-source overrides deliberately.

For Power BI Report Server, submit writable rendering options through RenderingSettings. A read projection is not a complete backup of every writable setting.

Successful response

Both full-update operations return HTTP 200 with an empty body.

Do not parse that response as JSON or expect an updated schedule object. Use the matching retrieval operation to verify persisted values.

Execute and verify the schedule

Both report sources use the shared execution interface with ScheduleType set to report.

POST /api/Schedule/ExecuteScheduleAsync
{
  "ScheduleType": "report",
  "uniqueid": 101,
  "RunBy": "API"
}

Use the identifier returned during creation or retrieval.

Retain the returned ExecutionId and query:

GET /api/Schedule/GetExecutionStatus?ExecutionId=YOUR_EXECUTION_ID

A returned execution identifier confirms submission, not successful delivery.

Verify:

  • The execution reaches a final state.
  • The string-valued ResultJson contains a successful result.
  • The output contains the intended report pages and parameter selections.
  • Delivery reaches the intended destination.

Completed can contain a failed execution result.

After verifying the configuration and output, enable recurring execution:

POST /api/Schedule/EnableSchedule
{
  "ScheduleType": "report",
  "uniqueid": 101
}

Confirm the recurrence and next run before enabling the schedule.

Create multiple SSRS schedules

POST /api/SingleSchedule/CreateMultipleForSSRS

Submit a nonempty array of complete SSRS schedule definitions.

On success, PBRS returns numeric identifiers in input order:

[
  101,
  102
]

Creation is sequential after validation. A later failure can leave earlier schedules saved.

Reconcile the stored schedules before retrying a failed or interrupted batch. Do not assume rollback or resubmit the entire batch automatically.

Troubleshooting

ProblemCheck
Account cannot be resolvedVerify the configured account name or identifier and the field required by the selected endpoint.
Report cannot be foundVerify ReportPath, the reporting connection, virtual directory, and report permissions.
Parameter discovery failsVerify AccountId, report access, and the availability of the upstream reporting service.
Parameter submission failsConfirm that the request uses the correct SSRS or Power BI Report Server parameter model.
Report opens but execution failsCheck data-source credentials, required parameters, and access from the executing PBRS server.
Pages or visuals are missingReview PagesToRender, loading waits, rendering dimensions, and the generated output.
Delivery failsVerify email configuration or disk permissions under the execution identity.
Destinations disappear after an updateCheck whether the submitted collections omitted destinations or their existing DestinationId values.
An update returns no JSONHTTP 200 with an empty body is the expected successful response.
A request times outCheck persisted schedules or execution records before retrying; the original operation may have succeeded.

For shared lifecycle operations, see Schedule Lifecycle Reference.


Did this page help you?