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

# Run (or re-run) developability analysis for a design

> Compute rule-based ADC developability analysis and persist it.

Pass ``structure_job_id`` to include SASA-based conjugation-site
accessibility analysis; omit it to run the sequence-only rules. The
result is persisted to ``adc_designs.analysis`` and also returned in
the response body — subsequent ``GET /v1/adc-designs/{id}`` calls
surface the cached analysis without re-running.

A foreign-org ``structure_job_id`` returns ``404`` before any
storage access — the service-role client can't be used to exfiltrate
another tenant's PDB bytes.

**Plan gate.** None today — analysis is cheap, rule-based, and free.
402 is declared on the spec because the /v1 OpenAPI regression pins
it on every POST, and future plan gates will surface as 402.

**Idempotency.** The idempotency middleware caches POST replays by
``Idempotency-Key`` header. Since the rule-based analysis is
deterministic given the design row + PDB, replaying under the same
key returns the cached response — consistent with the GET-side
``analysis`` column, which is written by this endpoint.

Cost: **write** — burns rate + quota. Does not debit credits.



## OpenAPI

````yaml /api-reference/openapi.json post /v1/adc-designs/{design_id}/analysis
openapi: 3.1.0
info:
  title: Kallima API
  description: >-
    Antibody design API — humanization, structure, stability, immunogenicity,
    complex prediction, and codon optimization.
  version: 0.1.0
servers: []
security: []
tags:
  - name: identity
    description: >-
      Caller identity and credit balance — use ``GET /v1/me`` to inspect the
      resolved org, plan, and compute budget before submitting jobs.
  - name: projects
    description: >-
      Projects — top-level containers for source antibodies and therapeutic
      candidates.
  - name: source-antibodies
    description: Source (parental) antibody sequences registered under a project.
  - name: variants
    description: >-
      Variants descended from a therapeutic candidate — the unit of work for
      pipelines.
  - name: jobs
    description: >-
      Long-running pipeline jobs: humanization, structure, stability,
      immunogenicity. Submit and poll. Deprecated in favor of
      resource-per-job-type endpoints (``humanizations`` and the other Phase 3
      resources); scheduled for removal in ``/v2``.
  - name: humanizations
    description: >-
      Humanization pipeline runs — typed submit body and typed per-strategy
      results. First of the Phase 3 resource-per-job-type endpoints; the generic
      ``/v1/jobs`` shape is deprecated in favor of this.
  - name: structure-predictions
    description: >-
      ImmuneBuilder structure predictions — typed submit body and typed PDB /
      pLDDT / CDR results. Phase 3 resource-per-job-type endpoint.
  - name: stability-analyses
    description: >-
      Stability analyses — typed submit body and typed thermostability /
      aggregation / developability scorecard. Phase 3 resource-per-job-type
      endpoint.
  - name: immunogenicity-analyses
    description: >-
      Immunogenicity analyses — typed submit body and typed MHC-I / MHC-II /
      B-cell epitope + risk-score results. Phase 3 resource-per-job-type
      endpoint.
  - name: uploads
    description: >-
      Presigned Supabase Storage slots for caller-supplied files (e.g. antigen
      PDBs for complex prediction). The API never proxies bytes — clients PUT
      directly to the returned URL.
  - name: antigens
    description: >-
      Target protein sequences scoped to a project — the docking partner in a
      complex prediction. Register once, reference by ``antigen_id`` at submit
      time.
  - name: complex-predictions
    description: >-
      Boltz-2 antibody-antigen complex predictions — typed submit body and typed
      docked-PDB / iptm / interface-residues results. Phase 3
      resource-per-job-type endpoint. Complex runs are long-running (~20–40 min
      on GPU); always poll, never hold the connection.
  - name: therapeutic-candidates
    description: >-
      Therapeutic candidates — the top-of-lineage object under a project.
      Creating one auto-creates a baseline variant (``v1``) and its chain rows
      atomically; pipelines submit against the variant. Junction endpoints
      manage many-to-many links to source antibodies and antigens.
  - name: adc-designs
    description: >-
      ADC (antibody-drug conjugate) designs — catalog records attaching a linker
      + payload + conjugation method to a therapeutic candidate. Run the
      rule-based developability analysis via ``POST
      /v1/adc-designs/{id}/analysis``; pass ``structure_job_id`` to include
      SASA-based conjugation-site accessibility.
  - name: codon-exports
    description: >-
      Codon optimization exports — submit a batch of jobs (one per variant),
      poll until ``variable_cds`` is populated, then download the assembled CDS
      as FASTA, CSV, or GenBank+ZIP. Requires the Structure plan or above.
  - name: webhooks
    description: >-
      Webhook endpoint registration — register HTTPS URLs to receive signed
      event deliveries when jobs complete or fail. Signing uses HMAC-SHA256; see
      ``POST /v1/webhooks`` for verification details.
  - name: webhook-deliveries
    description: >-
      Webhook delivery log — inspect past delivery attempts and manually retry
      failed ones via ``POST /v1/webhook_deliveries/{id}/retry``.
