Forum Discussion

Siddheshwar's avatar
Siddheshwar
Copper Contributor
Nov 26, 2018
Solved

How to fetch Save for later pages in SPFx Web part.

Hi,

Microsoft rolled out new feature 'save for later' for modern pages. Once Save for later is clicked, it becomes Saved for later, and the associated icon is filled in. 

Save for later command on a page

When Saved for later is clicked, a list of Recently saved items is displayed. You can click See all saved items to see the entire list of saved items. Entire list get visible on _layout/15/sharepoint.aspx page under Saved tab.

Recently saved items

I have requirement to show these saved pages using spfx web part. I googled on this to find the way but I haven't got anything to fetch these saved pages.

I tried below things to get these saved pages but it's not return saved pages data.

1. Undocumented service - /_vti_bin/homeapi.ashx

2. https://northeurope4-sphomep.svc.ms/api/v1/documents/saveForLater?start=0&count=100

 

Br/ Siddheshwar

  • The json payload returned from:

    /_api/sphomeservice/context?$expand=Token

    includes a node named:

     resource

    which seems to show the complete hostname of the sphome.svc.ms to use.

     

    You rightly point out this is not a documented API, so I wouldn't use it in any production code.

4 Replies

  • Siddheshwar's avatar
    Siddheshwar
    Copper Contributor

    Hi,

     

    I found the way. here is the code snippet:

     

    private async _getApiToken() : Promise<string> {
    const siteCollectionUrl = this.props.context.pageContext.web.absoluteUrl;
    const restQuery = `${siteCollectionUrl}/_api/sphomeservice/context?$expand=Token`;
    const httpClientOptions: ISPHttpClientOptions = {};
    const response: SPHttpClientResponse = await this.props.context.spHttpClient.fetch(restQuery, SPHttpClient.configurations.v1, httpClientOptions);
    const responseJson: any = await response.json();
    return responseJson.Token.access_token;
    // Improvement: Grab the Hub api URL from: responseJson.Urls
    }

     

    private async _getsavedForLaterPages(): Promise<void> {
    const isHubSite = await this._isHubSite();

    if (!isHubSite) return;
    const token = await this._getApiToken();
    const restQuery = `https://{region}-sphomep.svc.ms/api/v1/documents/saveForLater?start=0&count=100`;
    const httpClientOptions: IHttpClientOptions = {
    headers: {
    'authorization': `Bearer ${token}`,
    'sphome-apicontext': `{"PortalUrl":"${this.props.context.pageContext.site.absoluteUrl}"}`
    }
    };
    const response: HttpClientResponse = await this.props.context.httpClient.fetch(restQuery, SPHttpClient.configurations.v1, httpClientOptions);
    const responseJson: any = await response.json();
    console.log("Saved for later data:"+responseJson);
    }

     

    Thank You,

    Siddheshwar Kohale

     

    • Siddheshwar's avatar
      Siddheshwar
      Copper Contributor

      Hi All,

       

      As I'm using undocumented service to get the save for later pages data. 

      But after some day this functionality stopped working so I to find root cause I debugged the source code and found that region {northeurope4} mentioned the service get keep changing after some days.

      https://northeurope4-sphomep.svc.ms/api/v1/documents/saveForLater?start=0&count=100

       

      I don't know why it's changing so frequently , is there any way out to resolve this kind of issue?

       

      Thank You.

      Siddheshwar

      • Mark Powney's avatar
        Mark Powney
        Copper Contributor

        The json payload returned from:

        /_api/sphomeservice/context?$expand=Token

        includes a node named:

         resource

        which seems to show the complete hostname of the sphome.svc.ms to use.

         

        You rightly point out this is not a documented API, so I wouldn't use it in any production code.

Resources