Fund That Flip Attachment Upload API

The Attachment Upload API from Fund That Flip — 1 operation(s) for attachment upload.

Operations 1

POST /workspace/{workspace}/upload-intent Create Upload Intent #

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/fund-that-flip-attachment-upload-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

fund-that-flip-attachment-upload-api-openapi.yml Raw ↑
openapi: 3.2.0
info:
  title: FlipperForce Public Attachment Upload API
  version: 0.0.10
  description: '# FlipperForce Public API • Version 1


    ## How do I request an API key?'
servers:
- url: https://tools.flipperforce.com/api/v1
security:
- PublicApiBearerAuth: []
tags:
- name: Attachment Upload
paths:
  /workspace/{workspace}/upload-intent:
    post:
      operationId: v1.workspace.upload-intent.create
      description: 'Creating an Upload Intent is Step 1 in uploading files.


        Submit metadata about the file you intend to upload. The Response

        includes a Signed URL, HTTP Method, and HTTP Headers where your client

        will be temporarily authorized to upload the file. Use the Response data

        to construct a file upload request in Step 2.


        Step 2 is using the Signed URL, Method, and Headers from Step 1 to upload

        the file to file storage:


        ```

        x-amz-acl: private

        Content-MD5: rz1TrXzmoB4WmdeUde+CIQ==

        Content-Type: image/png

        ... above are example headers from an Upload Intent ...

        POST https://the-signed-url-here

        raw-binary-file-data-here

        ```


        Step 3 after uploading succeeds is to call the next API for the specific

        use case you uploaded the file. Each use case has its own API call where

        you must supply the `uuid` returned in Step 1, allowing Step 3 to find

        and reference the uploaded file:


        * Create a Project Receipt

        * Create a Photo Log Photo

        * Create a Project Update Photo


        ### Response from Signed URL: Response Codes


        | Code | Description |

        | - | - |

        | 200 OK | File successfully received and satisfied all validation checks. No body content. |

        | 400 Bad Request | Perhaps the uploaded file''s MD5 checksum did not match what was given in the Upload Intent. Retry by requesting a new Upload Intent and signed URL. |

        | 403 Forbidden | The signed URL has expired. Retry by request a new Upload Intent and signed URL. |


        ### Response from Signed URL


        The Signed URL response defaults to returning XML. If you want JSON,

        submit a header `Accept: application/json`.


        Example Error Response Body when the Content-MD5 header does not match

        what was submitted in the Request Body:


        ```

        {

        "Code": "BadDigest",

        "Message": "",

        "BucketName": "flipperforce-prod",

        "RequestId": "tx000007027848ea442f7f9-006839cfe7-1060947b4-nyc3c",

        "HostId": "1060947b4-nyc3c-nyc3-zg03"

        }

        ```'
      summary: Create Upload Intent
      tags:
      - Attachment Upload
      parameters:
      - name: workspace
        in: path
        required: true
        description: Workspace UUID
        schema:
          type: string
          format: uuid
      requestBody:
        required: true
        content:
          application/json:
            schema:
              type: object
              properties:
                upload_type:
                  description: '(Required) Specify how you intend to use the uploaded file.

                    The metadata submitted will be used to validate the file type

                    can be used for this use case. Accepted values:


                    * `photo-log-photo` - [Project Photo Log: Photo](/operations/v1.project.photo-log.create)

                    * `project-update-photo` - [Project Update: Photo](/operations/v1.project.updates.photos.create)

                    * `receipt` - [Project Receipt](/operations/v1.project.receipts.create)'
                  $ref: '#/components/schemas/AttachmentUploadIntentType'
                filename:
                  type: string
                  description: Name of the file, such as "IMG_1234.jpg"
                  maxLength: 1000
                checksum:
                  type: string
                  description: MD5 checksum of the file, such as "a763097058593e8ac1ba9d17de1155df"
                  pattern: ^[0-9a-fA-F]{32}$
                  minLength: 32
                  maxLength: 32
                mime_type:
                  type: string
                  description: 'IANA Media Type. Common types that are supported: image/jpeg,

                    image/png, image/gif, image/webp, image/heic, image/heif, image/avif'
                size:
                  type: integer
                  description: File size in bytes
                  minimum: 0
                  maximum: 0
              required:
              - filename
              - checksum
              - mime_type
              - size
      responses:
        '201':
          description: '`Upload Intent`'
          content:
            application/json:
              schema:
                type: object
                properties:
                  data:
                    $ref: '#/components/schemas/Upload_Intent'
                required:
                - data
        '422':
          $ref: '#/components/responses/ValidationException'
        '401':
          $ref: '#/components/responses/AuthenticationException'
        '403':
          description: When the authenticated User Account is forbidden from accessing the content or software features
          content:
            application/json:
              schema:
                type: object
                properties:
                  message:
                    type: string
                    description: Human-readable description of why access was not allowed
                  reason:
                    type:
                    - string
                    - 'null'
                    description: 'Machine-readable code for why access was not allowed. Possible values:

                      * `UNKNOWN` - Access Forbidden

                      * `UNSUPPORTED_CLIENT` - Unsupported client.

                      * `SUBSCRIPTION_MISSING` - A Subscription is required. Visit the application website to manage the Subscription.

                      * `SUBSCRIPTION_PAYMENT_DUE` - A paid Subscription is required. Visit the application website to manage the Subscription.

                      * `SUBSCRIPTION_PLAN_UNSUPPORTED_FEATURE` - The Subscription Plan does not support using this Software Feature.

                      * `FEATURE_ACCESS_DENIED` - Your account within this Workspace is not allowed to use this Software Feature. Contact the Workspace Owner to request access.

                      * `PROJECT_ACCESS_DENIED` - Your account is not allowed to access this Project. Contact the Workspace Owner to request access.

                      * `PROJECT_ARCHIVED` - This Project is Archived and cannot be accessed. You must restore this Project to Active Status to use it.

                      * `WORKSPACE_ACCESS_DENIED` - You do not have an account within this Workspace.

                      * `WORKSPACE_SELECTION_MISSING` - You must select a Workspace before making this request.

                      '
                    enum:
                    - UNKNOWN
                    - UNSUPPORTED_CLIENT
                    - SUBSCRIPTION_MISSING
                    - SUBSCRIPTION_PAYMENT_DUE
                    - SUBSCRIPTION_PLAN_UNSUPPORTED_FEATURE
                    - FEATURE_ACCESS_DENIED
                    - PROJECT_ACCESS_DENIED
                    - PROJECT_ARCHIVED
                    - WORKSPACE_ACCESS_DENIED
                    - WORKSPACE_SELECTION_MISSING
                    - null
