diff --git a/src/applications/harbormaster/artifact/HarbormasterArtifact.php b/src/applications/harbormaster/artifact/HarbormasterArtifact.php
--- a/src/applications/harbormaster/artifact/HarbormasterArtifact.php
+++ b/src/applications/harbormaster/artifact/HarbormasterArtifact.php
@@ -16,6 +16,10 @@
   abstract public function getArtifactParameterDescriptions();
   abstract public function willCreateArtifact(PhabricatorUser $actor);
 
+  public function readArtifactHTTPParameter($key, $value) {
+    return $value;
+  }
+
   public function validateArtifactData(array $artifact_data) {
     $artifact_spec = $this->getArtifactParameterSpecification();
     PhutilTypeSpec::checkMap($artifact_data, $artifact_spec);
diff --git a/src/applications/harbormaster/artifact/HarbormasterURIArtifact.php b/src/applications/harbormaster/artifact/HarbormasterURIArtifact.php
--- a/src/applications/harbormaster/artifact/HarbormasterURIArtifact.php
+++ b/src/applications/harbormaster/artifact/HarbormasterURIArtifact.php
@@ -27,6 +27,16 @@
     );
   }
 
+  public function readArtifactHTTPParameter($key, $value) {
+    // TODO: This is hacky and artifact parameters should be replaced more
+    // broadly, likely with EditFields. See T11887.
+    switch ($key) {
+      case 'ui.external':
+        return (bool)$value;
+    }
+    return $value;
+  }
+
   public function getArtifactParameterDescriptions() {
     return array(
       'uri' => pht('The URI to store.'),
diff --git a/src/applications/harbormaster/conduit/HarbormasterCreateArtifactConduitAPIMethod.php b/src/applications/harbormaster/conduit/HarbormasterCreateArtifactConduitAPIMethod.php
--- a/src/applications/harbormaster/conduit/HarbormasterCreateArtifactConduitAPIMethod.php
+++ b/src/applications/harbormaster/conduit/HarbormasterCreateArtifactConduitAPIMethod.php
@@ -115,11 +115,28 @@
           $build_target_phid));
     }
 
+    $artifact_type = $request->getValue('artifactType');
+
+    // Cast "artifactData" parameters to acceptable types if this request
+    // is submitting raw HTTP parameters. This is not ideal. See T11887 for
+    // discussion.
+    $artifact_data = $request->getValue('artifactData');
+    if (!$request->getIsStrictlyTyped()) {
+      $impl = HarbormasterArtifact::getArtifactType($artifact_type);
+      if ($impl) {
+        foreach ($artifact_data as $key => $value) {
+          $artifact_data[$key] = $impl->readArtifactHTTPParameter(
+            $key,
+            $value);
+        }
+      }
+    }
+
     $artifact = $build_target->createArtifact(
       $viewer,
       $request->getValue('artifactKey'),
-      $request->getValue('artifactType'),
-      $request->getValue('artifactData'));
+      $artifact_type,
+      $artifact_data);
 
     return array(
       'data' => $this->returnArtifactList(array($artifact)),