projects

Upload a project avatar

Changed on

Upload an image as the avatar of the project identified by idOrName. The request body is the raw bytes of a JPG, PNG, or SVG image; the Content-Type header must declare which. SVG payloads are sanitized and optimized server-side before storage. The final SHA-1 of the stored bytes becomes the project's avatar value. The actual upload pipeline (validation, sanitization, S3 write, conditional updateProject, and event emission) lives in the shared @api/project-avatar-upload helper so it can be reused by background workers.

post/v1/projects/{idOrName}/avatar

Request

  • Base URL: https://api.vercel.com
  • URL: https://api.vercel.com/v1/projects/{idOrName}/avatar
  • Auth: HTTP bearer

Path parameters

idOrNamestring required

The unique project identifier or the project name.

Query parameters

teamIdstring
Example:team_1a2b3c4d5e6f7g8h9i0j1k2l

The Team identifier to perform the request on behalf of.

slugstring
Example:my-team-url-slug

The Team slug to perform the request on behalf of.

Request body application/octet-stream

string binary required

Response

accountIdstring required
appliedCve55182Migrationfalse | true
autoAssignCustomDomainsfalse | true
autoAssignCustomDomainsUpdatedBystring
autoExposeSystemEnvsfalse | true
avatarstring nullable
avatarDarkModestring nullable
buildCommandstring nullable
commandForIgnoringBuildStepstring nullable
concurrencyBucketNamestring
connectBuildsEnabledfalse | true
connectConfigurationIdstring nullable
createdAtnumber
customerSupportCodeVisibilityfalse | true
devCommandstring nullable
directoryListingfalse | true required
enableAffectedProjectsDeploymentsfalse | true
enableExternalRewriteCachingfalse | true
enablePreviewFeedbackfalse | true | null nullable
enableProductionFeedbackfalse | true | null nullable
framework'actix-web' | 'angular' | 'ash' | 'astro' | 'axum' | 'blitzjs' | 'brunch' | 'bun' | 'container' | 'create-react-app' | 'django' | 'docusaurus' | 'docusaurus-2' | 'dojo' | 'eleventy' | 'elysia' | 'ember' | 'eve' | 'express' | 'factory-eve' | 'fastapi' | 'fasthtml' | 'fastify' | 'flask' | 'gatsby' | 'go' | 'gridsome' | 'h3' | 'hexo' | 'hono' | 'hugo' | 'hydrogen' | 'ionic-angular' | 'ionic-react' | 'jekyll' | 'koa' | 'mastra' | 'middleman' | 'nestjs' | 'nextjs' | 'nitro' | 'node' | 'nuxtjs' | 'parcel' | 'polymer' | 'preact' | 'python' | 'react-router' | 'redwoodjs' | 'remix' | 'ruby' | 'rust' | 'saber' | 'sanity' | 'sanity-v2' | 'sapper' | 'scully' | 'services' | 'solidstart' | 'solidstart-1' | 'stencil' | 'storybook' | 'svelte' | 'sveltekit' | 'sveltekit-1' | 'tanstack-start' | 'tanstack-start-lovable' | 'umijs' | 'vite' | 'vitepress' | 'vue' | 'vuepress' | 'xmcp' | 'zola' | 'null' nullable
gitForkProtectionfalse | true
gitLFSfalse | true
hasActiveBranchesfalse | true
hasDeploymentsfalse | true
idstring required
installCommandstring nullable
lastRollbackTargetobject nullable
livefalse | true
namestring required
nodeVersion'10.x' | '12.x' | '14.x' | '16.x' | '18.x' | '20.x' | '22.x' | '24.x' | '26.x' | '8.10.x' required
outputDirectorystring nullable
passiveConnectConfigurationIdstring nullable
pausedfalse | true
productionDeploymentsFastLanefalse | true
protectedSourcemapsfalse | true
protectionBypassobject
rootDirectorystring nullable
serverlessFunctionZeroConfigFailoverfalse | true
skewProtectionAllowedDomainsstring[]
skewProtectionBoundaryAtnumber
skewProtectionMaxAgenumber
skipGitConnectDuringLinkfalse | true
sourceFilesOutsideRootDirectoryfalse | true
targetsobject
tier'priority'
transferCompletedAtnumber
transferredFromAccountIdstring
transferStartedAtnumber
transferToAccountIdstring
updatedAtnumber
v0false | true
v0Createdfalse | true

Example response

{
  "crons": {
    "definitions": [
      {
        "host": "vercel.com",
        "path": "/api/crons/sync-something?hello=world",
        "schedule": "0 0 * * *"
      }
    ]
  },
  "rollingRelease": {
    "gate": {
      "checks": [
        {
          "excludePaths": [
            "/api/health"
          ],
          "excludeStatusCodes": [
            503
          ],
          "ingestWatermarkSeconds": 30,
          "significanceLevel": 0.05
        }
      ],
      "failureThreshold": 3,
      "windowSize": 5
    },
    "stages": [
      {
        "duration": 600,
        "targetPercentage": 25
      }
    ],
    "target": "production"
  }
}

Changes

    • breaking

      added subschema #2 to the response property oneOf list for the response status

    • info

      added the optional property / to the response with the status

    • info

      added the optional property / to the response with the status

    • info

      added the optional property / to the response with the status