Support & Deletion Pages
Configure support and data deletion pages via the OrbitKit API.
Apple requires that apps provide a support page URL and (for apps with user accounts) a data deletion page URL in App Store Connect. These endpoints let you configure the content of both pages.
Endpoints
| Method | Path | Description |
|---|---|---|
| GET | /api/apps/:appId/support-page |
Get support page |
| PUT | /api/apps/:appId/support-page |
Save support page |
| GET | /api/apps/:appId/deletion-page |
Get data deletion page |
| PUT | /api/apps/:appId/deletion-page |
Save data deletion page |
Get support page
GET /api/apps/:appId/support-page
Response
{
"contactEmail": "support@myapp.com",
"contactPhone": "+1-555-0100",
"contactUrl": "https://myapp.com/help",
"contactAddress": {
"street": "123 Main St",
"city": "City",
"state": "ST",
"zip": "12345",
"country": "US"
},
"supportHours": {
"from": "09:00",
"to": "17:00",
"timezone": "America/New_York",
"days": "Mon-Fri"
},
"faqItems": [
{
"question": "How do I reset my password?",
"answer": "Go to Settings > Account > Reset Password."
}
],
"additionalInfo": "Response times may be longer on holidays.",
"updatedAt": 1712345678000
}
Returns 404 NOT_FOUND if no support page is configured.
Save support page
PUT /api/apps/:appId/support-page
Request body
| Field | Type | Required | Description |
|---|---|---|---|
contactEmail |
string | Yes | Support email (max 320) |
contactPhone |
string | No | Phone number (max 50) |
contactUrl |
string | No | Support website URL (max 500, must start with http/https) |
contactAddress |
object | No | Mailing address |
contactAddress.street |
string | No | Street address (max 200) |
contactAddress.city |
string | No | City (max 100) |
contactAddress.state |
string | No | State/province (max 100) |
contactAddress.zip |
string | No | ZIP/postal code (max 20) |
contactAddress.country |
string | No | Country (max 100) |
supportHours |
object | No | Business hours |
supportHours.from |
string | No | Opening time in HH:MM format |
supportHours.to |
string | No | Closing time in HH:MM format |
supportHours.timezone |
string | No | IANA timezone (max 50) |
supportHours.days |
string | No | Days of operation (max 100) |
faqItems |
array | No | FAQ entries (max 20 items) |
faqItems[].question |
string | Yes | Question text (1–500 chars) |
faqItems[].answer |
string | Yes | Answer text (1–2000 chars) |
additionalInfo |
string | No | Extra info (max 2000) |
Full example
curl -X PUT https://api.orbitkit.io/api/apps/-NtestApp123/support-page \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"contactEmail": "support@myapp.com",
"contactAddress": {
"street": "123 Main St",
"city": "San Francisco",
"state": "CA",
"zip": "94105",
"country": "US"
},
"supportHours": {
"from": "09:00",
"to": "17:00",
"timezone": "America/Los_Angeles",
"days": "Mon-Fri"
},
"faqItems": [
{
"question": "How do I reset my password?",
"answer": "Go to Settings > Account > Reset Password."
}
]
}'
struct SupportPage: Codable {
let contactEmail: String
var contactPhone: String?
var contactAddress: ContactAddress?
var supportHours: SupportHours?
var faqItems: [FaqItem]?
struct ContactAddress: Codable {
var street: String?
var city: String?
var state: String?
var zip: String?
var country: String?
}
struct SupportHours: Codable {
var from: String? // "HH:MM"
var to: String? // "HH:MM"
var timezone: String?
var days: String?
}
struct FaqItem: Codable {
let question: String
let answer: String
}
}
let supportPage = SupportPage(
contactEmail: "support@myapp.com",
contactAddress: .init(street: "123 Main St", city: "San Francisco", state: "CA", zip: "94105", country: "US"),
supportHours: .init(from: "09:00", to: "17:00", timezone: "America/Los_Angeles", days: "Mon-Fri"),
faqItems: [.init(question: "How do I reset my password?", answer: "Go to Settings > Account > Reset Password.")]
)
var request = URLRequest(url: URL(string: "https://api.orbitkit.io/api/apps/\(appId)/support-page")!)
request.httpMethod = "PUT"
request.setValue("Bearer \(token)", forHTTPHeaderField: "Authorization")
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
request.httpBody = try JSONEncoder().encode(supportPage)
let (data, _) = try await URLSession.shared.data(for: request)
const res = await fetch(`https://api.orbitkit.io/api/apps/${appId}/support-page`, {
method: "PUT",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
contactEmail: "support@myapp.com",
contactAddress: {
street: "123 Main St",
city: "San Francisco",
state: "CA",
zip: "94105",
country: "US",
},
supportHours: {
from: "09:00",
to: "17:00",
timezone: "America/Los_Angeles",
days: "Mon-Fri",
},
faqItems: [{ question: "How do I reset my password?", answer: "Go to Settings > Account > Reset Password." }],
}),
});
const savedPage = await res.json();
Response
Returns the saved support page object (same shape as GET response).
Get data deletion page
GET /api/apps/:appId/deletion-page
Response
{
"supportsAccounts": true,
"deletionMethods": ["in-app", "email"],
"deletionEmail": "delete@myapp.com",
"deletionUrl": "https://myapp.com/delete-account",
"deletionSteps": [
"Open the app and go to Settings",
"Tap 'Delete Account'",
"Confirm deletion"
],
"deletionTimeline": "Within 30 days",
"dataRetainedAfterDeletion": "Anonymized usage analytics may be retained.",
"additionalInfo": "",
"updatedAt": 1712345678000
}
Returns 404 NOT_FOUND if no deletion page is configured.
Save data deletion page
PUT /api/apps/:appId/deletion-page
Request body
| Field | Type | Required | Description |
|---|---|---|---|
supportsAccounts |
boolean | Yes | Whether the app supports user accounts |
deletionMethods |
array | No | Methods: "in-app", "email", "web-form" |
deletionEmail |
string | No | Email for deletion requests (max 320) |
deletionUrl |
string | No | URL for web-based deletion (max 500) |
deletionSteps |
array | No | Step-by-step instructions (max 10 items, 500 chars each) |
deletionTimeline |
string | No | How long deletion takes (max 200) |
dataRetainedAfterDeletion |
string | No | Data retained after deletion (max 2000) |
additionalInfo |
string | No | Extra info (max 2000) |
Response
Returns the saved deletion page object (same shape as GET response).