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

# Get v1annotation schemas 1

> Get a schema config by name (latest live version, or a specific version) in the caller's organization.



## OpenAPI

````yaml /api-reference/openapi.yaml get /v1/annotation-schemas/{name}
openapi: 3.0.3
info:
  title: ''
  version: 0.0.1
servers: []
security:
  - bearerAuth: []
tags:
  - name: AnnotationSchemaService
    description: |-
      Org-scoped annotation-schema registry CRUD.

       Every RPC scopes to the caller's organization, derived from their credential; a request with no org
       scope is UNAUTHENTICATED. Registration runs a backward-compatibility check against the latest live
       version and REJECTS an incompatible change (FAILED_PRECONDITION). These endpoints are what the
       generated OpenAPI, SDKs, and CLI consume.
  - name: AnnotationService
    description: >-
      Typed annotation surface over the telemetry store: the annotate writes
      plus the one served
       annotation read every consumer shares. Organization scoping is enforced from request identity,
       not from the request body. Ingest of ordinary telemetry lives in TelemetryIngestService
       (telemetry.proto); the general event read surface lives in TelemetryQueryService (query.proto).
  - name: FeedbackService
    description: |-
      Product-feedback intake.

       The organization is derived from the caller's credential, never from the request body; a request with
       no org scope is UNAUTHENTICATED. Any org-scoped caller — a user session, a service key, or
       a sandbox-scoped credential — may submit feedback.
  - name: IdentityService
    description: Identity/health surface for the control-plane API.
  - name: MetaService
    description: Unauthenticated discovery surface for client-visible sibling service URLs.
  - name: ProjectService
    description: |-
      Org-scoped project CRUD.

       Every RPC scopes to the caller's organization, derived from their credential; a request with no org
       scope is UNAUTHENTICATED. These endpoints are what the generated OpenAPI, SDKs, and CLI consume.
  - name: RunService
    description: |-
      Org-scoped access to runs and their lineage.

       Every RPC scopes to the caller's organization, derived from their credential; a request with no org
       scope is UNAUTHENTICATED. These endpoints are what the generated OpenAPI, SDKs, and CLI consume.
  - name: SandboxService
    description: |-
      Org-scoped sandbox runtime API.

       The organization comes from the caller's credential. Org-scoped human and service credentials may
       use every route in their organization. A sandbox-scoped, lineage-confined credential may read its own
       sandbox and snapshot lineage and may exec or snapshot only that sandbox; it may not create,
       update, or delete sandboxes, delete snapshots, or exec into a sibling sandbox.

       State and verb rules are closed. Get and list serve every visible state. Failed and terminated
       rows remain available through GetSandbox for a server retention window, then return 404
       not_found. Update to stopped is accepted from ready or running and is idempotent from stopped;
       update to running wakes stopped and is idempotent from running. A wake racing an in-flight stop
       waits for stop to win before wake proceeds. Workspace growth is accepted only for a stable
       durable sandbox and is idempotent for the same target; lifecycle mutation and growth never
       overlap. An undurable snapshot, including one whose request timed out, fences growth and cannot
       be deleted because its seal may still publish a late receipt; repeat the same snapshot request
       (and idempotency key, if supplied) to resolve its outcome. Delete is accepted once for a
       nonterminal sandbox; a second delete returns 404
       not_found. Exec requires running and never wakes implicitly; any
       other non-quarantined state returns 409 sandbox_not_running. Snapshot is accepted from ready,
       running, or stopped; other non-quarantined states return 409 sandbox_not_ready. Every mutating
       verb on a quarantined sandbox returns 409 quarantined. A concurrent snapshot returns 409
       snapshot_in_progress.

       Every error uses the flat {code, message, request_id} envelope. Stable route codes are
       invalid_argument (400), not_found (404), idempotency_conflict, name_conflict, sandbox_not_running,
       sandbox_not_ready, quarantined, snapshot_in_progress, snapshot_in_use, and
       snapshot_not_restorable, workspace_shrink_unsupported, and operation_conflict (409),
       unsupported_capability (422), quota_exceeded (429; details.quota.metric names the limit —
       sandboxes.running, sandboxes.total, or sandboxes.workspace_capacity_gib), and unavailable
       (503). Exec transport failures use spawn_failed or sandbox_stopped and discard any partial
       output; both mean the command did not run. A command that WAS dispatched but whose outcome
       could not be read is never an error: it returns 200 with the indeterminate outcome, alongside
       whatever partial output was collected, as a timeout does.

       Capability-receipt observation has no route in this version and is explicitly NOTIMPL; it is not
       inferred from Sandbox fields.
  - name: SecretService
    description: |-
      Org-scoped sandbox-secret management.

       Every RPC scopes to the caller's organization, derived from their credential; a request with no org
       scope is UNAUTHENTICATED. Create/revoke/rotate require an owner/admin in the organization; these
       management RPCs never return the secret value.
  - name: TelemetryViewService
    description: >-
      Typed data-view surface over the telemetry store. Organization scoping is
      enforced from request
       identity, not from the request body. A data view's spec is the engine's `DataViewSpec` — a raw
       `Sql` `SELECT` — re-validated and compiled fresh on every run under the forced-organization
       safe-SQL gateway. The untrusted raw-SQL escape hatch is a separate `POST /v1/telemetry/sql`
       endpoint, intentionally kept off this typed wire.
  - name: UsageService
    description: Org-scoped product quota reads.
  - name: VolumeService
    description: |-
      Org-scoped volume CRUD.

       Every RPC scopes to the caller's organization, derived from their credential; a request with no org
       scope is UNAUTHENTICATED. These endpoints are what the generated OpenAPI, SDKs, and CLI consume.
  - name: WorkloadService
    description: |-
      Org-scoped workload registry management.

       The organization is derived from the caller's credential; a request with no org scope is
       UNAUTHENTICATED. Registering and reading workloads is open to any org member. Setting a launch
       ACL and deleting a workload are operator actions and require an owner or admin in the organization. A
       sandbox-scoped credential may not register, delete, or manage workloads.