paths:
  /v1/adc-designs/{design_id}/analysis:
    post:
      tags:
        - adc-designs
      summary: Run (or re-run) developability analysis for a design
      description: |-
        Compute rule-based ADC developability analysis and persist it.

        Pass ``structure_job_id`` to include SASA-based conjugation-site
        accessibility analysis; omit it to run the sequence-only rules. The
        result is persisted to ``adc_designs.analysis`` and also returned in
        the response body — subsequent ``GET /v1/adc-designs/{id}`` calls
        surface the cached analysis without re-running.

        A foreign-org ``structure_job_id`` returns ``404`` before any
        storage access — the service-role client can't be used to exfiltrate
        another tenant's PDB bytes.

        **Plan gate.** None today — analysis is cheap, rule-based, and free.
        402 is declared on the spec because the /v1 OpenAPI regression pins
        it on every POST, and future plan gates will surface as 402.

        **Idempotency.** The idempotency middleware caches POST replays by
        ``Idempotency-Key`` header. Since the rule-based analysis is
        deterministic given the design row + PDB, replaying under the same
        key returns the cached response — consistent with the GET-side
        ``analysis`` column, which is written by this endpoint.

        Cost: **write** — burns rate + quota. Does not debit credits.
      operationId: run_adc_analysis_v1_adc_designs__design_id__analysis_post
      parameters:
        - name: design_id
          in: path
          required: true
          schema:
            type: string
            format: uuid
            title: Design Id
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/AdcAnalysisRequest'
      responses:
        '200':
          description: Successful Response
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/AdcAnalysisResult'
        '400':
          description: Malformed request body or parameter.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '401':
          description: Missing or invalid API token.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '402':
          description: >-
            Payment required — insufficient credits or the caller's plan is
            below the required tier.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '404':
          description: Resource does not exist in the caller's organization.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '422':
          description: Request failed validation.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
        '429':
          description: >-
            Rate limit or monthly write quota exceeded. `Retry-After` holds the
            number of seconds until the next admitted request.
          content:
            application/problem+json:
              schema:
                $ref: '#/components/schemas/ProblemDetails'
          headers:
            Retry-After:
              description: Seconds until the caller may retry. Present on 429 responses.
              schema:
                type: integer
                minimum: 1
            X-RateLimit-Limit:
              description: Per-minute rate ceiling for this API token's plan.
              schema:
                type: integer
            X-RateLimit-Remaining:
              description: Requests remaining in the current rate window.
              schema:
                type: integer
            X-RateLimit-Reset:
              description: HTTP-date when the rate window resets.
              schema:
                type: string
                format: http-date
            X-Quota-Limit:
              description: Monthly write ceiling for this API token's plan.
              schema:
                type: integer
            X-Quota-Remaining:
              description: Writes remaining in the current monthly window.
              schema:
                type: integer
            X-Quota-Reset:
              description: >-
                HTTP-date when the monthly write quota resets (always the 1st of
                next month UTC).
              schema:
                type: string
                format: http-date
      security:
        - HTTPBearer: []
