Get App Settings
curl --request GET \
--url https://api.launchmystore.io/apps/installations/{installationId}/settings \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.launchmystore.io/apps/installations/{installationId}/settings"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.launchmystore.io/apps/installations/{installationId}/settings', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.launchmystore.io/apps/installations/{installationId}/settings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.launchmystore.io/apps/installations/{installationId}/settings"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.launchmystore.io/apps/installations/{installationId}/settings")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.launchmystore.io/apps/installations/{installationId}/settings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"status": 123,
"state": "<string>",
"data.settings": {}
}App Settings
Get App Settings
Read a single app installation’s per-merchant settings bag.
GET
/
apps
/
installations
/
{installationId}
/
settings
Get App Settings
curl --request GET \
--url https://api.launchmystore.io/apps/installations/{installationId}/settings \
--header 'Authorization: Bearer <token>'import requests
url = "https://api.launchmystore.io/apps/installations/{installationId}/settings"
headers = {"Authorization": "Bearer <token>"}
response = requests.get(url, headers=headers)
print(response.text)const options = {method: 'GET', headers: {Authorization: 'Bearer <token>'}};
fetch('https://api.launchmystore.io/apps/installations/{installationId}/settings', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));<?php
$curl = curl_init();
curl_setopt_array($curl, [
CURLOPT_URL => "https://api.launchmystore.io/apps/installations/{installationId}/settings",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_ENCODING => "",
CURLOPT_MAXREDIRS => 10,
CURLOPT_TIMEOUT => 30,
CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
CURLOPT_CUSTOMREQUEST => "GET",
CURLOPT_HTTPHEADER => [
"Authorization: Bearer <token>"
],
]);
$response = curl_exec($curl);
$err = curl_error($curl);
curl_close($curl);
if ($err) {
echo "cURL Error #:" . $err;
} else {
echo $response;
}package main
import (
"fmt"
"net/http"
"io"
)
func main() {
url := "https://api.launchmystore.io/apps/installations/{installationId}/settings"
req, _ := http.NewRequest("GET", url, nil)
req.Header.Add("Authorization", "Bearer <token>")
res, _ := http.DefaultClient.Do(req)
defer res.Body.Close()
body, _ := io.ReadAll(res.Body)
fmt.Println(string(body))
}HttpResponse<String> response = Unirest.get("https://api.launchmystore.io/apps/installations/{installationId}/settings")
.header("Authorization", "Bearer <token>")
.asString();require 'uri'
require 'net/http'
url = URI("https://api.launchmystore.io/apps/installations/{installationId}/settings")
http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true
request = Net::HTTP::Get.new(url)
request["Authorization"] = 'Bearer <token>'
response = http.request(request)
puts response.read_body{
"status": 123,
"state": "<string>",
"data.settings": {}
}Every installed app has a private settings bag scoped to one merchant
installation. It persists per-store configuration — feature toggles, default
templates, values the merchant entered into the app’s settings UI, etc. —
without the app standing up its own database.
The settings bag is a single JSON object stored on the installation:
No query parameters.
If the installation does not exist (or is not on the caller’s store), the
endpoint returns the error envelope:
To prepopulate settings, write them via
Update App Settings. Only keys declared
in the app’s settings schema can be written.
- Values can be any JSON type. The shape is the app’s own concern.
- Stored per installation — each (app, store) pair has its own bag.
- A fresh install that has never been written returns an empty object
{}.
MERCHANT or STAFF_ADMIN role). The
storeId is resolved from the token and the installation is looked up by the
:installationId path param scoped to that store — a merchant can only read
the settings of installations on their own store.
This is a merchant/admin endpoint, not an app-facing OAuth endpoint.
There is no
read_settings_own scope and no per-installation settings route
under /api/v1. The only /api/v1 settings endpoints are store-level
(storefront config — name, country, payment providers); see
Get settings.The settings bag is NOT a secrets vault. Values are readable by the
merchant (and their admin staff) through the dashboard, and settings wired
to storefront blocks render into public Liquid output. Never store provider
credentials (OpenAI keys, database URLs, signing secrets, etc.) here — keep
them in your own hosting environment’s secret manager. Your app’s backend
runs on your infrastructure; LaunchMyStore never hosts or executes your
server code, so server-side secrets never need to touch the platform.
Request
string
required
UUID of the app installation whose settings bag you want to read.
curl -X GET "https://api.launchmystore.io/apps/installations/<INSTALLATION_ID>/settings" \
-H "Authorization: Bearer <MERCHANT_JWT>"
Response
Responses use the standard platform envelope (status / state / message
/ data). The settings bag is returned under data.settings.
integer
HTTP status code (
200 on success).string
"success" or "error".object
The settings bag. Empty object
{} for fresh installs that have never
written anything.Example response
{
"status": 200,
"state": "success",
"message": null,
"data": {
"settings": {
"enabled": true,
"default_currency": "USD",
"free_shipping_min": 5000
}
},
"count": null,
"pagination": null
}
{
"status": 404,
"state": "error",
"message": "Installation not found",
"data": null
}
Reading specific keys
There is no per-key endpoint — fetch the bag and read the keys you need client-side.Defaults
If a key has never been written, it is absent fromdata.settings — not
returned as null. Set defaults in your own code when reading:
const { settings } = (await getInstallationSettings()).data;
const enabled = settings.enabled ?? true;
const minSpend = settings.free_shipping_min ?? 5000;
Error codes
| Code | Description |
|---|---|
401 | Missing or invalid merchant JWT. |
404 | No installation with this installationId on the caller’s store. |