components:
  responses:
    ValidationException:
      description: Validation error
      content:
        application/json:
          schema:
            type: object
            properties:
              message:
                type: string
                description: Errors overview.
              errors:
                type: object
                description: A detailed description of each field that failed validation.
                additionalProperties:
                  type: array
                  items:
                    type: string
            required:
            - message
            - errors
    AuthenticationException:
      description: Unauthenticated
      content:
        application/json:
          schema:
            type: object
            properties:
              message:
                type: string
                description: Error overview.
            required:
            - message
  schemas:
    Upload_Intent:
      type: object
      properties:
        uuid:
          type: string
          description: Upload Intent unique identifier
        expires_at:
          type: string
          description: 'Uploading a file to this URL will no longer be possible after

            this time.'
        url:
          type: string
          description: 'Signed URL where file contents must be submitted. Only valid for

            a limited amount of time, and only authorized for the file whose

            metadata was submitted.'
        method:
          type: string
          description: 'Signed URL requires using this HTTP method be used when

            submitting file contents. Such as PUT or POST.'
        headers:
          type: object
          description: 'HTTP headers that must be included when uploading the file to

            the included URL. Keys are HTTP header names, values are the

            header value to send.'
          additionalProperties:
            type: string
      required:
      - uuid
      - expires_at
      - url
      - method
      - headers
      title: Upload Intent
    AttachmentUploadIntentType:
      type: string
      description: 'Metadata for AttachmentUploadIntent to denote which type of file the intent was created for.

        '
      enum:
      - photo-log-photo
      - project-update-photo
      - receipt
      title: AttachmentUploadIntentType
  securitySchemes:
    PublicApiBearerAuth:
      type: http
      description: 'Use the Public API key provided by FlipperForce as a Bearer token. Send the key exactly as provided in the Authorization header: `Authorization: Bearer <api-key>`.'
      scheme: bearer
      bearerFormat: FlipperForce Public API key