> ## Documentation Index
> Fetch the complete documentation index at: https://help.statisfy.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Patch Project

> Diff-update the project's standard fields.

v0 has no editable project-level fields, so any supplied key is rejected as ``not_editable``;
the endpoint exists so the contract is complete and standard-field writes slot in here later.



## OpenAPI

````yaml /api/portal-sdk.openapi.json patch /sdk/v1/projects/{project_id}
openapi: 3.1.0
info:
  title: Statisfy Portal SDK API
  description: >-
    Customer-facing portal APIs under `/sdk/v1`. Every call is authenticated
    with a minted **portal-session token** (bearer) plus your **publishable
    key**, and is scoped to the customer in the token — see the Portal SDK
    guide.
  version: v1
servers:
  - url: https://api.statisfy.app
    description: Production gateway
security:
  - portalSession: []
    publishableKey: []
paths:
  /sdk/v1/projects/{project_id}:
    patch:
      tags:
        - sdk
      summary: Patch Project
      description: >-
        Diff-update the project's standard fields.


        v0 has no editable project-level fields, so any supplied key is rejected
        as ``not_editable``;

        the endpoint exists so the contract is complete and standard-field
        writes slot in here later.
      operationId: patch_project_sdk_v1_projects__project_id__patch
      parameters:
        - name: project_id
          in: path
          required: true
          schema:
            type: string
            title: Project Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/SdkPatchRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SdkProjectResponse'
        '400':
          description: A supplied field is not editable or has an invalid value
        '401':
          description: Token is missing or not scoped to a portal customer
        '404':
          description: Project not found for this customer
        '422':
          description: Validation Error
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/HTTPValidationError'
components:
  schemas:
    SdkPatchRequest:
      properties:
        properties:
          additionalProperties: true
          type: object
          maxProperties: 32
          title: Properties
      type: object
      title: SdkPatchRequest
      description: >-
        Diff body for ``PATCH`` — only the changed canonical values.


        ``display`` is read-only and ignored if sent; the server writes
        ``properties`` only.
    SdkProjectResponse:
      properties:
        data:
          $ref: '#/components/schemas/SdkProjectData'
        meta:
          additionalProperties: true
          type: object
          title: Meta
      type: object
      required:
        - data
      title: SdkProjectResponse
      description: Envelope for the project read/update responses.
    HTTPValidationError:
      properties:
        detail:
          items:
            $ref: '#/components/schemas/ValidationError'
          type: array
          title: Detail
      type: object
      title: HTTPValidationError
    SdkProjectData:
      properties:
        id:
          type: string
          title: Id
        properties:
          additionalProperties: true
          type: object
          title: Properties
        display:
          additionalProperties:
            type: string
          type: object
          title: Display
        schema:
          items:
            $ref: '#/components/schemas/SdkFieldSchema'
          type: array
          title: Schema
        progress:
          $ref: '#/components/schemas/SdkProgress'
        tasks:
          items:
            $ref: '#/components/schemas/SdkTask'
          type: array
          title: Tasks
        tasks_schema:
          items:
            $ref: '#/components/schemas/SdkFieldSchema'
          type: array
          title: Tasks Schema
      type: object
      required:
        - id
      title: SdkProjectData
      description: >-
        The project payload: values + display + schema + ordered tasks +
        progress.
    ValidationError:
      properties:
        loc:
          items:
            anyOf:
              - type: string
              - type: integer
          type: array
          title: Location
        msg:
          type: string
          title: Message
        type:
          type: string
          title: Error Type
        input:
          title: Input
        ctx:
          type: object
          title: Context
      type: object
      required:
        - loc
        - msg
        - type
      title: ValidationError
    SdkFieldSchema:
      properties:
        key:
          type: string
          title: Key
        label:
          type: string
          title: Label
        type:
          type: string
          title: Type
        field_type:
          anyOf:
            - type: string
            - type: 'null'
          title: Field Type
        editable:
          type: boolean
          title: Editable
          default: false
        options:
          anyOf:
            - items:
                $ref: '#/components/schemas/SdkSelectOption'
              type: array
            - type: 'null'
          title: Options
      type: object
      required:
        - key
        - label
        - type
      title: SdkFieldSchema
      description: >-
        A field definition the portal uses to render + (optionally) edit a
        value.


        ``type`` is the simplified render type
        (``text|date|number|boolean|select``) that

        drives the input widget. ``field_type`` is the *granular* source type

        (``text|textarea|url|number|currency|float|percent|percent_ratio|date|datetime|

        boolean|pill|lifecycle_stage``) — several of these collapse onto one
        render

        ``type`` (e.g. currency/float/percent all render as ``number``), so
        consumers that

        need the exact underlying type (a currency symbol, a URL link, an
        end-to-end test

        asserting per-type coverage) read ``field_type`` while the widget reads
        ``type``.

        ``options`` is present only for ``select`` fields (the full option set).
    SdkProgress:
      properties:
        percent:
          anyOf:
            - type: integer
            - type: 'null'
          title: Percent
        completed:
          type: integer
          title: Completed
          default: 0
        total:
          type: integer
          title: Total
          default: 0
      type: object
      title: SdkProgress
      description: >-
        Server-computed completion meter over the project's milestones.


        ``percent`` is ``None`` when the project has no milestones (portal hides
        the meter).
    SdkTask:
      properties:
        id:
          type: string
          title: Id
        parent_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Parent Id
        is_milestone:
          type: boolean
          title: Is Milestone
          default: false
        status:
          anyOf:
            - type: string
            - type: 'null'
          title: Status
        step_status:
          type: string
          title: Step Status
          default: upcoming
        properties:
          additionalProperties: true
          type: object
          title: Properties
        display:
          additionalProperties:
            type: string
          type: object
          title: Display
      type: object
      required:
        - id
      title: SdkTask
      description: >-
        A task row: canonical ``status`` + normalized ``step_status`` +
        value/label maps.
    SdkSelectOption:
      properties:
        value:
          type: string
          title: Value
        label:
          type: string
          title: Label
        color:
          anyOf:
            - type: string
            - type: 'null'
          title: Color
      type: object
      required:
        - value
        - label
      title: SdkSelectOption
      description: >-
        One option of a picklist/select field: canonical ``value`` + human
        ``label`` (+ optional ``color``).


        ``color`` is the status's own ``TaskStatus.color_hex`` (a ``#RRGGBB``
        string), mirroring the

        web app's status pill. ``None`` for select fields that carry no
        per-option color.
  securitySchemes:
    portalSession:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: >-
        Minted portal-session JWT (see the Portal SDK guide for the token
        exchange).
    publishableKey:
      type: apiKey
      in: header
      name: X-Statisfy-Publishable-Key
      description: Your SDK publishable key.

````