# Microsoft Store Listing Packager (`autosecurelogin/store-listing-packager`) Actor

Build a multilingual listing import ZIP and a before/after report from your Partner Center CSV, text changes and optional PNGs. No submission or account access.

- **URL**: https://apify.com/autosecurelogin/store-listing-packager.md
- **Developed by:** [Hunter Melnick](https://apify.com/autosecurelogin) (community)
- **Security:** Limited permissions
- **Stats:** 2 total users, 1 monthly users, 100.0% runs succeeded, 0 bookmarks
- **User rating**: No ratings yet

## Pricing

$0.05 / actor start

This Actor is paid per event. You are not charged for the Apify platform usage, but only a fixed price for specific events.

Learn more: https://docs.apify.com/actors/running/actors-in-store.md#pay-per-event

## What's an Apify Actor?

An Actor is a serverless cloud program that runs on the Apify platform. It has two run modes.
In Batch mode, an Actor accepts a well-defined JSON input, performs an action which can take anything from a few seconds to a few hours,
and optionally produces a well-defined JSON output, datasets with results, or files in key-value store.
In Standby mode, an Actor provides a web server which can be used as a website, API, or an MCP server.

Apify vocabulary and the platform model are defined once, in the agent quickstart at https://apify.com/agents.md.

## How to integrate an Actor?

If asked about integration, you help developers integrate Actors into their projects.
You adapt to their stack and deliver integrations that are safe, well-documented, and production-ready.

Do not guess an integration path. Every one of them is in the agent quickstart at https://apify.com/agents.md: the Apify MCP server, Agent Skills with the Apify CLI, the JavaScript and Python clients, the REST API, and the account-free path for an agent with no human to sign in. It also carries the rule on stating cost before the first paid run.

For examples already wired to this Actor's own input schema, see the [API](#api) section below.

Each client library has reference documentation the quickstart does not restate: [JavaScript/TypeScript](https://docs.apify.com/api/client/js/docs.md) (`npm install apify-client`) and [Python](https://docs.apify.com/api/client/python/docs.md) (`pip install apify-client`).

# README

## Microsoft Store Listing Packager

Prepare a multilingual listing import from your own fresh Partner Center CSV export. Replace only the text and desktop screenshots you specify. Download a ZIP containing an import folder and a review report showing every changed cell and whether a blank replacement falls back to the default language. This independent utility does not connect to Microsoft, submit listings or publish apps.

1. Paste the complete UTF-8 CSV export in **Partner Center export**. Start from a fresh export that already contains the languages and fields you need. The prefilled export and text are synthetic.
2. Under **Changes**, map language codes and field names to their replacements. For example, `{"texts":{"es":{"Description":"Descripción en español","ReleaseNotes":""}}}`. Leave unmodified languages and fields out.
3. For new desktop images add, for example, `"screenshots":{"es":{"DesktopScreenshot1":"home.png"}}` to Changes. In **PNG assets**, supply `{"home.png":"<standard base64 bytes>"}`. Use plain filenames and actual PNG files. To obtain the string on Windows: `[Convert]::ToBase64String([IO.File]::ReadAllBytes((Resolve-Path './home.png').Path))`. On macOS/Linux: `base64 < home.png | tr -d '\n'`. Existing exported asset references are preserved without fetching them; omit PNG assets for text-only edits.
4. Run the Actor. Open **Report and downloads** → **OUTPUT** to review before/after values and input/output hashes. Download **LISTING.zip**, extract it, and review the images and `review-report.json`.
5. In Partner Center, choose **Import listings → Import folder** and select the extracted **store-import** directory, not the ZIP itself. Partner Center decides whether the listing meets its current requirements. You remain in control of submission.

**Supported edits:** Description, ReleaseNotes, ShortDescription, ShortTitle, VoiceTitle, Title, Feature1–20, SearchTerm1–7, DesktopScreenshotCaptionN and desktop PNG screenshots. Each changed language needs an effective Description and a screenshot or existing reference. Unknown provider fields and untouched cells are preserved, including metadata. CSV quoting can be normalized. Title reservation, image content and Store acceptance are not checked. PNG checks cover the header and dimensions only. Inspect the exported CSV as text; cells are preserved, not sanitized for spreadsheet formulas.

**Limits:** 8 MiB JSON in total; export at most 1 MiB, 500 field rows and 25 columns; 10 PNG inputs, 2 MiB each, 4 MiB total; output screenshots at most 8 MiB. Default timeout 60 seconds; fixed 256 MB memory. Use the separate local product if your inputs cannot fit. No other purchase is required to use the supported hosted workflow.

**Price:** $0.05 once per Actor start, including platform usage, the complete ZIP, JSON and summary. No fee per field or image. Set the maximum run cost to at least $0.05. Invalid inputs and no-change runs still incur the start event.

Apify stores your supplied export and outputs under its storage access and retention settings. Use files you are authorized to process; no credentials or store login are needed. For support, use this Actor's Issues with a non-sensitive example and run ID.

# Actor input Schema

## `exportCsv` (type: `string`):

Paste the entire fresh UTF-8 CSV export. Up to 1 MiB, 500 field rows and 25 columns.

## `changes` (type: `object`):

Map texts and optional desktop screenshots by language and field.

## `pngAssets` (type: `object`):

Optional mapping of simple PNG filenames to standard base64 file bytes.

## Actor input object example

```json
{
  "exportCsv": "Field,ID,Type,default,en-us,es,fr-fr\nDescription,1,Text,,\"Old\nEnglish\",Anterior,Français\nReleaseNotes,2,Text,,Old,,\nFeature1,3,Text,,Feature,,\nDesktopScreenshot1,4,Relative path,,https://example.com/en.png,https://example.com/es.png,\nTrailer1,5,URL,,https://example.com/trailer,,\nFutureField,6,Text,default,a,b,c\nSearchTerm1,7,Text,,,,\n",
  "changes": {
    "texts": {
      "en-us": {
        "Description": "Review your tasks in one place.",
        "ReleaseNotes": ""
      },
      "es": {
        "Description": "Revisa tus tareas en un solo lugar."
      }
    }
  },
  "pngAssets": {}
}
```

# Actor output Schema

## `files` (type: `string`):

Download LISTING.zip and review OUTPUT.

## `summary` (type: `string`):

Changed cell count, screenshots, and submission flag.

# API

You can run this Actor programmatically using our API. Below are code examples in JavaScript, Python, and CLI, as well as the OpenAPI specification and MCP server setup.

## JavaScript example

```javascript
import { ApifyClient } from 'apify-client';

// Initialize the ApifyClient with your Apify API token
// Replace the '<YOUR_API_TOKEN>' with your token
const client = new ApifyClient({
    token: '<YOUR_API_TOKEN>',
});

// Prepare Actor input
const input = {
    "exportCsv": `Field,ID,Type,default,en-us,es,fr-fr
Description,1,Text,,"Old
English",Anterior,Français
ReleaseNotes,2,Text,,Old,,
Feature1,3,Text,,Feature,,
DesktopScreenshot1,4,Relative path,,https://example.com/en.png,https://example.com/es.png,
Trailer1,5,URL,,https://example.com/trailer,,
FutureField,6,Text,default,a,b,c
SearchTerm1,7,Text,,,,`,
    "changes": {
        "texts": {
            "en-us": {
                "Description": "Review your tasks in one place.",
                "ReleaseNotes": ""
            },
            "es": {
                "Description": "Revisa tus tareas en un solo lugar."
            }
        }
    },
    "pngAssets": {}
};

// Run the Actor and wait for it to finish
const run = await client.actor("autosecurelogin/store-listing-packager").call(input);

// Fetch and print Actor results from the run's dataset (if any)
console.log('Results from dataset');
console.log(`💾 Check your data here: https://console.apify.com/storage/datasets/${run.defaultDatasetId}`);
const { items } = await client.dataset(run.defaultDatasetId).listItems();
items.forEach((item) => {
    console.dir(item);
});

// 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/js/docs

```

## Python example

```python
from apify_client import ApifyClient

# Initialize the ApifyClient with your Apify API token
# Replace '<YOUR_API_TOKEN>' with your token.
client = ApifyClient("<YOUR_API_TOKEN>")

# Prepare the Actor input
run_input = {
    "exportCsv": """Field,ID,Type,default,en-us,es,fr-fr
Description,1,Text,,\"Old
English\",Anterior,Français
ReleaseNotes,2,Text,,Old,,
Feature1,3,Text,,Feature,,
DesktopScreenshot1,4,Relative path,,https://example.com/en.png,https://example.com/es.png,
Trailer1,5,URL,,https://example.com/trailer,,
FutureField,6,Text,default,a,b,c
SearchTerm1,7,Text,,,,
""",
    "changes": { "texts": {
            "en-us": {
                "Description": "Review your tasks in one place.",
                "ReleaseNotes": "",
            },
            "es": { "Description": "Revisa tus tareas en un solo lugar." },
        } },
    "pngAssets": {},
}

# Run the Actor and wait for it to finish
run = client.actor("autosecurelogin/store-listing-packager").call(run_input=run_input)

# Fetch and print Actor results from the run's dataset (if there are any)
print(f"💾 Check your data here: https://console.apify.com/storage/datasets/{run.default_dataset_id}")
for item in client.dataset(run.default_dataset_id).iterate_items():
    print(item)

# 📚 Want to learn more 📖? Go to → https://docs.apify.com/api/client/python/docs/quick-start

```

## CLI example

```bash
echo '{
  "exportCsv": "Field,ID,Type,default,en-us,es,fr-fr\\nDescription,1,Text,,\\"Old\\nEnglish\\",Anterior,Français\\nReleaseNotes,2,Text,,Old,,\\nFeature1,3,Text,,Feature,,\\nDesktopScreenshot1,4,Relative path,,https://example.com/en.png,https://example.com/es.png,\\nTrailer1,5,URL,,https://example.com/trailer,,\\nFutureField,6,Text,default,a,b,c\\nSearchTerm1,7,Text,,,,\\n",
  "changes": {
    "texts": {
      "en-us": {
        "Description": "Review your tasks in one place.",
        "ReleaseNotes": ""
      },
      "es": {
        "Description": "Revisa tus tareas en un solo lugar."
      }
    }
  },
  "pngAssets": {}
}' |
apify call autosecurelogin/store-listing-packager --silent --output-dataset

```

## MCP server setup

```json
{
    "mcpServers": {
        "apify": {
            "type": "http",
            "url": "https://mcp.apify.com/?tools=fetch-actor-details,autosecurelogin/store-listing-packager"
        }
    }
}
```

The hosted server signs you in with OAuth on first connect, so no API token belongs in this config. Clients without OAuth support can send an `Authorization: Bearer <APIFY_API_TOKEN>` header instead, using a token from API & Integrations in Apify Console (https://console.apify.com/settings/integrations).

## OpenAPI specification

Download the OpenAPI definition: https://api.apify.com/v2/actors/dhgkYHnbdjaX5jLG7/builds/KNeO1kCbvnxfLQ0WF/openapi.json