components:
  schemas:
    AdcAnalysisRequest:
      properties:
        structure_job_id:
          anyOf:
            - type: string
            - type: 'null'
          title: Structure Job Id
          description: >-
            Optional structure-prediction job whose PDB should be loaded for
            conjugation-site SASA analysis. Must belong to the caller's org;
            cross-org ids return ``404``. Omit to run sequence-only rule-based
            analysis.
          examples:
            - 33aabbcc-4455-6677-8899-0011aabbccdd
      type: object
      title: AdcAnalysisRequest
      description: Body for ``POST /v1/adc-designs/{id}/analysis``.
    AdcAnalysisResult:
      properties:
        linker:
          $ref: '#/components/schemas/LinkerAssessmentSchema'
        payload:
          $ref: '#/components/schemas/PayloadAssessmentSchema'
        conjugation:
          $ref: '#/components/schemas/ConjugationAssessmentSchema'
        overall_risk:
          type: string
          title: Overall Risk
        dar_mismatch_warning:
          anyOf:
            - type: string
            - type: 'null'
          title: Dar Mismatch Warning
        conjugation_sites:
          anyOf:
            - items:
                $ref: '#/components/schemas/ConjugationSiteSchema'
              type: array
            - type: 'null'
          title: Conjugation Sites
        summary:
          type: string
          title: Summary
      type: object
      required:
        - linker
        - payload
        - conjugation
        - overall_risk
        - dar_mismatch_warning
        - conjugation_sites
        - summary
      title: AdcAnalysisResult
    ProblemDetails:
      additionalProperties: true
      description: RFC 9457 problem+json body returned by every non-2xx response.
      example:
        code: insufficient_credits
        credit_balance: 0
        credit_cost: 1
        detail: Humanization costs 1 credit; balance is 0.
        instance: /v1/jobs
        request_id: req_01JBX6Y6ZK6N8Q7YJ0F5VX2C3D
        status: 402
        title: Insufficient credits
        type: https://docs.kallima.bio/errors/insufficient_credits
      properties:
        type:
          description: >-
            Stable URI identifying the error class. Dereferenceable at
            docs.kallima.bio/errors/{code}.
          examples:
            - https://docs.kallima.bio/errors/insufficient_credits
          title: Type
          type: string
        title:
          description: Short human-readable summary of the error class.
          examples:
            - Insufficient credits
          title: Title
          type: string
        status:
          description: HTTP status code. Matches the response status line.
          examples:
            - 402
          title: Status
          type: integer
        detail:
          description: Human-readable explanation with values substituted.
          examples:
            - Humanization costs 1 credit; balance is 0.
          title: Detail
          type: string
        instance:
          description: The specific request URI that failed.
          examples:
            - /v1/jobs
          title: Instance
          type: string
        code:
          description: >-
            Machine-readable short code. SDKs switch on this, not on `title`.
            See app.errors.ErrorCode for the full taxonomy.
          examples:
            - insufficient_credits
          title: Code
          type: string
        request_id:
          anyOf:
            - type: string
            - type: 'null'
          default: null
          description: ULID stamped on every request. Include when contacting support.
          examples:
            - req_01JBX6Y6ZK6N8Q7YJ0F5VX2C3D
          title: Request Id
      required:
        - type
        - title
        - status
        - detail
        - instance
        - code
      title: ProblemDetails
      type: object
    LinkerAssessmentSchema:
      properties:
        linker_name:
          type: string
          title: Linker Name
        linker_type:
          type: string
          title: Linker Type
        cleavable:
          type: boolean
          title: Cleavable
        release_trigger:
          type: string
          title: Release Trigger
        plasma_stability:
          type: string
          title: Plasma Stability
        bystander_effect:
          type: boolean
          title: Bystander Effect
        risk:
          type: string
          title: Risk
        warnings:
          items:
            type: string
          type: array
          title: Warnings
        notes:
          type: string
          title: Notes
      type: object
      required:
        - linker_name
        - linker_type
        - cleavable
        - release_trigger
        - plasma_stability
        - bystander_effect
        - risk
        - warnings
        - notes
      title: LinkerAssessmentSchema
    PayloadAssessmentSchema:
      properties:
        payload_name:
          type: string
          title: Payload Name
        payload_class:
          type: string
          title: Payload Class
        mechanism:
          type: string
          title: Mechanism
        clogp:
          anyOf:
            - type: number
            - type: 'null'
          title: Clogp
        aggregation_risk:
          type: string
          title: Aggregation Risk
        max_dar_tolerated:
          anyOf:
            - type: integer
            - type: 'null'
          title: Max Dar Tolerated
        notes:
          type: string
          title: Notes
      type: object
      required:
        - payload_name
        - payload_class
        - mechanism
        - clogp
        - aggregation_risk
        - max_dar_tolerated
        - notes
      title: PayloadAssessmentSchema
    ConjugationAssessmentSchema:
      properties:
        method:
          type: string
          title: Method
        dar_control:
          type: string
          title: Dar Control
        expected_dar:
          type: string
          title: Expected Dar
        site_heterogeneity:
          type: string
          title: Site Heterogeneity
        stability:
          type: string
          title: Stability
        notes:
          type: string
          title: Notes
      type: object
      required:
        - method
        - dar_control
        - expected_dar
        - site_heterogeneity
        - stability
        - notes
      title: ConjugationAssessmentSchema
    ConjugationSiteSchema:
      properties:
        residue:
          type: string
          title: Residue
        chain:
          type: string
          title: Chain
        position:
          type: integer
          title: Position
        residue_type:
          type: string
          title: Residue Type
        relative_sasa:
          type: number
          title: Relative Sasa
        accessible:
          type: boolean
          title: Accessible
        note:
          type: string
          title: Note
      type: object
      required:
        - residue
        - chain
        - position
        - residue_type
        - relative_sasa
        - accessible
        - note
      title: ConjugationSiteSchema
  securitySchemes:
    HTTPBearer:
      type: http
      scheme: bearer

````