Connect an App Store Connect, Play Console or Apple Ads account (credentials are verified, then stored encrypted).
curl --request POST \
--url https://api.appgoat.ai/v1/connections \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"provider": "asc",
"label": "My ASC key",
"credentials": {
"issuer_id": "57246542-96fe-1a63-e053-0824d011072a",
"key_id": "2X9R4HXF34",
"private_key": "-----BEGIN PRIVATE KEY-----\n…\n-----END PRIVATE KEY-----"
},
"apps": [
"1234567890"
]
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
provider: 'asc',
label: 'My ASC key',
credentials: {
issuer_id: '57246542-96fe-1a63-e053-0824d011072a',
key_id: '2X9R4HXF34',
private_key: '-----BEGIN PRIVATE KEY-----\n…\n-----END PRIVATE KEY-----'
},
apps: ['1234567890']
})
};
fetch('https://api.appgoat.ai/v1/connections', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.appgoat.ai/v1/connections"
payload = {
"provider": "asc",
"label": "My ASC key",
"credentials": {
"issuer_id": "57246542-96fe-1a63-e053-0824d011072a",
"key_id": "2X9R4HXF34",
"private_key": "-----BEGIN PRIVATE KEY-----
…
-----END PRIVATE KEY-----"
},
"apps": ["1234567890"]
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"data": {
"id": "con_x8Hq2mXc0aLpQwRtYb",
"provider": "asc",
"label": "<string>",
"mode": "actions",
"status": "active",
"account": {},
"apps": [
{
"store": "apple",
"app_id": "<string>",
"external_id": "<string>",
"title": "<string>",
"bundle_id": "<string>"
}
],
"last_verified_at": "2023-11-07T05:31:56Z",
"last_error": "<string>",
"last_synced_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"available_apps": [
{
"store": "apple",
"app_id": "<string>",
"external_id": "<string>",
"title": "<string>",
"bundle_id": "<string>"
}
]
},
"meta": {
"credits_used": 123,
"credits_remaining": 123,
"request_id": "<string>",
"freshness": {
"fetched_at": "2023-11-07T05:31:56Z",
"age_seconds": 123,
"stale": true,
"refreshing": true,
"job_id": "<string>"
},
"next_cursor": "<string>",
"store": "apple",
"warnings": [
"<string>"
]
}
}{
"error": {
"code": "invalid_param",
"message": "limit must be ≤ 100",
"hint": "Fix the parameter and retry.",
"docs": "https://appgoat.ai/docs/errors#invalid_param",
"param": "limit"
}
}{
"error": {
"code": "invalid_param",
"message": "<string>",
"hint": "<string>",
"docs": "<string>",
"param": "<string>"
}
}{
"error": {
"code": "invalid_param",
"message": "<string>",
"hint": "<string>",
"docs": "<string>",
"param": "<string>"
}
}{
"error": {
"code": "invalid_param",
"message": "<string>",
"hint": "<string>",
"docs": "<string>",
"param": "<string>"
}
}Connections
Create connection
Credentials per provider (all are verified with one cheap read before anything is stored; they are encrypted with AES-256-GCM and never returned):
asc:{ issuer_id, key_id, private_key, vendor_number? }from App Store Connect → Users and Access → Integrations → App Store Connect API (role App Manager; Sales too for downloads/proceeds sync withvendor_numberfrom Payments and Financial Reports).appsdefaults to every app the key can see.play_console:{ service_account, reports_bucket? }= the Google Cloud service account JSON key, invited in Play Console → Users and permissions with View app information, Reply to reviews and Edit store listing.apps(package names) is required.reports_bucket(pubsite_prod_…) enables install stats.apple_ads:{ client_id, team_id, key_id, private_key, ad_account_id? }from Apple Ads → Account Settings → API for an API user with the API Account Manager role (Apple Ads Platform API;ad_account_idis needed when the user can access several ad accounts, the error lists them). Each linked app uses one of the plan’s connected apps (limits.connections; Free 1, read-only). The default mode isactions(read_onlyon Free).
POST
/
connections
Connect an App Store Connect, Play Console or Apple Ads account (credentials are verified, then stored encrypted).
curl --request POST \
--url https://api.appgoat.ai/v1/connections \
--header 'Content-Type: application/json' \
--header 'x-api-key: <api-key>' \
--data '
{
"provider": "asc",
"label": "My ASC key",
"credentials": {
"issuer_id": "57246542-96fe-1a63-e053-0824d011072a",
"key_id": "2X9R4HXF34",
"private_key": "-----BEGIN PRIVATE KEY-----\n…\n-----END PRIVATE KEY-----"
},
"apps": [
"1234567890"
]
}
'const options = {
method: 'POST',
headers: {'x-api-key': '<api-key>', 'Content-Type': 'application/json'},
body: JSON.stringify({
provider: 'asc',
label: 'My ASC key',
credentials: {
issuer_id: '57246542-96fe-1a63-e053-0824d011072a',
key_id: '2X9R4HXF34',
private_key: '-----BEGIN PRIVATE KEY-----\n…\n-----END PRIVATE KEY-----'
},
apps: ['1234567890']
})
};
fetch('https://api.appgoat.ai/v1/connections', options)
.then(res => res.json())
.then(res => console.log(res))
.catch(err => console.error(err));import requests
url = "https://api.appgoat.ai/v1/connections"
payload = {
"provider": "asc",
"label": "My ASC key",
"credentials": {
"issuer_id": "57246542-96fe-1a63-e053-0824d011072a",
"key_id": "2X9R4HXF34",
"private_key": "-----BEGIN PRIVATE KEY-----
…
-----END PRIVATE KEY-----"
},
"apps": ["1234567890"]
}
headers = {
"x-api-key": "<api-key>",
"Content-Type": "application/json"
}
response = requests.post(url, json=payload, headers=headers)
print(response.text){
"data": {
"id": "con_x8Hq2mXc0aLpQwRtYb",
"provider": "asc",
"label": "<string>",
"mode": "actions",
"status": "active",
"account": {},
"apps": [
{
"store": "apple",
"app_id": "<string>",
"external_id": "<string>",
"title": "<string>",
"bundle_id": "<string>"
}
],
"last_verified_at": "2023-11-07T05:31:56Z",
"last_error": "<string>",
"last_synced_at": "2023-11-07T05:31:56Z",
"created_at": "2023-11-07T05:31:56Z",
"available_apps": [
{
"store": "apple",
"app_id": "<string>",
"external_id": "<string>",
"title": "<string>",
"bundle_id": "<string>"
}
]
},
"meta": {
"credits_used": 123,
"credits_remaining": 123,
"request_id": "<string>",
"freshness": {
"fetched_at": "2023-11-07T05:31:56Z",
"age_seconds": 123,
"stale": true,
"refreshing": true,
"job_id": "<string>"
},
"next_cursor": "<string>",
"store": "apple",
"warnings": [
"<string>"
]
}
}{
"error": {
"code": "invalid_param",
"message": "limit must be ≤ 100",
"hint": "Fix the parameter and retry.",
"docs": "https://appgoat.ai/docs/errors#invalid_param",
"param": "limit"
}
}{
"error": {
"code": "invalid_param",
"message": "<string>",
"hint": "<string>",
"docs": "<string>",
"param": "<string>"
}
}{
"error": {
"code": "invalid_param",
"message": "<string>",
"hint": "<string>",
"docs": "<string>",
"param": "<string>"
}
}{
"error": {
"code": "invalid_param",
"message": "<string>",
"hint": "<string>",
"docs": "<string>",
"param": "<string>"
}
}Authorizations
Create a key at https://dash.appgoat.ai.
Body
application/json
asc = App Store Connect, play_console = Google Play Console, apple_ads = Apple Ads (Search Ads).
Available options:
asc, play_console, apple_ads See the description for the fields per provider.
Your name for it (default: provider + key / account).
Available options:
actions, read_only Apps to link: App Store ids / bundle ids (asc, apple_ads) or package names (play_console, required).