Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Register now to learn Fabric in free live sessions led by the best Microsoft experts. From Apr 16 to May 9, in English and Spanish.

Reply
fgroenev
Regular Visitor

Uploading a PBIX file using the import API

Hello,

 

I am stuck trying to programmatically upload a .pbix file using the import API, making use of the request-promise library which is imported as "rp" here.

 

I am currently trying the following (in Node.js), which results in HTTP error 400:

let url = 'https://api.powerbi.com/v1.0/myorg/groups/' + groupId + '/imports';
		
let options = {
	method: 'POST',
	headers: {
		'Content-Type': 'multipart/form-data',
		'authorization': 'Bearer ' + accessToken
	},
	body: fs.createReadStream(__dirname + '/Report.pbix'),
	url: 'https://api.powerbi.com/v1.0/myorg/groups/' + groupId + '/imports'
};

rp(options)
	.then(function (body) {
	console.log('success! ', body);
})
	.catch(function (err) {
	console.log('error', err);
});

I also haven't had any success uploading the file using postman, where I have tried it with and without having set the Content-Type header. 

 

What could I be doing wrong? What headers are necessary to upload this file and make a proper request?

1 ACCEPTED SOLUTION
fgroenev
Regular Visitor

I figured out what I did wrong. Apparently you need a datasetDisplayName which is part of the url. 

 

Therefore this problem can be solved by appending the datasetDisplayName field to the url like this:

 

url: 'https://api.powerbi.com/v1.0/myorg/groups/' + groupId + '/imports?datasetDisplayName=' + reportName

View solution in original post

2 REPLIES 2
Anonymous
Not applicable

This is Python equivalant to upload a .pbix local file into PowerBI server

 

import requests
from requests_toolbelt.multipart.encoder import MultipartEncoder

groupId = "your workspace ID"
reportName = "reportName that you choose to appear on the server"
accessToken = "xx"

url = 'https://api.powerbi.com/v1.0/myorg/groups/' + groupId + '/imports?datasetDisplayName=' + reportName
headers = {
'Content-Type': 'multipart/form-data',
'authorization': 'Bearer ' + accessToken
}
file_location = '/xx.pbix'
# you need this dictionary to convert a binary file into form-data format
# None here means we skip the filename and file content is important
files = {'value': (None, open(file_location, 'rb'), 'multipart/form-data')}

mp_encoder = MultipartEncoder(fields=files)

r = requests.post(
url=url,
data=mp_encoder, # The MultipartEncoder is posted as data, don't use files=...!
# The MultipartEncoder provides the content-type header with the boundary:
headers=headers
)


 

fgroenev
Regular Visitor

I figured out what I did wrong. Apparently you need a datasetDisplayName which is part of the url. 

 

Therefore this problem can be solved by appending the datasetDisplayName field to the url like this:

 

url: 'https://api.powerbi.com/v1.0/myorg/groups/' + groupId + '/imports?datasetDisplayName=' + reportName

Helpful resources

Announcements
Microsoft Fabric Learn Together

Microsoft Fabric Learn Together

Covering the world! 9:00-10:30 AM Sydney, 4:00-5:30 PM CET (Paris/Berlin), 7:00-8:30 PM Mexico City

PBI_APRIL_CAROUSEL1

Power BI Monthly Update - April 2024

Check out the April 2024 Power BI update to learn about new features.

April Fabric Community Update

Fabric Community Update - April 2024

Find out what's new and trending in the Fabric Community.