Firma.dev Organization Seals API

Organization seal management: create, update, revoke, and erase seals applied to signing requests

Operations 9

GET /seals List organization seals #
POST /seals Create an organization seal #
GET /seals/{id} Get an organization seal #
PATCH /seals/{id} Update an organization seal #
DELETE /seals/{id} Revoke an organization seal #
GET /seals/{id}/image Get seal image #
DELETE /seals/{id}/erase Erase a seal lineage #
GET /seals/{id}/applications List seal applications #
GET /seals/{id}/access-log List seal access log #

Work with this as data

Every API here is available over the APIs.io API and to AI agents over MCP.

MCP server

One button, every client — Claude, Cursor, VS Code and the rest.

https://apis.io/mcp

Tools for apis

7 MCP tools reach this
  • find_apisBrowse and filter every API in the catalog.
  • get_api_artifactsOne API's artifacts, grouped by type.
  • get_openapiThe primary OpenAPI for this API.
  • find_similar_apisAPIs that look like this one.
  • apis_io_searchSTART HERE — APIs, providers and tags for one query, each with its total.
  • resolveTurn a domain, URL or GitHub org into the provider it belongs to.
  • find_cohortsEvery scored population of providers in the catalog.
All 92 tools →

Call it yourself

curl for this page
This API
curl "https://apis.io/api/v1/apis/firma-dev:firma-dev-organization-seals-api"
All apis
curl "https://apis.io/api/v1/apis?limit=25"

Discovery needs no key. Ratings and market analysis are Pro.

Get an API key

Free tier, no form to fill in. Signing in shares your email address with us — we store it to create your key and to recognise you if you sign in with another provider. See our Privacy Policy and Terms.

A second provider on the same verified email joins the account you already have.

OpenAPI Specification

firma-dev-organization-seals-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: Firma Partner Organization Seals API
  description: RESTful API for document signing and template management.
  version: 01.38.00
  contact:
    name: API Support
    url: https://firma.com/support
servers:
- url: https://api.firma.dev/functions/v1/signing-request-api
  description: Production API - Recommended (Current)
- url: https://api.firma.dev/api/v1
  description: Production API - Planned
security:
- ApiKeyAuth: []
tags:
- name: Organization Seals
  description: 'Organization seal management: create, update, revoke, and erase seals applied to signing requests'
