Request data sharing with app specifications¶
This topic describes how to configure a Snowflake Native App to use app specifications to request permission to share data with providers or third parties through listings. This enables use cases such as compliance reporting, telemetry sharing, and data preprocessing.
App specification workflow for sharing data¶
The general workflow for configuring an app to share data using listings is as follows:
- Providers configure automated granting of privileges for the app. This allows consumers to give permission to an app to create shares and listings. - Note - App specifications require that - manifest_version = 2be set in the manifest file.
- Providers add the CREATE SHARE and CREATE LISTING privileges to the manifest file. 
- Providers add SQL statements to the setup script to create the following objects as required: - The setup script creates the share and listing when the app is installed or upgraded. The app specification can be created during setup or at runtime through a stored procedure. 
- When configuring the app, consumers review and approve the target accounts and auto-fulfillment settings on the listing. Auto-fulfillment settings is only applicable for cross-region sharing. For more information on how consumers view and approve app specifications, see Approve connections to external resources using app specifications. 
App specification definition for sharing data¶
For app specification of type LISTING, the app specification definition contains the following entries:
- TARGET_ACCOUNTS: A comma-separated list of target accounts to share data with, enclosed in single quotes. Each account must be specified in the format- OrgName.AccountName. For example:- 'ProviderOrg.ProviderAccount, PartnerOrg.PartnerAccount'.
- LISTING: The identifier of the listing object created by the app.
- AUTO_FULFILLMENT_REFRESH_SCHEDULE: Optional. The refresh schedule for cross-region data sharing. Can be specified as- <num> MINUTEor- USING CRON <expression>.
Note
The listing name in the app specification must match an existing listing created by the app. After this is set, the listing name cannot be changed.
Set the version of the manifest file¶
To enable automated granting of privileges for an app, set the version at the beginning of the manifest file as shown in the following example:
manifest_version: 2
Create an external listing¶
To create an external listing attached to the share, add the CREATE LISTING command to the setup script as shown in the following example:
CREATE EXTERNAL LISTING compliance_listing
  SHARE compliance_share
  AS
  $$
    title: "Compliance Data Share"
    subtitle: "Regulatory compliance reporting data"
    description: "Share compliance and audit data with authorized accounts"
    listing_terms:
      type: "OFFLINE"
  $$
  PUBLISH = FALSE
  REVIEW = FALSE;
Note
- Apps can only attach share to listing and cannot attach application package to listing. 
- Apps cannot directly add target accounts or auto-fulfillment configuration to the listing. 
- The listing manifest can only include the following properties: title, subtitle, description, and listing_terms. 
Create an app specification for a listing¶
The following example shows how to create an app specification for a listing:
ALTER APPLICATION SET SPECIFICATION shareback_spec
  TYPE = LISTING
  LABEL = 'Compliance Data Sharing'
  DESCRIPTION = 'Share compliance data with provider for regulatory reporting'
  TARGET_ACCOUNTS = 'ProviderOrg.ProviderAccount, AuditorOrg.AuditorAccount'
  LISTING = compliance_listing
  AUTO_FULFILLMENT_REFRESH_SCHEDULE = '60 MINUTE';
This command creates an app specification named shareback_spec that requests permission to
share data with the specified target accounts.
For cross-region sharing, the AUTO_FULFILLMENT_REFRESH_SCHEDULE parameter is required.
You can set it to one of the following:
- '<num> MINUTE'- Number of minutes, minimum 10 minutes, maximum 8 days or 11520 minutes
- 'USING CRON <expression> <time_zone>'- Cron expression with time zone
Note
- The app should only create the app specification after the listing and share objects exist. 
- Each listing can only have one associated app specification. 
- Updating the target accounts creates a new pending request for consumer approval. 
Validate the listing configuration¶
Apps can validate that the listing has been properly configured after approval by running the following commands:
-- Check if the app specification is approved:
SHOW APPROVED SPECIFICATIONS IN APPLICATION;
-- Validate the listing configuration:
DESC LISTING compliance_listing;
Consumer approval workflow¶
When a consumer approves a LISTING app specification, the following occurs:
- Snowflake automatically adds the target accounts to the listing. 
- If specified, Snowflake configures the auto-fulfillment refresh schedule. 
- The listing becomes visible to the target accounts. 
- Data attached to the listing would be queryable from the approved accounts. 
When a consumer declines a LISTING app specification, the following occurs:
- The listing becomes unpublished, and any existing target accounts are removed from the listing. 
- Auto-fulfillment is disabled. 
- The listing is no longer visible to any target accounts 
Best practices for LISTING app specifications¶
When implementing data sharing through app specification, please keep the following best practices in mind:
- Data protection: Store sensitive data in the application where it’s protected from consumer modifications. 
- Share integrity: Snowflake does not prevent consumers from modifying shares created by the app. If you have concerns about the integrity of your data, you should add data to the share from inside the application itself. This ensures that at least the content of the data cannot be modified by consumers, as data within the app’s database is protected from external modifications. 
- Error handling: Implement proper error handling for cases where the app specification is declined or not yet approved. 
- Cross-region considerations: Set appropriate refresh schedules based on data freshness requirements and cost considerations. 
- Compliance: Document clearly what data you are sharing, and why you are sharing it, in the app specification description. 
Using callback functions with LISTING app specifications¶
Apps can use lifecycle callbacks to respond when consumers approve or decline listing specifications by adding the following to the manifest file:
lifecycle_callbacks:
  specification_action: callbacks.on_spec_update
In the setup script, add the following callback stored procedure:
CREATE OR REPLACE PROCEDURE callbacks.on_spec_update (
  name STRING,
  status STRING,
  payload STRING)
RETURNS STRING
LANGUAGE SQL
AS
$$
BEGIN
  IF (name = 'shareback_spec' AND status = 'APPROVED') THEN
    -- Start populating shared tables
    CALL populate_compliance_data();
  ELSEIF (name = 'shareback_spec' AND status = 'DECLINED') THEN
    -- Clean up or notify provider
    CALL cleanup_share_data();
  END IF;
  RETURN 'Processed specification update';
END;
$$;
The procedure allows the app to react appropriately to consumer decisions about app’s data sharing request.