OpenGov Record Attachments API

A Record can have attachments which either reference a Record Type Attachment or are ad-hoc. Each attachment can have one or more versions.

Operations 6

GET /v2/{community}/records/{recordID}/attachments List record attachments #
POST /v2/{community}/records/{recordID}/attachments Add a record attachment #
GET /v2/{community}/records/{recordID}/attachments/{attachmentID} Get record attachment #
DELETE /v2/{community}/records/{recordID}/attachments/{attachmentID} Remove a record attachment #
POST /v2/{community}/records/{recordID}/attachments/{attachmentID}/versions Create a new version of a record attachment #
DELETE /v2/{community}/records/{recordID}/attachments/{attachmentID}/versions/{fileID} Remove a record attachment version #

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/opengov-record-attachments-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

opengov-record-attachments-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  version: v2
  title: Permitting & Licensing Record Attachments API
  contact:
    name: OpenGov Permitting & Licensing API
    url: https://opengov.com
    email: developers@opengov.com
  description: The OpenGov Permitting & Licensing API provides programmatic access to Permitting & Licensing data and workflows.
  license:
    name: OpenGov Permitting & Licensing API
    url: https://opengov.com
servers:
- url: https://api.plce.opengov.com/plce
  description: Production
  x-og-envs:
  - production
  - staging
  - development
  - local
security:
- bearerAuth: []
- basicHttpAuthentication: []
- auth0Prod: []
- auth0Dev: []
tags:
- name: Record Attachments
  description: A Record can have attachments which either reference a Record Type Attachment or are ad-hoc. Each attachment can have one or more versions.