paths:
  /seals:
    get:
      summary: List organization seals
      description: List organization seal heads for the company. Returns active (non-revoked, non-deleted) seal heads by default. Pass include_revoked=true to include revoked heads.
      tags:
      - Organization Seals
      operationId: listOrganizationSeals
      security:
      - ApiKeyAuth: []
      parameters:
      - name: include_revoked
        in: query
        schema:
          type: boolean
          default: false
        description: Include revoked seal heads in the response
      - name: workspace_id
        in: query
        schema:
          type: string
          format: uuid
        description: Filter seals by workspace scope
      responses:
        '200':
          description: Seal list retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  seals:
                    type: array
                    items:
                      $ref: '#/components/schemas/OrganizationSeal'
                required:
                - seals
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '429':
          $ref: '#/components/responses/RateLimitError'
    post:
      summary: Create an organization seal
      description: Create a new organization seal with an uploaded, typed, or drawn image. Company-scope seals require a protected API key.
      tags:
      - Organization Seals
      operationId: createOrganizationSeal
      security:
      - ApiKeyAuth: []
      requestBody:
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/OrganizationSealCreate'
      responses:
        '201':
          description: Seal created successfully
          headers:
            X-Firma-Deprecation:
              schema:
                type: string
              description: Present when the operation is available but will be moved to the primary API host in a future release. The value describes the timeline.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrganizationSeal'
        '400':
          $ref: '#/components/responses/ValidationError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '429':
          $ref: '#/components/responses/RateLimitError'
        '503':
          description: Seal image processing is unavailable on this host (SEAL_CREATION_DISABLED_EDGE). Retry against the primary API host.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: 'Conflict. Possible codes: SEAL_ALREADY_REVOKED, SEAL_ORDER_COLLISION, SEAL_ERASE_NOT_ELIGIBLE'
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  code:
                    $ref: '#/components/schemas/SealErrorCode'
  /seals/{id}:
    get:
      summary: Get an organization seal
      description: Retrieve a single organization seal by ID.
      tags:
      - Organization Seals
      operationId: getOrganizationSeal
      security:
      - ApiKeyAuth: []
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
          format: uuid
        description: Seal ID
      responses:
        '200':
          description: Seal retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrganizationSeal'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '429':
          $ref: '#/components/responses/RateLimitError'
    patch:
      summary: Update an organization seal
      description: Update a seal's name, display name, image, or default status. Image-changing updates create a new version (replace). Company-scope seals require a protected API key for mutations.
      tags:
      - Organization Seals
      operationId: updateOrganizationSeal
      security:
      - ApiKeyAuth: []
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
          format: uuid
        description: Seal ID
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                name:
                  type: string
                  maxLength: 120
                  description: New internal name
                display_name:
                  type: string
                  maxLength: 200
                  description: New display name (triggers image re-render)
                signatory_title:
                  type:
                  - string
                  - 'null'
                  maxLength: 200
                  description: New signatory title
                image:
                  type: string
                  description: New base64 PNG data URI
                typed:
                  type: object
                  properties:
                    text:
                      type: string
                    style:
                      type: string
                statement:
                  $ref: '#/components/schemas/SealStatement'
                is_default:
                  type: boolean
                  description: Set as default seal for its scope
      responses:
        '200':
          description: Seal updated successfully
          headers:
            X-Firma-Deprecation:
              schema:
                type: string
              description: Present when the operation is available but will be moved to the primary API host in a future release. The value describes the timeline.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/OrganizationSeal'
        '400':
          $ref: '#/components/responses/ValidationError'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '429':
          $ref: '#/components/responses/RateLimitError'
        '503':
          description: Seal image processing is unavailable on this host (SEAL_CREATION_DISABLED_EDGE). Retry against the primary API host.
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/Error'
        '409':
          description: 'Conflict. Possible codes: SEAL_ALREADY_REVOKED, SEAL_ORDER_COLLISION, SEAL_ERASE_NOT_ELIGIBLE'
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  code:
                    $ref: '#/components/schemas/SealErrorCode'
    delete:
      summary: Revoke an organization seal
      description: Revoke (soft-delete) a seal. Optionally stop pending signing requests that reference it. Company-scope seals require a protected API key.
      tags:
      - Organization Seals
      operationId: revokeOrganizationSeal
      security:
      - ApiKeyAuth: []
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
          format: uuid
        description: Seal ID
      - name: stop_pending
        in: query
        schema:
          type: boolean
          default: false
        description: Cancel pending signing requests referencing this seal
      responses:
        '200':
          description: Seal revoked successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  id:
                    type: string
                    format: uuid
                  lineage_id:
                    type: string
                    format: uuid
                    description: Shared across versions of the same seal
                  version:
                    type: integer
                    minimum: 1
                  companies_id:
                    type: string
                    format: uuid
                  companies_workspaces_id:
                    type:
                    - string
                    - 'null'
                    format: uuid
                    description: Null for company-scope seals
                  name:
                    type: string
                    maxLength: 120
                  display_name:
                    type: string
                    maxLength: 200
                  signatory_title:
                    type:
                    - string
                    - 'null'
                    maxLength: 200
                  kind:
                    type: string
                    enum:
                    - uploaded
                    - typed
                    - drawn
                  is_default:
                    type: integer
                    enum:
                    - 0
                    - 1
                    description: 1 if this is the default seal for its scope
                  statement_language:
                    type: string
                  statement_version:
                    type: integer
                    minimum: 1
                  signatory_name:
                    type: string
                    maxLength: 200
                  signatory_title_attested:
                    type:
                    - string
                    - 'null'
                    maxLength: 200
                  attested_at:
                    type: string
                    format: date-time
                  revoked_on:
                    type:
                    - string
                    - 'null'
                    format: date-time
                  created_at:
                    type: string
                    format: date-time
                  deleted:
                    type: integer
                    enum:
                    - 0
                    - 1
                  in_flight_requests:
                    type: integer
                    description: Number of in-flight signing requests that referenced this seal
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '429':
          $ref: '#/components/responses/RateLimitError'
        '409':
          description: 'Conflict. Possible codes: SEAL_ALREADY_REVOKED, SEAL_ORDER_COLLISION, SEAL_ERASE_NOT_ELIGIBLE'
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  code:
                    $ref: '#/components/schemas/SealErrorCode'
  /seals/{id}/image:
    get:
      summary: Get seal image
      description: Retrieve the seal's rendered PNG image as a base64 data URI. Rate limited to 60/min. Each retrieval is audit-logged.
      tags:
      - Organization Seals
      operationId: getOrganizationSealImage
      security:
      - ApiKeyAuth: []
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
          format: uuid
        description: Seal ID
      responses:
        '200':
          description: Seal image retrieved successfully
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/SealImage'
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '429':
          $ref: '#/components/responses/RateLimitError'
  /seals/{id}/erase:
    delete:
      summary: Erase a seal lineage
      description: Permanently erase all versions of a seal lineage. The seal must be revoked first. This is irreversible and removes all image data. Requires a protected API key.
      tags:
      - Organization Seals
      operationId: eraseOrganizationSealLineage
      security:
      - ApiKeyAuth: []
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
          format: uuid
        description: Seal ID (any version in the lineage)
      responses:
        '200':
          description: Seal lineage erased successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  lineage_id:
                    type: string
                    format: uuid
                  versions_erased:
                    type: integer
                    description: Number of versions erased
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '429':
          $ref: '#/components/responses/RateLimitError'
        '409':
          description: 'Conflict. Possible codes: SEAL_ALREADY_REVOKED, SEAL_ORDER_COLLISION, SEAL_ERASE_NOT_ELIGIBLE'
          content:
            application/json:
              schema:
                type: object
                properties:
                  error:
                    type: string
                  code:
                    $ref: '#/components/schemas/SealErrorCode'
  /seals/{id}/applications:
    get:
      summary: List seal applications
      description: List signing requests where this seal has been applied, is pending, or was paused.
      tags:
      - Organization Seals
      operationId: listOrganizationSealApplications
      security:
      - ApiKeyAuth: []
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
          format: uuid
        description: Seal ID
      - name: limit
        in: query
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 25
        description: Maximum results per page
      - name: cursor
        in: query
        schema:
          type: string
        description: Pagination cursor from a previous response
      responses:
        '200':
          description: Seal applications retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  applications:
                    type: array
                    items:
                      $ref: '#/components/schemas/SealApplication'
                  cursor:
                    type:
                    - string
                    - 'null'
                    description: Cursor for the next page, null if no more results
                required:
                - applications
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '429':
          $ref: '#/components/responses/RateLimitError'
  /seals/{id}/access-log:
    get:
      summary: List seal access log
      description: Retrieve the access log for a seal's lineage, including creation, replacement, revocation, rename, and image read events.
      tags:
      - Organization Seals
      operationId: listOrganizationSealAccessLog
      security:
      - ApiKeyAuth: []
      parameters:
      - name: id
        in: path
        required: true
        schema:
          type: string
          format: uuid
        description: Seal ID
      - name: limit
        in: query
        schema:
          type: integer
          minimum: 1
          maximum: 100
          default: 25
        description: Maximum results per page
      - name: cursor
        in: query
        schema:
          type: string
        description: Pagination cursor from a previous response
      responses:
        '200':
          description: Access log retrieved successfully
          content:
            application/json:
              schema:
                type: object
                properties:
                  entries:
                    type: array
                    items:
                      $ref: '#/components/schemas/SealAccessLogEntry'
                  cursor:
                    type:
                    - string
                    - 'null'
                    description: Cursor for the next page, null if no more results
                required:
                - entries
        '401':
          $ref: '#/components/responses/UnauthorizedError'
        '403':
          $ref: '#/components/responses/ForbiddenError'
        '404':
          $ref: '#/components/responses/NotFoundError'
        '429':
          $ref: '#/components/responses/RateLimitError'
