• OData API
  • Authentication
  • Using OAuth2 authorization
  • Using the OData API
  • Microsoft Excel integration
  • OData API

    OpenDataSoft features an OData API that supports versions 3.0 and 4.0 of the protocol. It can be used either directly or through the Microsoft Excel integration.

    Authentication

    An authenticated user can be granted access to restricted datasets and benefit from extended quotas for API calls. The API features an authentication mechanism for users to be granted their specific authorizations.

    For the platform to authenticate a user, you need to either:

    Finding and generating API keys

    API keys are managed via your user profile page at https://<youropendatasoftportal>.com/account/ or by clicking on your name in the header.

    Link to account settings

    Go to the tab named My API keys to see your existing API keys, revoke them and create new ones.

    Account's API keys page

    Providing API keys within requests

    Unauthenticated request on private portal

    > GET https://private-portal.opendatasoft.com/api/v2/catalog/datasets/ HTTP/1.1
    
    < HTTP/1.0 401 Unauthorized
    

    Request authenticated with an API key

    > GET https://private-portal.opendatasoft.com/api/v2/catalog/datasets/?apikey=7511e8cc6d6dbe65f9bc8dae19e08c08a2cab96ef45a86112d303eee HTTP/1.1
    
    < HTTP/1.0 200 OK
    
    {
        "total_count": 4,
        "links": [{
            "href": "https://private-portal.opendatasoft.com/api/v2/catalog/datasets?start=0&include_app_metas=False&rows=10",
            "rel": "self"
        }, {
            "href": "https://private-portal.opendatasoft.com/api/v2/catalog/datasets?start=0&include_app_metas=False&rows=10",
            "rel": "first"
        }, {
            "href": "https://private-portal.opendatasoft.com/api/v2/catalog/datasets?start=0&include_app_metas=False&rows=10",
            "rel": "last"
        }],
        "datasets": [...]
    }
    

    API keys are passed along requests through the query parameter apikey.

    For example, accessing a private portal's catalog unauthenticated will return a 401 Unauthorized error.

    But passing the API key of an authorized user will return the JSON response with the list of accessible datasets for this user on the portal.

    Using OAuth2 authorization

    Overview

    OpenDataSoft implements the OAuth2 authorization flow, allowing third party application makers to access the data hosted on an OpenDataSoft platform on behalf of a user while never having to deal with a password, thus avoiding any user credential to be compromised.

    The OpenDataSoft OAuth2 authorization flow is compliant with RFC 6749 and makes use of Bearer Tokens in compliance with RFC 6750.

    Application developers who want to use the OpenDataSoft APIs with OAuth2 must go through the following steps, which will be explained in this section.

    1. Register their application with the OpenDataSoft platform.
    2. Request approval from users via an OAuth2 authorization grant.
    3. Request a bearer token that will allows them to query the OpenDataSoft platform APIs for a limited amount of time.
    4. Refresh the Bearer Token when it expires.

    Currently, applications are registered on a specific domain and can only access data on this domain.

    Register an application for OAuth2 authentication

    OAuth2 applications management interface

    1. Go to the My applications tab of your account page on the domain you want to register the application on.
    2. Fill the registration form with the following information:
      • Application name: the name of the application
      • Type:
        • confidential: client password is kept secret from the user and only used from a trusted environment (e.g: a web service, where the client password is stored server-side and never sent to the user)
        • public: client password is embedded in a client-side application, making it potentially available to the world (e.g: a mobile or desktop application)
      • Redirection URL: the URL users will be redirected to after they have granted you permission to access their data
    3. Store the resulting client ID and client secret that will be needed to perform the next steps.

    Getting an authorization grant

    Example call to /oauth2/authorize/

    GET /oauth2/authorize/?
        client_id=123456789&
        redirect_uri=https://example.com&
        response_type=code&
        state=ilovedata&
        scope=all HTTP/1.1
    

    To get an authorization grant from a user:

    1. Redirect them to /oauth2/authorize/ with the appropriate query parameters.
    2. The user will then be authenticated in the platform and redirected to a page identifying your application.
    3. From there, the user will review the information you filled in the form described above and the scope of the requested access, and grant your application the right to access their data.
    4. Once the user has accepted those terms, they will be redirected to your application's redirection URL with query parameters describing your authorization grant.

    The query parameters you need to supply when redirecting the user are the following:

    Redirection following a successful authorization

    HTTP/1.0 302 FOUND
    Location: https://example.com?state=ilovedata&code=gKnAQc2yIfdz2mY25xxgpTY2uyG5Sv
    

    The authorization grant redirect will have these values:

    The 30-character authorization code must now be converted into a bearer token within 1 hour before expiring.

    Converting an authorization grant to a bearer token

    Example call to /oauth2/token/

    POST /oauth2/token/ HTTP/1.1
    
    client_id=cid&
        client_secret=csc&
        grant_type=authorization_code&
        code=GokshWxRFXmW0MaLHkDv5HrG6wieGs&
        scopes=all&
        redirect_uri=https://example.com&
        state=ilovedata
    

    To receive a bearer token, convert the previously obtained authorization grant via a POST request to /oauth2/token/ with the following parameters:

    Alternative call with an Authorization header

    POST /oauth2/token/ HTTP/1.1
    Authorization: Basic Y2lkOmNzYw==
    
    grant_type=authorization_code&
        code=GokshWxRFXmW0MaLHkDv5HrG6wieGs&
        scopes=all&
        redirect_uri=https://example.com&state=ilovedata
    

    Alternatively, you can pass your client ID and client secret through the Authorization header

    Example response for a bearer token request

    HTTP/1.0 200 OK
    Content-Type: application/json
    
    {
        "access_token": "9kxoTUYvSxnAiMpv008NBqRiqk5xWt",
        "expires_in": 3600,
        "token_type": "Bearer",
        "state": "ilovedata",
        "scope": "all",
        "refresh_token": "jFfDUcsK9zzNMs1zwczzJxGrimPtmf"
    }
    

    The response to this request is a JSON representation of a bearer token, which contains the following values:

    Using the bearer token

    Using the token as a query parameter

    GET /api/end/point?access_token=9kxoTUYvSxnAiMpv008NBqRiqk5xWt HTTP/1.1
    

    Using the token in an Authorization header

    GET /api/end/point HTTP/1.1
    Authorization: Bearer 9kxoTUYvSxnAiMpv008NBqRiqk5xWt
    

    Using the token in the request body

    GET /api/end/point HTTP/1.1
    
    access_token=9kxoTUYvSxnAiMpv008NBqRiqk5xWt
    

    The bearer token can be passed along requests for authentication in three different ways:

    Refreshing a bearer token

    Example token refresh call

    POST /oauth2/token/ HTTP/1.1
    
    client_id=cid&
        client_secret=csc&
        grant_type=refresh_token&
        refresh_token=jFfDUcsK9zzNMs1zwczzJxGrimPtmf&
        scopes=all&
        redirect_uri=https://example.com&
        state=ilovedata
    

    To refresh an expired bearer token, send a request to the /oauth2/token/ endpoint, with the following query parameters:

    The response to this request is identical to the bearer token response.

    Using the OData API

    General points

    Service address

    In this documentation, we will use the words "service root" or "service document" to refer to the base address of the OData service. For the OpenDataSoft platform, this URL can be found on the /api/odata path, relative to the platform hostname. Unless stated otherwise, all addresses in the rest of this documentation are relative to the service root.

    HTTP Method

    The OpenDataSoft OData service currently is read only, hence the only allowed method is GET.

    Versions

    The OpenDataSoft platform supports versions 3.0 and 4.0 of the OData protocol. Versions requirements can be communicated to the service via the following six headers:

    Header Description
    OData-Version This header informs the server which version of the protocol is used by the client.
    DataServiceVersion This header specifies which protocol version the service should use.
    OData-MinVersion This header specifies the minimum version supported by the client.
    minDataServiceVersion This header specifies the minimum version the service should use.
    OData-MaxVersion This header specifies the maximum version supported by the client.
    maxDataServiceVersion This header specifies the maximum version the service should use.

    From the next paragraph on, in order to keep things simple and relevant, all examples will illustrate protocol version 4.0. Keep in mind however that all described features work in both supported version. If version 3.0 use a specific syntax or needs special attention, it shall be described.

    Metadata

    GET https://examples.opendatasoft.com/api/odata/$metadata HTTP/1.1
    
    <?xml version="1.0" encoding="UTF-8"?>
    <edmx:Edmx xmlns:edmx="http://docs.oasis-open.org/odata/ns/edmx" Version="4.0">
      <edmx:DataServices xmlns:m="http://docs.oasis-open.org/odata/ns/metadata" m:MaxDataServiceVersion="4.0" m:DataServiceVersion="4.0">
        <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Alias="Ods" Namespace="com.opendatasoft.odata.types">
          <ComplexType Name="GeoPoint2D">
            <Property Type="Edm.Double" Name="latitude" />
            <Property Type="Edm.Double" Name="longitude" />
          </ComplexType>
          <ComplexType Name="Image">
            <Property Type="Edm.Int32" Name="width" />
            <Property Type="Edm.String" Name="format" />
            <Property Type="Edm.String" Name="id" />
            <Property Type="Edm.Int32" Name="height" />
          </ComplexType>
        </Schema>
        <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="examples.world-heritage-unesco-list">
          <EntityType Name="world-heritage-unesco-list">
            <Key>
              <PropertyRef Name="recordid" />
            </Key>
            <Property Type="Edm.String" Name="recordid" Nullable="false" />
            <Property Type="Edm.String" Name="name_en" />
            <Property Type="Edm.String" Name="name_fr" />
            <Property Type="Edm.String" Name="short_description_en" />
            <Property Type="Edm.String" Name="short_description_fr" />
            <Property Type="Edm.String" Name="justification_en" />
            <Property Type="Edm.String" Name="justification_fr" />
            <Property Type="Edm.DateTimeOffset" Name="date_inscribed" />
            <Property Type="Edm.String" Name="danger_list" />
            <Property Type="Edm.Double" Name="longitude" />
            <Property Type="Edm.Double" Name="latitude" />
            <Property Type="Edm.Double" Name="area_hectares" />
            <Property Type="Edm.String" Name="category" />
            <Property Type="Edm.String" Name="country_en" />
            <Property Type="Edm.String" Name="country_fr" />
            <Property Type="Edm.String" Name="continent_en" />
            <Property Type="Edm.String" Name="continent_fr" />
            <Property Type="com.opendatasoft.odata.types.GeoPoint2D" Name="geographical_coordinates" />
          </EntityType>
        </Schema>
        <Schema xmlns="http://docs.oasis-open.org/odata/ns/edm" Namespace="examples.datasets">
          <EntityContainer m:IsDefaultEntityContainer="true" Name="examplesContainer">
            <EntitySet EntityType="examples.world-heritage-unesco-list.world-heritage-unesco-list" Name="world-heritage-unesco-list" />
          </EntityContainer>
          <Annotations Target="examples.world-heritage-unesco-list.world-heritage-unesco-list">
            <Annotation Term="Org.OData.Publication.V1.PublisherName" String="UNESCO" />
            <Annotation Term="Org.OData.Publication.V1.LastModified" String="2017-10-17T15:34:38+00:00" />
            <Annotation Term="Org.OData.Publication.V1.Keywords" String="unesco, world" />
            <Annotation Term="Org.OData.Display.V1.DisplayName" String="World Heritage - UNESCO List" />
          </Annotations>
        </Schema>
      </edmx:DataServices>
    </edmx:Edmx>
    

    The metadata document is located on /$metadata. This documents determines:

    Formats

    GET https://examples.opendatasoft.com/api/odata/error?$format=json HTTP/1.1
    
    {
        "error": {
            "message": "Resource not found for the segment 'error'",
            "code": 404
        }
    }
    
    GET https://examples.opendatasoft.com/api/odata/error?$format=xml HTTP/1.1
    
    <m:error xmlns:m="http://docs.oasis-open.org/odata/ns/metadata">
        <m:code>404</m:code>
        <m:message>Resource not found for the segment 'error'</m:message>
    </m:error>
    

    The service supports ATOM and JSON formats. For the JSON formats, the "minimal" and "full" metadata levels are supported. Any request for a metadata level of "none" will be responded to with the "minimal" metadata level, as per the standard.

    There are 2 main ways of requesting a specific format:

    The format parameter, be it in the headers or in the query string, can be either the abbreviations JSON, XML or ATOM, or the exact MIME type requested. For the JSON format, different metadata levels can be requested by using the full MIME type followed by ;odata.metadata=<LEVEL> for protocol version 4.0 and ;odata=<LEVEL>metadata for protocol version 3.0.

    To keep things simple, the rest of this article will feature examples with the JSON format, which is the default, but keep in mind that everything will work the same in the ATOM format.

    Catalog

    GET https://examples.opendatasoft.com/api/odata/?$format=json HTTP/1.1
    
    {
    "@odata.context": "https://examples.opendatasoft.com/api/odata/$metadata",
    "value": [{
            "name": "world-heritage-unesco-list",
            "url": "world-heritage-unesco-list"
        },
        /* ... */
        ]
    }
    

    The service root document displays the catalog of all datasets available through the service.

    Datasets

    GET https://examples.opendatasoft.com/api/odata/world-heritage-unesco-list HTTP/1.1
    
    {
    {
        "@odata.context": "https://examples.opendatasoft.com/api/odata/$metadata#world-heritage-unesco-list",
        "value": [{
                "recordid": "ff1f5b718ce2ee87f18dfaf20610f257979f2f4a",
                "category": "Cultural",
                "short_description_en": "The Architectural, Residential and Cultural Complex of the Radziwill Family at Nesvizh is located in central Belarus. [...]",
                "name_fr": "Ensemble architectural, résidentiel et culturel de la famille Radziwill à Nesvizh",
                "continent_en": "Europe and North America",
                "justification_fr": "[...]",
                "country_en": "Belarus",
                "longitude": 26.69139,
                "justification_en": "[...]",
                "date_inscribed": "2005-01-01",
                "continent_fr": "Europe et Amérique du nord",
                "area_hectares": 0,
                "latitude": 53.22278,
                "name_en": "Architectural, Residential and Cultural Complex of the Radziwill Family at Nesvizh",
                "geographical_coordinates": {
                    "latitude": 53.22278,
                    "longitude": 26.69139
                },
                "country_fr": "Bélarus"
            },
            /* ... */
        ],
        "@odata.nextLink": "https://examples.opendatasoft.com/api/odata/world-heritage-unesco-list?$skiptoken=100"
    }
    }
    

    The records of a dataset can be browsed on the /<dataset_id> page. It is easy to navigate from the service root document to a dataset by following the URL attribute of the catalog items.

    Paging

    GET https://examples.opendatasoft.com/api/odata/baby_names_nc_2013?$top=2 HTTP/1.1
    
    {
        "@odata.context": "https://examples.opendatasoft.com/api/odata/$metadata#baby_names_nc_2013",
        "value": [
            {
                "recordid": "6767d8330abd8b38d0207cef113dcb94e50ebfd6",
                "gender": "F",
                "state": "NC",
                "number": 645,
                "name": "Emma",
                "year": "2013"
            },
            {
                "recordid": "c7faeb25c4bfeb820c4e80864c7861192508d0d2",
                "gender": "F",
                "state": "NC",
                "number": 272,
                "name": "Ella",
                "year": "2013"
            }
        ],
        "@odata.nextLink": "https://examples.opendatasoft.com/api/odata/baby_names_nc_2013?$skiptoken=2"
    }
    
    GET https://examples.opendatasoft.com/api/odata/baby_names_nc_2013?$skip=1&$top=2 HTTP/1.1
    
    {
        "@odata.context": "https://examples.opendatasoft.com/api/odata/$metadata#baby_names_nc_2013",
        "value": [
            {
                "recordid": "c7faeb25c4bfeb820c4e80864c7861192508d0d2",
                "gender": "F",
                "state": "NC",
                "number": 272,
                "name": "Ella",
                "year": "2013"
            },
            {
                "recordid": "d5fd82cf69691db575de6cfe207d105caa10f68c",
                "gender": "F",
                "state": "NC",
                "number": 263,
                "name": "Natalie",
                "year": "2013"
            }
        ],
        "@odata.nextLink": "https://examples.opendatasoft.com/api/odata/baby_names_nc_2013?$skiptoken=3"
    }
    

    Client-driven paging can be requested with the $top query parameter to limit the size of the response, and the $skip query parameter to define the first result to display.

    The server will ignore $skip results and then return the first $top items.

    When paging is applied, a link to the next results will be added at the end of the payload.

    GET https://examples.opendatasoft.com/api/odata/baby_names_nc_2013?$search=Cad HTTP/1.1
    
    {
        "@odata.context": "https://examples.opendatasoft.com/api/odata/$metadata#baby_names_nc_2013",
        "value": [
            {
                "recordid": "d060a6452d427b6e56ec0ed12307bda1a65ade4d",
                "gender": "F",
                "state": "NC",
                "number": 5,
                "name": "Cadance",
                "year": "2013"
            },
            {
                "recordid": "efc3e55da1dd591ba0c2bd42f0b0719e330f738f",
                "gender": "M",
                "state": "NC",
                "number": 79,
                "name": "Caden",
                "year": "2013"
            },
            {
                "recordid": "025f3eb0e7443f7ab7809f06685a06064cade230",
                "gender": "F",
                "state": "NC",
                "number": 41,
                "name": "Cadence",
                "year": "2013"
            },
            {
                "recordid": "67eab51bfaf034d88b5a98819bef98961084e449",
                "gender": "M",
                "state": "NC",
                "number": 30,
                "name": "Cade",
                "year": "2013"
            }
        ]
    }
    

    The $search parameter can be used to search data.

    Restriction

    GET https://examples.opendatasoft.com/api/odata/baby_names_nc_2013?$filter=name eq Caden
    
    {
        "@odata.context": "https://examples.opendatasoft.com/api/odata/$metadata#baby_names_nc_2013",
        "value": [
            {
                "recordid": "efc3e55da1dd591ba0c2bd42f0b0719e330f738f",
                "gender": "M",
                "state": "NC",
                "number": 79,
                "name": "Caden",
                "year": "2013"
            }
        ]
    }
    
    GET https://examples.opendatasoft.com/api/odata/baby_names_nc_2013?$filter=number gt 280 and not number ge 285
    
    {
        "@odata.context": "https://examples.opendatasoft.com/api/odata/$metadata#baby_names_nc_2013",
        "value": [
            {
                "recordid": "5842808cd7f07f1e1ca733457605dfaadfcbc0a4",
                "gender": "M",
                "state": "NC",
                "number": 282,
                "name": "Isaac",
                "year": "2013"
            },
            {
                "recordid": "27676f39b6282bca2ab52e5e00468a269aabfbd0",
                "gender": "M",
                "state": "NC",
                "number": 281,
                "name": "Dylan",
                "year": "2013"
            }
        ]
    }
    

    The $filter parameter can be used to apply a restriction on results.

    Supported restriction operators are eq and ne for equality and inequality, lt and gt for strict inequalities and le and ge for non strict inequalities.

    Multiple restriction expessions can be combined into bigger expressions with the logical operators and and or.

    Expressions can be negated with the not operator.

    Count

    GET https://examples.opendatasoft.com/api/odata/baby_names_nc_2013?$filter=number lt 8&$top=1&$count=true
    
    {
        "@odata.context": "https://examples.opendatasoft.com/api/odata/$metadata#baby_names_nc_2013",
        "@odata.count": 966,
        "value": [
            {
                "recordid": "9acf1ee923cdd25b61027056d3bbde9bfa4681dd",
                "gender": "F",
                "state": "NC",
                "number": 7,
                "name": "Adah",
                "year": "2013"
            }
        ],
        "@odata.nextLink": "https://examples.opendatasoft.com/api/odata/baby_names_nc_2013?$skiptoken=1&$filter=number%20lt%208&$count=true"
    }
    
    GET https://examples.opendatasoft.com/api/odata/baby_names_nc_2013/$count
    
    2841
    

    There are 2 ways of obtaining the number of records in a dataset.

    These two methods have slightly different semantics:

    Sort

    GET https://examples.opendatasoft.com/api/odata/baby_names_nc_2013?$search=Cad&$orderby=number
    
    {
        "@odata.context": "https://examples.opendatasoft.com/api/odata/$metadata#baby_names_nc_2013",
        "value": [
            {
                "recordid": "d060a6452d427b6e56ec0ed12307bda1a65ade4d",
                "gender": "F",
                "state": "NC",
                "number": 5,
                "name": "Cadance",
                "year": "2013"
            },
            {
                "recordid": "67eab51bfaf034d88b5a98819bef98961084e449",
                "gender": "M",
                "state": "NC",
                "number": 30,
                "name": "Cade",
                "year": "2013"
            },
            {
                "recordid": "025f3eb0e7443f7ab7809f06685a06064cade230",
                "gender": "F",
                "state": "NC",
                "number": 41,
                "name": "Cadence",
                "year": "2013"
            },
            {
                "recordid": "efc3e55da1dd591ba0c2bd42f0b0719e330f738f",
                "gender": "M",
                "state": "NC",
                "number": 79,
                "name": "Caden",
                "year": "2013"
            }
        ]
    }
    
    GET https://examples.opendatasoft.com/api/odata/baby_names_nc_2013?$search=Cad&$orderby=number desc
    
    {
        "@odata.context": "https://examples.opendatasoft.com/api/odata/$metadata#baby_names_nc_2013",
        "value": [
            {
                "recordid": "efc3e55da1dd591ba0c2bd42f0b0719e330f738f",
                "gender": "M",
                "state": "NC",
                "number": 79,
                "name": "Caden",
                "year": "2013"
            },
            {
                "recordid": "025f3eb0e7443f7ab7809f06685a06064cade230",
                "gender": "F",
                "state": "NC",
                "number": 41,
                "name": "Cadence",
                "year": "2013"
            },
            {
                "recordid": "67eab51bfaf034d88b5a98819bef98961084e449",
                "gender": "M",
                "state": "NC",
                "number": 30,
                "name": "Cade",
                "year": "2013"
            },
            {
                "recordid": "d060a6452d427b6e56ec0ed12307bda1a65ade4d",
                "gender": "F",
                "state": "NC",
                "number": 5,
                "name": "Cadance",
                "year": "2013"
            }
        ]
    }
    

    Results returned by the service can be sorted by a field using the $orderby parameter. The field name can be followed by the asc and desc keywords to specify the sort order (default is ascendant).

    Specific record

    GET https://examples.opendatasoft.com/api/odata/baby_names_nc_2013(efc3e55da1dd591ba0c2bd42f0b0719e330f738f) HTTP/1.1
    
    {
        "@odata.context": "https://examples.opendatasoft.com/api/odata/$metadata#baby_names_nc_2013/$entity",
        "recordid": "efc3e55da1dd591ba0c2bd42f0b0719e330f738f",
        "gender": "M",
        "state": "NC",
        "number": 79,
        "name": "Caden",
        "year": "2013"
    }
    

    To access a specific record, its record id surrounded by parenthesis, can be appended to the dataset address.

    Projection

    GET https://examples.opendatasoft.com/api/odata/baby_names_nc_2013?$search=Cad&$select=name, number
    
    {
        "@odata.context": "https://examples.opendatasoft.com/api/odata/$metadata#baby_names_nc_2013(name,number)",
        "value": [
            {
                "number": 5,
                "name": "Cadance"
            },
            {
                "number": 79,
                "name": "Caden"
            },
            {
                "number": 41,
                "name": "Cadence"
            },
            {
                "number": 30,
                "name": "Cade"
            }
        ]
    }
    

    Results can be projected over specific fields using the $select parameter.

    For multiple fields to be subject of the projection, their names must be separated by a comma and an optional space.

    This parameter can be used with datasets and specific records.

    GET https://examples.opendatasoft.com/api/odata/baby_names_nc_2013(efc3e55da1dd591ba0c2bd42f0b0719e330f738f)?$select=name
    
    {
        "@odata.context": "https://examples.opendatasoft.com/api/odata/$metadata#baby_names_nc_2013(name)/$entity",
        "name": "Caden"
    }
    

    Microsoft Excel integration

    The OpenDataSoft OData service makes it possible to gather data directly from Microsoft Excel without any programming knowledge.

    There are 3 ways to proceed:

    This article will give a detailed explanation on how to do it.

    Native Integration

    Here are the steps that will allow you to import data through the Excel native OData integration.

    Data sources supported natively by Microsoft Excel.

    Data feed connection form.

    Table selection window.

    A table selected to become a data source.

    The "Import Data" window.

    Imported data in Microsoft Excel.

    PowerPivot

    Here are the steps that will allow you to import data through PowerPivot for Microsoft Excel.

    "Add-Ins" tab in the Microsoft Excel settings window.

    The COM add ins selection window.

    PowerPivot menu bar.

    Data sources management window.

    Data feed connection window.

    Table selection window.

    Data transfer window.

    Data preview.

    The data import list in PowerPivot.

    The destination selection window.

    Data aggregation using PowerPivot.

    Power Query

    Here are the steps that will allow you to import data through Power Query for Microsoft Excel.

    Data sources supported by Microsoft Power Query.

    OData data source selection window.

    Power Query navigation window.

    Imported data through Power Query.