paths:
  /v2/{community}/records/{recordID}/attachments:
    parameters:
    - $ref: '#/paths/~1v2~1{community}~1approval-steps/parameters/0'
    - $ref: '#/paths/~1v2~1{community}~1records~1{recordID}~1additional-locations/get/parameters/1'
    get:
      summary: List record attachments
      description: 'List attachments on a record.

        ### Permissions Required

        `Record Read`'
      operationId: listRecordAttachments
      x-og-claims-required:
      - PLC_RECORD_READ
      tags:
      - Record Attachments
      responses:
        '200':
          description: Returns record attachments
          headers:
            X-RateLimit-Limit:
              $ref: '#/paths/~1v2~1{community}~1files/post/responses/201/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/paths/~1v2~1{community}~1files/post/responses/201/headers/X-RateLimit-Remaining'
          content:
            application/vnd.api+json:
              schema:
                type: object
                properties:
                  data:
                    type: array
                    items:
                      type: object
                      x-tags:
                      - Record Attachments
                      title: Record Attachment
                      required:
                      - type
                      - id
                      - attributes
                      properties:
                        id:
                          type: string
                          example: record-attachment-123456
                        type:
                          type: string
                          enum:
                          - recordAttachment
                          example: recordAttachment
                        attributes:
                          type: object
                          properties:
                            name:
                              type: string
                              description: Name of the attachment
                              example: Floor Plan Drawing
                            description:
                              type: string
                              description: Short description of the attachment.
                              example: Detailed floor plan showing room layouts and dimensions
                            required:
                              type: boolean
                              description: If the attachment is required at time of record submission.
                              example: true
                            orderNumber:
                              type: number
                              description: Represents the order that the attachment will appear when viewing the record.
                              example: 1
                            url:
                              type: string
                              format: uri-reference
                              description: Signed Url that is acessible for 24 hours.
                              example: https://storage.example.com/attachments/abc123?expires=1234567890
                            updatedAt:
                              $ref: '#/paths/~1v2~1{community}~1departments/get/responses/200/content/application~1vnd.api+json/schema/properties/data/items/properties/attributes/properties/updatedAt'
                            updatedBy:
                              $ref: '#/paths/~1v2~1{community}~1departments/get/responses/200/content/application~1vnd.api+json/schema/properties/data/items/properties/attributes/properties/updatedBy'
                        relationships:
                          type: object
                          properties:
                            record:
                              type: object
                              properties:
                                $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/200/content/application~1vnd.api+json/schema/properties/data/items/properties/relationships/properties/step/properties'
                              description: The related `Record`.
                            attachmentTemplate:
                              type: object
                              properties:
                                $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/200/content/application~1vnd.api+json/schema/properties/data/items/properties/relationships/properties/step/properties'
                              description: The related `Attachment Template`. If not included, the attachment is considered adhoc and not associated with any type of record configuration.
                            file:
                              type: object
                              properties:
                                $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/200/content/application~1vnd.api+json/schema/properties/data/items/properties/relationships/properties/step/properties'
                              description: The related `File`, which is the current version of the record attachment.
                            versions:
                              description: The versions of the record attachment, including the current version. Ordered from oldest to newest.
                              type: object
                              properties:
                                data:
                                  type: array
                                  items:
                                    type: object
                                    properties:
                                      $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/200/content/application~1vnd.api+json/schema/properties/data/items/properties/relationships/properties/step/properties/data/properties'
                                    required:
                                      $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/200/content/application~1vnd.api+json/schema/properties/data/items/properties/relationships/properties/step/properties/data/required'
                                  minItems: 0
                required:
                - data
        '400':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/400'
        '401':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/401'
        '403':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/403'
        '404':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/404'
        '406':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/406'
        '500':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/500'
    post:
      summary: Add a record attachment
      description: 'Associates a previously uploaded file with a record as an attachment.


        ##### Process

        1. First, upload your file using the Files API:

        - Use POST /files to get a pre-signed upload URL

        - Upload your file using the pre-signed URL

        - Keep the returned `fileID` for the next step

        2. Then use this endpoint to create the record attachment:

        - Provide the fileID to associate the file

        - The file will be cloned, creating an independent copy for this record


        ##### Attachment Types and Versioning

        Attachments can be either ad-hoc or template-based:


        Using `attachmentTemplateID`:

        - Associates the attachment with a specific template

        - If no attachment exists for this template, creates a new one


        ### Permissions Required

        `Record Write`'
      operationId: addRecordAttachment
      x-og-claims-required:
      - PLC_RECORD_WRITE
      tags:
      - Record Attachments
      parameters:
      - $ref: '#/paths/~1v2~1{community}~1approval-steps~1{approvalStepID}/patch/parameters/0'
      requestBody:
        content:
          application/vnd.api+json:
            schema:
              type: object
              required:
              - data
              properties:
                data:
                  type: object
                  required:
                  - type
                  - attributes
                  properties:
                    type:
                      type: string
                      enum:
                      - recordAttachment
                      example: recordAttachment
                    attributes:
                      type: object
                      required:
                      - fileID
                      properties:
                        fileID:
                          type: string
                          description: ID of a previously uploaded file
                          example: file-1000002
                        name:
                          type: string
                          description: Name of the attachment. If not provided, the file name will be used.
                          example: Structural Engineering Plans
                        description:
                          type: string
                          description: Short description of the attachment
                          example: Detailed structural engineering drawings for the main building foundation and framework
                        attachmentTemplateID:
                          type: string
                          description: 'Optional. When provided, associates the attachment with a template. If no attachment exists for this template on the record, creates a new one

                            '
                          example: attachment-template-1000004
        required: true
      responses:
        '201':
          description: Created
          headers:
            X-RateLimit-Limit:
              $ref: '#/paths/~1v2~1{community}~1files/post/responses/201/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/paths/~1v2~1{community}~1files/post/responses/201/headers/X-RateLimit-Remaining'
            Location:
              $ref: '#/paths/~1v2~1{community}~1inspection-events/post/responses/201/headers/Location'
          content:
            application/vnd.api+json:
              schema:
                type: object
                properties:
                  data:
                    type: object
                    x-tags:
                    - Record Attachments
                    title: Record Attachment
                    required:
                    - type
                    - id
                    - attributes
                    properties:
                      id:
                        type: string
                        example: record-attachment-123456
                      type:
                        type: string
                        enum:
                        - recordAttachment
                        example: recordAttachment
                      attributes:
                        type: object
                        properties:
                          name:
                            type: string
                            description: Name of the attachment
                            example: Floor Plan Drawing
                          description:
                            type: string
                            description: Short description of the attachment.
                            example: Detailed floor plan showing room layouts and dimensions
                          required:
                            type: boolean
                            description: If the attachment is required at time of record submission.
                            example: true
                          orderNumber:
                            type: number
                            description: Represents the order that the attachment will appear when viewing the record.
                            example: 1
                          url:
                            type: string
                            format: uri-reference
                            description: Signed Url that is acessible for 24 hours.
                            example: https://storage.example.com/attachments/abc123?expires=1234567890
                          updatedAt:
                            $ref: '#/paths/~1v2~1{community}~1departments/get/responses/200/content/application~1vnd.api+json/schema/properties/data/items/properties/attributes/properties/updatedAt'
                          updatedBy:
                            $ref: '#/paths/~1v2~1{community}~1departments/get/responses/200/content/application~1vnd.api+json/schema/properties/data/items/properties/attributes/properties/updatedBy'
                      relationships:
                        type: object
                        properties:
                          record:
                            $ref: '#/paths/~1v2~1{community}~1records~1{recordID}~1attachments/get/responses/200/content/application~1vnd.api+json/schema/properties/data/items/properties/relationships/properties/record'
                          attachmentTemplate:
                            $ref: '#/paths/~1v2~1{community}~1records~1{recordID}~1attachments/get/responses/200/content/application~1vnd.api+json/schema/properties/data/items/properties/relationships/properties/attachmentTemplate'
                          file:
                            $ref: '#/paths/~1v2~1{community}~1records~1{recordID}~1attachments/get/responses/200/content/application~1vnd.api+json/schema/properties/data/items/properties/relationships/properties/file'
                          versions:
                            description: The versions of the record attachment, including the current version. Ordered from oldest to newest.
                            type: object
                            properties:
                              data:
                                type: array
                                items:
                                  $ref: '#/paths/~1v2~1{community}~1records~1{recordID}~1attachments/get/responses/200/content/application~1vnd.api+json/schema/properties/data/items/properties/relationships/properties/versions/properties/data/items'
                                minItems: 0
                required:
                - data
        '400':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/400'
        '401':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/401'
        '403':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/403'
        '404':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/404'
        '406':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/406'
        '409':
          $ref: '#/paths/~1v2~1{community}~1approval-steps~1{approvalStepID}/patch/responses/409'
        '415':
          $ref: '#/paths/~1v2~1{community}~1approval-steps~1{approvalStepID}/patch/responses/415'
        '500':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/500'
  /v2/{community}/records/{recordID}/attachments/{attachmentID}:
    parameters:
    - $ref: '#/paths/~1v2~1{community}~1approval-steps/parameters/0'
    - $ref: '#/paths/~1v2~1{community}~1records~1{recordID}~1additional-locations/get/parameters/1'
    - name: attachmentID
      in: path
      description: ID of an attachment on a record
      required: true
      schema:
        type: string
    get:
      summary: Get record attachment
      description: 'Retrieve a record attachment by ID.

        ### Permissions Required

        `Record Read`'
      operationId: getRecordAttachment
      x-og-claims-required:
      - PLC_RECORD_READ
      tags:
      - Record Attachments
      responses:
        '200':
          description: Returns record attachments
          headers:
            X-RateLimit-Limit:
              $ref: '#/paths/~1v2~1{community}~1files/post/responses/201/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/paths/~1v2~1{community}~1files/post/responses/201/headers/X-RateLimit-Remaining'
          content:
            application/vnd.api+json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/paths/~1v2~1{community}~1records~1{recordID}~1attachments/get/responses/200/content/application~1vnd.api+json/schema/properties/data/items'
                required:
                - data
        '400':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/400'
        '401':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/401'
        '403':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/403'
        '404':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/404'
        '406':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/406'
        '500':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/500'
    delete:
      summary: Remove a record attachment
      description: 'Remove a record attachment.

        ### Permissions Required

        `Record Write`'
      operationId: removeRecordAttachment
      x-og-claims-required:
      - PLC_RECORD_WRITE
      tags:
      - Record Attachments
      responses:
        '204':
          description: Record attachment removed
          headers:
            X-RateLimit-Limit:
              $ref: '#/paths/~1v2~1{community}~1files/post/responses/201/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/paths/~1v2~1{community}~1files/post/responses/201/headers/X-RateLimit-Remaining'
        '400':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/400'
        '401':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/401'
        '403':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/403'
        '404':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/404'
        '406':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/406'
        '500':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/500'
  /v2/{community}/records/{recordID}/attachments/{attachmentID}/versions:
    parameters:
    - $ref: '#/paths/~1v2~1{community}~1approval-steps/parameters/0'
    - $ref: '#/paths/~1v2~1{community}~1records~1{recordID}~1additional-locations/get/parameters/1'
    - name: attachmentID
      in: path
      description: ID of an attachment on a record
      required: true
      schema:
        type: string
    post:
      summary: Create a new version of a record attachment
      description: 'Use this endpoint to create a new version of a record attachment.

        ##### Process

        1. On an existing record attachment:

        - Provide the `fileID` of the new file to associate with the record attachment

        - The new file will replace the current version of the record attachment

        - The previous version of the record attachment will be retained in the `versions` relationship


        ### Permissions Required

        `Record Write`'
      operationId: addRecordAttachmentVersion
      x-og-claims-required:
      - PLC_RECORD_WRITE
      tags:
      - Record Attachments
      parameters:
      - $ref: '#/paths/~1v2~1{community}~1approval-steps~1{approvalStepID}/patch/parameters/0'
      requestBody:
        content:
          application/vnd.api+json:
            schema:
              type: object
              required:
              - data
              properties:
                data:
                  type: object
                  required:
                  - type
                  - attributes
                  properties:
                    type:
                      type: string
                      enum:
                      - file
                      example: file
                    attributes:
                      type: object
                      required:
                      - fileID
                      properties:
                        fileID:
                          type: string
                          description: ID of a previously uploaded file
                          example: file-1000002
        required: true
      responses:
        '201':
          description: Created
          headers:
            X-RateLimit-Limit:
              $ref: '#/paths/~1v2~1{community}~1files/post/responses/201/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/paths/~1v2~1{community}~1files/post/responses/201/headers/X-RateLimit-Remaining'
          content:
            application/vnd.api+json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/paths/~1v2~1{community}~1records~1{recordID}~1attachments/get/responses/200/content/application~1vnd.api+json/schema/properties/data/items'
                required:
                - data
        '400':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/400'
        '401':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/401'
        '403':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/403'
        '404':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/404'
        '406':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/406'
        '500':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/500'
  /v2/{community}/records/{recordID}/attachments/{attachmentID}/versions/{fileID}:
    parameters:
    - $ref: '#/paths/~1v2~1{community}~1approval-steps/parameters/0'
    - $ref: '#/paths/~1v2~1{community}~1records~1{recordID}~1additional-locations/get/parameters/1'
    - $ref: '#/paths/~1v2~1{community}~1records~1{recordID}~1attachments~1{attachmentID}~1versions/parameters/2'
    - name: fileID
      in: path
      description: ID of a file
      required: true
      schema:
        type: string
    delete:
      summary: Remove a record attachment version
      description: 'Removes the specified file from the version history of a record attachment.

        ### Permissions Required

        `Record Write`'
      operationId: removeRecordAttachmentVersion
      x-og-claims-required:
      - PLC_RECORD_WRITE
      tags:
      - Record Attachments
      responses:
        '204':
          description: Record attachment version removed
          headers:
            X-RateLimit-Limit:
              $ref: '#/paths/~1v2~1{community}~1files/post/responses/201/headers/X-RateLimit-Limit'
            X-RateLimit-Remaining:
              $ref: '#/paths/~1v2~1{community}~1files/post/responses/201/headers/X-RateLimit-Remaining'
        '400':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/400'
        '401':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/401'
        '403':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/403'
        '404':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/404'
        '406':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/406'
        '500':
          $ref: '#/paths/~1v2~1{community}~1approval-steps/get/responses/500'