components:
  responses:
    UnauthorizedError:
      description: Unauthorized - Invalid or missing API key
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Unauthorized
            message: Invalid API key
    ForbiddenError:
      description: Forbidden - Insufficient permissions
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Forbidden
            message: You do not have permission to access this resource
    ValidationError:
      description: Bad Request - Validation failed
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Validation Error
            message: Invalid input data
            details:
              name: Name is required
              email: Invalid email format
    RateLimitError:
      description: Too Many Requests - Rate limit exceeded
      headers:
        X-RateLimit-Limit:
          schema:
            type: integer
          description: Maximum requests per minute
        X-RateLimit-Remaining:
          schema:
            type: integer
          description: Requests remaining
        X-RateLimit-Reset:
          schema:
            type: integer
          description: Unix timestamp of reset
        Retry-After:
          schema:
            type: integer
          description: Seconds until retry allowed
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Rate Limit Exceeded
            message: Too many requests. Please wait before retrying.
            details:
              retry_after: 45
    NotFoundError:
      description: Not Found - Resource does not exist
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Error'
          example:
            error: Not Found
            message: The requested resource was not found
  schemas:
    OrganizationSeal:
      type: object
      description: Organization seal metadata (image and statement internals are stripped from list/get responses).
      properties:
        id:
          type: string
          format: uuid
        lineage_id:
          type: string
          format: uuid
          description: Shared across versions of the same seal
        version:
          type: integer
          minimum: 1
        companies_id:
          type: string
          format: uuid
        companies_workspaces_id:
          type:
          - string
          - 'null'
          format: uuid
          description: Null for company-scope seals
        authority_name:
          type:
          - string
          - 'null'
          description: 'The name the seal was attested for: the company for company scope or the protected workspace, otherwise the workspace. Null for seals whose lineage was created before pinning; they certify in the company''s current name.'
        name:
          type: string
          maxLength: 120
        display_name:
          type: string
          maxLength: 200
        signatory_title:
          type:
          - string
          - 'null'
          maxLength: 200
        kind:
          type: string
          enum:
          - uploaded
          - typed
          - drawn
        is_default:
          type: integer
          enum:
          - 0
          - 1
          description: 1 if this is the default seal for its scope
        statement_language:
          type: string
        statement_version:
          type: integer
          minimum: 1
        signatory_name:
          type: string
          maxLength: 200
        signatory_title_attested:
          type:
          - string
          - 'null'
          maxLength: 200
        attested_at:
          type: string
          format: date-time
        revoked_on:
          type:
          - string
          - 'null'
          format: date-time
        created_at:
          type: string
          format: date-time
        deleted:
          type: integer
          enum:
          - 0
          - 1
    OrganizationSealCreate:
      type: object
      required:
      - name
      - display_name
      - kind
      - scope
      - statement
      description: Request body to create an organization seal.
      properties:
        name:
          type: string
          maxLength: 120
          description: Internal name for the seal
        display_name:
          type: string
          maxLength: 200
          description: Display name rendered on the seal image
        signatory_title:
          type:
          - string
          - 'null'
          maxLength: 200
          description: Signatory title rendered on the seal image
        kind:
          type: string
          enum:
          - uploaded
          - typed
          - drawn
          description: How the seal image was created
        scope:
          type: string
          enum:
          - company
          - workspace
          description: Scope of the seal. Company-scope requires a protected API key.
        workspace_id:
          type: string
          format: uuid
          description: Required when scope is 'workspace'
        image:
          type: string
          description: Base64-encoded PNG data URI (data:image/png;base64,...). Required for 'uploaded' and 'drawn' kinds.
        typed:
          type: object
          description: Typed seal parameters. Required for 'typed' kind.
          properties:
            text:
              type: string
              description: Text to render on the seal
            style:
              type: string
              description: Style variant for the typed seal
        statement:
          $ref: '#/components/schemas/SealStatement'
        is_default:
          type: boolean
          default: false
          description: Set as default seal for this scope
    SealStatement:
      type: object
      required:
      - language
      - signatory_name
      - text
      - accepted
      description: Attestation statement affirming authority to apply the seal.
      properties:
        language:
          type: string
          description: Language code of the statement
        signatory_name:
          type: string
          maxLength: 200
          description: Name of the person attesting
        signatory_title:
          type:
          - string
          - 'null'
          maxLength: 200
          description: Title of the person attesting
        text:
          type: string
          description: On create, the statement rendered with the authority name (the stored workspace or company name exactly as returned by the API, including HTML escaping). On replace, it must equal the seal's stored statement text.
        accepted:
          type: boolean
          description: Must be true to confirm acceptance
        version:
          type: integer
          minimum: 1
          description: Statement version number
    SealAccessLogEntry:
      type: object
      description: Access log entry for a seal lineage.
      properties:
        id:
          type: string
          format: uuid
        organization_seals_id:
          type:
          - string
          - 'null'
          format: uuid
        lineage_id:
          type: string
          format: uuid
        action:
          type: string
          enum:
          - created
          - replaced
          - revoked
          - renamed
          - default_changed
          - erased
          - image_read
          - participant_swapped
        actor_kind:
          type: string
          enum:
          - user
          - api_key
          - system
        details:
          type:
          - object
          - 'null'
        created_at:
          type: string
          format: date-time
    Error:
      type: object
      properties:
        error:
          type: string
          description: Human-readable error message
        code:
          type: string
          description: 'Machine-readable error code Seal-related codes: SEALS_DISABLED, SEAL_ALREADY_REVOKED, SEAL_CREATION_DISABLED_EDGE, SEAL_ERASE_NOT_ELIGIBLE, SEAL_IMAGE_INVALID, SEAL_MUTATION_NOT_ALLOWED, SEAL_NOT_FOUND, SEAL_ORDER_COLLISION, SEAL_PAUSED, SEAL_SCOPE_FORBIDDEN, SEAL_UNAVAILABLE'
        errors:
          type: array
          description: All validation errors when multiple failures are reported together. The top-level error repeats the first item for backward compatibility.
          items:
            type: object
            required:
            - message
            properties:
              message:
                type: string
        message:
          type: string
          description: Detailed error description
        details:
          type: object
          description: Additional error details
          additionalProperties: true
      required:
      - error
      description: '


        Organization Seal error codes: SEALS_DISABLED, SEAL_ALREADY_REVOKED, SEAL_CREATION_DISABLED_EDGE, SEAL_ERASE_NOT_ELIGIBLE, SEAL_IMAGE_INVALID, SEAL_MUTATION_NOT_ALLOWED, SEAL_NOT_FOUND, SEAL_ORDER_COLLISION, SEAL_PAUSED, SEAL_SCOPE_FORBIDDEN, SEAL_UNAVAILABLE'
    SealErrorCode:
      type: string
      enum:
      - SEALS_DISABLED
      - SEAL_ALREADY_REVOKED
      - SEAL_CREATION_DISABLED_EDGE
      - SEAL_ERASE_NOT_ELIGIBLE
      - SEAL_IMAGE_INVALID
      - SEAL_MUTATION_NOT_ALLOWED
      - SEAL_NOT_FOUND
      - SEAL_ORDER_COLLISION
      - SEAL_PAUSED
      - SEAL_SCOPE_FORBIDDEN
      - SEAL_UNAVAILABLE
      description: Error codes specific to organization seal operations.
    SealImage:
      type: object
      description: Seal image response.
      properties:
        kind:
          type: string
          enum:
          - uploaded
          - typed
          - drawn
        content_type:
          type: string
          example: image/png
        data_url:
          type: string
          description: Base64-encoded PNG data URI
    SealApplication:
      type: object
      description: Record of a seal being applied to a signing request.
      properties:
        id:
          type: string
          format: uuid
        signing_request_id:
          type: string
          format: uuid
        signing_request_name:
          type: string
        seal_id:
          type: string
          format: uuid
        seal_name:
          type: string
        status:
          type: string
          enum:
          - applied
          - paused
          - pending
          description: Application status
        applied_at:
          type:
          - string
          - 'null'
          format: date-time
        created_at:
          type: string
          format: date-time
  securitySchemes:
    ApiKeyAuth:
      type: apiKey
      in: header
      name: Authorization
      description: API key for authentication. Use your API key directly without any prefix (e.g., 'your-api-key'). Bearer prefix is optional but not required.
x-provenance:
  method: harvested
  publisher: Firma.dev
  source: https://docs.firma.dev/api-reference/v01.38.00/openapi-v01.38.00.json
  note: split by refine-openapis from the provider's own published document, verified by fetch (openapi/_original/*.fetch.json);
    stamped by stamp-openapi-provenance.py (roadmap#793)