---
title: "Upload a build for a 'Custom CI' integration"
method: POST
path: "/app/{appId}/integration/{integrationInstallationId}/build"
tags: ["app"]
---

# Upload a build for a 'Custom CI' integration

`POST /app/{appId}/integration/{integrationInstallationId}/build`

## Request

- Base URL: `https://upload-api.runway.team/v1`
- URL: `https://upload-api.runway.team/v1/app/{appId}/integration/{integrationInstallationId}/build`
- Auth: API key in header `X-API-Key`

Please note the unique upload server URL for this endpoint.

The binary file must be included in a 'file' field as form data. Please see below for an example `curl` request:

```
curl -X POST \
    -F "file=@example.ipa" \
    -F 'data={\"version\":\"1.2.3\",\"ciBuildInfo\":{\"buildIdentifier\":\"123\",\"status\":\"inProgress\",\"startedAt\":\"2022-03-02T01:15:00Z\",\"branch\":\"release-1.2.3\",\"commitHash\":\"abcdef\",\"integrationId\":\"custom-ci\",\"workflowData\":{\"workflowId\":\"123\"}}}}'  \
    -H "X-API-KEY:API-KEY" \
    https://upload-api.runway.team/v1/app/{appId}/integration/{integrationInstallationId}/build
```

## Path parameters

- `appId` string, required
- `integrationInstallationId` string, required

## Request body `multipart/form-data`

- object
  - `file` string, binary, required
  - `data` CustomCIBuildUploadRequestFormData, required
    - `version` string, required: The version string for the release the build is targeting
    - `ciBuildInfo` CIBuildRequestEntity, required
      - `buildIdentifier` string, required: The identifier/number of the build as set by the CI provider
      - `startedAt` string, date-time, required: The start date and time of the build
      - `finishedAt` string, date-time: The end date and time of the build. When passing build info as part of an artifact upload, this value should always be set.
      - `status` 'inProgress' | 'stopped' | 'success' | 'failure' | 'skipped', required: The status of the CI build. When passing build info as part of an artifact upload, this value should always be `success`.
      - `url` string: Your CI provider's url for the build
      - `commitHash` string, required: The full commit hash of that triggered the build
      - `commitMessage` string: The commit message associated with the commit hash that triggered the build
      - `commitAuthor` string: The author of the commit that triggered the build
      - `commitUrl` string: The url for the commit that triggered the build
      - `branch` string, required: The branch the build was triggered off of
      - `integrationId` 'appcenter-ci' | 'apple-ci' | 'azure-ci' | 'bitbucket-ci' | 'bitrise' | 'buildkite' | 'circleci' | 'codemagic' | 'generic-ci' | 'github-ci' | 'gitlab-ci' | 'jenkins' | 'travis' | 'custom-ci', required: Type of CI integration.
      - `workflowData` CIBuildWorkflowData
        - `workflowId` string, required: The ID of the workflow associated with the build
        - `workflowName` string, required: The name of the workflow associated with the build

## Response `200`

Successfully uploaded build