components:
  securitySchemes:
    basicHttpAuthentication:
      type: http
      scheme: basic
      description: 'Basic HTTP Authentication

        '
    bearerAuth:
      type: http
      scheme: bearer
      bearerFormat: JWT
      description: 'The OpenGov Permitting & Licensing API is authenticated using the OAuth2 Client Credentials flow. Access tokens are provided as a bearer token Authorization header in all API requests.

        To obtain an access token, you must have an OpenGov-provided Client ID and Client Secret.

        Access tokens are obtained by making a POST request to `https://accounts.viewpointcloud.com/oauth/token`

        '
    auth0Prod:
      type: openIdConnect
      openIdConnectUrl: https://accounts.viewpointcloud.com/.well-known/openid-configuration
      description: 'The OpenGov Permitting & Licensing API is authenticated using the OAuth2 Client Credentials flow. Access tokens are provided as a bearer token Authorization header in all API requests.

        To obtain an access token, you must have an OpenGov-provided Client ID and Client Secret.

        '
    auth0Dev:
      type: openIdConnect
      openIdConnectUrl: https://login.vpctest.com/.well-known/openid-configuration
      description: 'The OpenGov Permitting & Licensing API is authenticated using the OAuth2 Client Credentials flow. Access tokens are provided as a bearer token Authorization header in all API requests.

        To obtain an access token, you must have an OpenGov-provided Client ID and Client Secret.

        '
