Documentation

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).