paths:
  /v1/annotation-schemas/{name}:
    get:
      tags:
        - AnnotationSchemaService
      description: >-
        Get a schema config by name (latest live version, or a specific version)
        in the caller's organization.
      operationId: AnnotationSchemaService_GetAnnotationSchema
      parameters:
        - name: name
          in: path
          description: The schema name to fetch.
          required: true
          schema:
            type: string
        - name: version
          in: query
          description: >-
            The specific version to fetch. 0 (or omitted) means the latest live
            version.
          schema:
            type: string
      responses:
        '200':
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/GetAnnotationSchemaResponse'
        '429':
          $ref: '#/components/responses/RateLimited'
        default:
          $ref: '#/components/responses/Error'
components:
  schemas:
    GetAnnotationSchemaResponse:
      type: object
      properties:
        schema:
          allOf:
            - $ref: '#/components/schemas/AnnotationSchema'
          description: The requested config version.
    AnnotationSchema:
      type: object
      properties:
        id:
          type: string
          description: The config id.
        name:
          type: string
          description: >-
            The schema name — unique per org across versions (the registered
            name an annotation names).
        version:
          type: string
          description: >-
            The monotonic version within (org, name). The first registration is
            1.
        description:
          type: string
          description: An optional human-readable description.
        json_schema:
          type: string
          description: The JSON Schema document (draft 2020-12) as a JSON string.
        archived_at:
          type: string
          description: >-
            When the config was archived (RFC 3339), or empty if it is still
            live.
        created_at:
          type: string
          description: When the config version was created (RFC 3339).
        promoted_fields:
          type: array
          items:
            $ref: '#/components/schemas/PromotedField'
          description: >-
            The fields this schema promotes from the payload into typed columns,
            each with its server-assigned
             slot. Empty when the schema promotes nothing.
      description: >-
        One registered annotation-schema config: a single immutable, versioned
        row of the registry.
    ErrorBody:
      type: object
      required:
        - code
        - message
      properties:
        code:
          type: string
          description: Stable machine-readable error code in snake_case.
        message:
          type: string
          description: Human-readable description; clients must not parse it.
        details:
          $ref: '#/components/schemas/ErrorDetails'
        request_id:
          type: string
          description: Correlation id present on server faults.
    PromotedField:
      type: object
      properties:
        field:
          type: string
          description: >-
            The payload field name to promote (e.g. "score"). Must be a field
            the schema's payload carries.
        type:
          enum:
            - PROMOTED_TYPE_UNSPECIFIED
            - PROMOTED_TYPE_STR
            - PROMOTED_TYPE_F64
            - PROMOTED_TYPE_I64
            - PROMOTED_TYPE_BOOL
          type: string
          description: The storage type to lift the field into.
          format: enum
        identity:
          type: boolean
          description: >-
            Whether this field is part of the latest-wins supersession identity.
            The default supersession key
             is the annotated target plus the schema name; declaring identity fields refines it (e.g. mark an
             "annotator" field identity to keep the latest write per annotator). Identity fields must be
             promoted, since dedup partitions on the typed column.
        bloom:
          type: boolean
          description: >-
            Request a point-lookup bloom filter for this field (str only;
            default false). Useful for a
             high-cardinality promoted id queried by exact match.
        slot:
          type: string
          description: >-
            The server-assigned physical column the field binds to (read-only;
            ignored on a register request,
             populated on the stored/returned schema).
      description: >-
        One org-declared field promoted from the annotation payload into a typed
        column for
         filter/sort/join speed. Unpromoted fields stay queryable from the JSON payload. The set of
         promoted fields is part of the immutable schema version, and slot bindings are stable across
         versions: a field keeps its slot in every later version (its type is permanent), a newly
         promoted field takes a never-used slot, and a slot is never re-bound to a different field,
         so rows written under any version stay readable by field name.
    ErrorDetails:
      type: object
      properties:
        quota:
          $ref: '#/components/schemas/QuotaDetails'
    QuotaDetails:
      type: object
      required:
        - metric
        - limit
      properties:
        metric:
          type: string
        limit:
          type: integer
          format: uint64
        current:
          type: integer
          format: uint64
        reserved:
          type: integer
          format: uint64
        retry_after_seconds:
          type: integer
          format: uint64
  responses:
    RateLimited:
      description: A quota or rate-limit rejection.
      headers:
        Retry-After:
          description: Seconds to wait before retrying.
          schema:
            type: integer
            format: uint64
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorBody'
    Error:
      description: An error using the standard hiloop error envelope.
      headers:
        Retry-After:
          description: Seconds to wait before retrying.
          schema:
            type: integer
            format: uint64
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/ErrorBody'
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer
      description: Hiloop API key sent as an HTTP Bearer token.

````