x-og-spec-id: plc-api-v2
x-og-claims:
  PLC_RECORD_READ: Record Read
  PLC_RECORD_WRITE: Record Write
  PLC_RECORD_ARCHIVE: Record Archive
  PLC_RECORD_STEP_READ: Workflow Read
  PLC_RECORD_STEP_CREATE: Workflow Write
  PLC_RECORD_STEP_UPDATE: Workflow Write
  PLC_RECORD_STEP_COMMENT_READ: Comment Read
  PLC_RECORD_STEP_COMMENT_WRITE: Comment Write
  PLC_USER_READ: User Read
  PLC_USER_WRITE: User Write
  PLC_RECORD_TYPE_READ: Record Type Read
  PLC_SYSTEM_CONFIG_READ: System Config Read
  PLC_LOCATION_READ: Location Read
  PLC_LOCATION_WRITE: Location Write
  PLC_PAYMENT_READ: Payment Read
  PLC_PAYMENT_WRITE: Payment Write
  PLC_FILE_READ: File Read
  PLC_FILE_WRITE: File Write
  PLC_ACTIVITY_LOG_READ: Activity Log Read
x-tagGroups:
- name: Records
  tags:
  - Record
  - Record Applicant
  - Record Guests
  - Record Primary Location
  - Record Additional Locations
  - Record Forms
  - Record Change Requests
  - Record Attachments
  - Record Workflow Steps
  - Record Workflow Step Comments
- name: Locations
  tags:
  - Locations
  - Location Flags
- name: Users
  tags:
  - Users
  - User Flags
- name: Approvals
  tags:
  - Approval Steps
- name: Documents
  tags:
  - Document Steps
  - Issued Documents
- name: Inspections
  tags:
  - Inspection Steps
  - Inspection Types
  - Inspection Events
  - Inspection Results
  - Checklist Results
- name: Payments
  tags:
  - Payment Steps
  - Fees
  - Transactions
  - Ledger Entries
- name: Projects
  tags:
  - Projects
- name: Files
  tags:
  - Files
- name: Configuration
  tags:
  - Organization
  - Departments
  - Record Types
  - Record Type Form
  - Record Type Attachments
  - Record Type Document Templates
  - Record Type Fees
  - Record Type Workflow
  - Inspection Type Templates
  - Checklist Templates
- name: Activity Logs
  tags:
  - Activity Logs