- CustomCIBuildEntity: The Custom CI build that was created or updated by the upload.
  - `ciBuild` object, required: The CI build, including the artifact that was just uploaded
    - `buildHash` string, required: A unique identifier for the build from a CI system, generated from the combination of integrationId and build identifier
    - `buildIdentifier` string, required: The identifier of the build as set by the integration provider
    - `integrationId` 'amazon' | 'apple' | 'google' | 'huawei' | 'samsung' | 'expo-eas' | 'appcenter-beta' | 'apple-beta' | 'google-beta' | 'firebase-beta' | 'runway-build-distro-beta' | 'appcenter-ci' | 'apple-ci' | 'azure-ci' | 'bitrise' | 'buildkite' | 'circleci' | 'codemagic' | 'generic-ci' | 'github-ci' | 'gitlab-ci' | 'jenkins' | 'travis' | 'launchdarkly' | 'optimizely' | 'statsig' | 'firebase-remote-config' | 'amplitude-experiment' | 'unleash' | 'asana' | 'azure-it' | 'jira' | 'linear' | 'pivotal' | 'shortcut' | 'monday' | 'slack' | 'microsoft-teams' | 'amplitude' | 'datadog-analytics' | 'mixpanel-analytics' | 'google-analytics' | 'apple-power-performance-metrics' | 'new-relic-analytics' | 'custom-analytics' | 'testrail' | 'qase' | 'testmo' | 'browserstack' | 'xray' | 'bugsnag' | 'firebase' | 'sentry' | 'embrace-stability-monitoring' | 'datadog-stability-monitoring' | 'dynatrace-stability-monitoring' | 'new-relic-stability-monitoring' | 'luciq-stability-monitoring' | 'luciq-analytics' | 'github-vcs-dist' | 'bitbucket' | 'github' | 'gitlab-vcs' | 'azure-vcs' | 'pagerduty-scheduling' | 'incident-io-scheduling' | 'opsgenie-scheduling' | 'crowdin' | 'lokalise' | 'jira-service-management-scheduling', required: The type of integration
    - `buildUrl` string, required: The URL to the build in the CI system
    - `buildStartedAt` string, date-time, required: The start date and time of the build
    - `buildFinishedAt` string, date-time: The end date and time of the build
    - `buildStatus` 'inProgress' | 'stopped' | 'success' | 'failure' | 'skipped', required: The status of the CI build. When passing build info as part of an artifact upload, this value should always be `success`.
    - `providerBuildStatusString` string: The status string displayed to the user from the provider
    - `commit` string, required: The commit hash that triggered the build
    - `commitMessage` string: The commit message associated with the commit hash that triggered the build
    - `commitAuthor` string: The author of the commit that triggered the build
    - `commitUrl` string: The URL to the commit in the version control system
    - `workflowName` string: The displayable name of the workflow
    - `branchName` string, required: The branch name the build was triggered from
    - `workflowRunIdOrCommaDelimitedIds` string: The workflow run ID(s) associated with this build. Can be a single ID or comma-delimited list of IDs
    - `artifacts` CustomCIBuildArtifact[]: The artifact stored for this upload
      - `artifactId` string, required: The id of the stored artifact. Pass it as `artifactId` to the step run latest-build download endpoint to select this artifact.
      - `fileName` string, required: The artifact file name
      - `size` integer, required: The artifact size in bytes
      - `downloadUrl` string: A link to download the artifact through the Runway web app; it requires a signed-in Runway session. For API access, use `GET /app/{appId}/integration/{integrationId}/build/{buildId}/download`.
      - `version` string: The release version the artifact belongs to
      - `workflowRunId` string: The CI workflow run id the artifact was produced by, if known
      - `originStepRunId` string: The step run that triggered the upload. Empty when it is not tied to a step run.
      - `binaryBuildDetails` object, nullable: Details parsed from the binary, when Runway can parse it
        - `artifactType` string: The binary type
        - `bundleName` string: The bundle id or package name
        - `versionString` string: The version parsed from the binary
        - `appName` string: The app name parsed from the binary
        - `buildIdentifier` string: The build number parsed from the binary
        - `provisioningProfile` object, nullable: The embedded provisioning profile (iOS only)
  - `associatedAppStoreBuild` CustomCIAssociatedAppStoreBuild
    - `id` string: The id of the app store build
    - `buildNumber` string: The app store build number
    - `uploadedAt` string, date-time: When the build was uploaded to the app store
    - `integrationId` 'amazon' | 'apple' | 'google' | 'huawei' | 'samsung' | 'expo-eas' | 'appcenter-beta' | 'apple-beta' | 'google-beta' | 'firebase-beta' | 'runway-build-distro-beta' | 'appcenter-ci' | 'apple-ci' | 'azure-ci' | 'bitrise' | 'buildkite' | 'circleci' | 'codemagic' | 'generic-ci' | 'github-ci' | 'gitlab-ci' | 'jenkins' | 'travis' | 'launchdarkly' | 'optimizely' | 'statsig' | 'firebase-remote-config' | 'amplitude-experiment' | 'unleash' | 'asana' | 'azure-it' | 'jira' | 'linear' | 'pivotal' | 'shortcut' | 'monday' | 'slack' | 'microsoft-teams' | 'amplitude' | 'datadog-analytics' | 'mixpanel-analytics' | 'google-analytics' | 'apple-power-performance-metrics' | 'new-relic-analytics' | 'custom-analytics' | 'testrail' | 'qase' | 'testmo' | 'browserstack' | 'xray' | 'bugsnag' | 'firebase' | 'sentry' | 'embrace-stability-monitoring' | 'datadog-stability-monitoring' | 'dynatrace-stability-monitoring' | 'new-relic-stability-monitoring' | 'luciq-stability-monitoring' | 'luciq-analytics' | 'github-vcs-dist' | 'bitbucket' | 'github' | 'gitlab-vcs' | 'azure-vcs' | 'pagerduty-scheduling' | 'incident-io-scheduling' | 'opsgenie-scheduling' | 'crowdin' | 'lokalise' | 'jira-service-management-scheduling': The type of integration
    - `type` string: The app store build type
    - `isProcessed` boolean: Whether the app store has finished processing the build
    - `isInternal` boolean: Whether the build is internal-only

## Other responses

- `404`: Resource not found response

---

[API](https://skmtc.dev/runway/apis/runway-rest-api.md) - [All operations](https://skmtc.dev/runway/apis/runway-rest-api/llms.txt) - [OpenAPI document](https://skmtc.dev/runway/apis/runway-rest-api/revisions/081109863a9a?raw)
