Requires write_files access scope, write_themes access scope or write_images access scope.

Creates file assets using an external URL or for files that were previously uploaded using the stagedUploadsCreate mutation. These files are added to the Files page in Shopify admin.

Files are processed asynchronously. Some data is not available until processing is completed. Check fileStatus to know when the files are READY or FAILED. See the FileStatus for the complete set of possible fileStatus values.

To get a list of all files, use the files query.


List of new files to be created.


Was this section helpful?

The newly created files.

The list of errors that occurred from executing the mutation.


Was this section helpful?

Examples

Hide code
DescriptionCopy
mutation fileCreate($files: [FileCreateInput!]!) {
  fileCreate(files: $files) {
    files {
      id
      fileStatus
      alt
      createdAt
    }
  }
}
curl -X POST \
https://your-development-store.myshopify.com/admin/api/2024-01/graphql.json \
-H 'Content-Type: application/json' \
-H 'X-Shopify-Access-Token: {access_token}' \
-d '{
"query": "mutation fileCreate($files: [FileCreateInput!]!) { fileCreate(files: $files) { files { id fileStatus alt createdAt } } }",
 "variables": {
    "files": {
      "alt": "fallback text for a video",
      "contentType": "VIDEO",
      "originalSource": "https://snowdevil.myshopify.com/admin/tmp/files"
    }
  }
}'
const { admin } = await authenticate.admin(request);

const response = await admin.graphql(
  `#graphql
  mutation fileCreate($files: [FileCreateInput!]!) {
    fileCreate(files: $files) {
      files {
        id
        fileStatus
        alt
        createdAt
      }
    }
  }`,
  {
    variables: {
      "files": {
        "alt": "fallback text for a video",
        "contentType": "VIDEO",
        "originalSource": "https://snowdevil.myshopify.com/admin/tmp/files"
      }
    },
  },
);

const data = await response.json();
session = ShopifyAPI::Auth::Session.new(
  shop: "your-development-store.myshopify.com",
  access_token: access_token
)
client = ShopifyAPI::Clients::Graphql::Admin.new(
  session: session
)

query = <<~QUERY
  mutation fileCreate($files: [FileCreateInput!]!) {
    fileCreate(files: $files) {
      files {
        id
        fileStatus
        alt
        createdAt
      }
    }
  }
QUERY

variables = {
  "files": {
    "alt": "fallback text for a video",
    "contentType": "VIDEO",
    "originalSource": "https://snowdevil.myshopify.com/admin/tmp/files"
  }
}

response = client.query(query: query, variables: variables)
const client = new shopify.clients.Graphql({session});
const data = await client.query({
  data: {
    "query": `mutation fileCreate($files: [FileCreateInput!]!) {
      fileCreate(files: $files) {
        files {
          id
          fileStatus
          alt
          createdAt
        }
      }
    }`,
    "variables": {
      "files": {
        "alt": "fallback text for a video",
        "contentType": "VIDEO",
        "originalSource": "https://snowdevil.myshopify.com/admin/tmp/files"
      }
    },
  },
});
use Shopify\Clients\Graphql;

$client = new Graphql("your-development-store.myshopify.com", $accessToken);
$query = <<<QUERY
  mutation fileCreate($files: [FileCreateInput!]!) {
    fileCreate(files: $files) {
      files {
        id
        fileStatus
        alt
        createdAt
      }
    }
  }
QUERY;

$variables = [
  "files" => [
    "alt" => "fallback text for a video",
    "contentType" => "VIDEO",
    "originalSource" => "https://snowdevil.myshopify.com/admin/tmp/files",
  ],
];

$response = $client->query(["query" => $query, "variables" => $variables]);
Hide code
Input variables
Copy
{
  "files": {
    "alt": "fallback text for a video",
    "contentType": "VIDEO",
    "originalSource": "https://snowdevil.myshopify.com/admin/tmp/files"
  }
}
Hide code
Response
JSON
{
  "fileCreate": {
    "files": []
  }
}