Arch Client API

REST API over HTTPS for Arch's alternative-investment administration platform. Provides read/write access to holdings, investing entities, issuing entities, offerings, activities, cash flows, tasks, tax documents, firms, lookthroughs, user roles and Addepar exports. Authenticated with a JWT bearer token obtained from client credentials; responses paginate as "Pages" and rate limits are signalled with IETF RateLimit-* response headers.

Documentation

Specifications

Other Resources

OpenAPI Specification

arch-labs-client-api-openapi.json Raw ↑
{
  "openapi": "3.0.0",
  "info": {
    "title": "Arch Client API",
    "version": "0.1.0",
    "description": "# Arch Client API Documentation\n\n## Getting Started\n\nTo get started, you need to request credentials from us at [api-support@arch.co](mailto:api-support@arch.co).\n\nWe'll send you a secret link with the following information\n- a Client ID\n- a Client Secret\n\n<table>\n\n<tr>\n<td>\n\n### Authentication\n\nTo authenticate, you'll need to make a POST request to the\n[`/client-api/auth/token`](#/Authentication/post_client_api_v0_auth_token) endpoint. Include your Client ID and Client Secret\nin the appropriate fields in the request body.\n\nUsing [curl](https://curl.se/), that request might look like this:\n\n**You should store and reuse this token for as long as it's valid.**\n\nYou can find the expiration time by decoding the [JWT](https://jwt.io/introduction), and checking the `exp` field, which is the expiration time represented as seconds since the Unix Epoch.\n\n</td>\n<td>\n\n```\nCLIENT_ID='<your client id>'\nCLIENT_SECRET='<your client secret>'\ncurl \\ \n  -X 'POST' \\\n  -H 'accept: application/json' \\\n  -H 'Content-Type: application/json' \\\n  -d \"{ \\\n    \\\"clientId\\\": \\\"$CLIENT_ID\\\", \\\n    \\\"clientSecret\\\": \\\"$CLIENT_SECRET\\\" \\\n  }\" \\\n  'https://arch.co/client-api/v0/auth/token'\n```\n\n</td>\n</tr>\n\n</table>\n\n\n<table>\n<tr>\n\n<td>\n\n### Querying\n\nOnce you have an access token, you can query the API as described below. The\nauthorization header should include your Access Token, prefixed by the word\n\"Bearer\". (e.g. `authorization: Bearer tokendata...`)\n\nHere's an example with curl.\n</td>\n\n<td>\n\n```\nACCESS_TOKEN='<access token from the previous step>'\ncurl -X 'GET' \\\n  'https://arch.co/client-api/v0/holdings' \\\n  -H 'accept: application/json' \\\n  -H \"authorization: Bearer $ACCESS_TOKEN\"\n```\n\n</td>\n\n</tr>\n</table>\n\n<table>\n<tr>\n<td>\n\n### Rate Limit\n\nThe Arch Client API is rate limited, measured in requests per minute. If you hit this limit, you will get an error 429 - Too Many Requests.\nTo address this, consider spacing out your requests.\n\nTo check your API user's rate limit status, view the response headers on an API request. The headers are as follows:\n\n* #### RateLimit-Policy\n  The max number of requests allowed over a specified window of time. Format: [number of requests];w=[window of time in seconds]\n\n* #### RateLimit-Limit\n  The max number of requests allowed over the current window of time. Format: [number of requests]\n\n* #### RateLimit-Remaining\n  The remaining number of requests that the user is allowed to make over the current window of time. Format: [number of requests]\n\n* #### RateLimit-Reset\n  The number of seconds remaining until the window of time resets. Format: [number of seconds]\n\n</tr>\n</td>\n</table>\n\n## Pages\n\nMany Arch objects can be returned in lists called Pages. By default, a Page\ncontains up to 25 objects. Some endpoints allow the user to increase the\nnumber of requested objects up to 1000.\n\n## Concepts\n\n<table>\n\n<tr>\n<td>\n\n### Users\nAn individual's personal access to Arch.\n\n### Accounts\nRepresents a collection of investments, which users are assigned to.\n\n### Holdings\n\nHoldings are investments, or any other piece of property (real estate, real assets, bank accounts, etc.). Each holding represents a\nrelationship between an Investing Entity and an Issuing Entity, where the\nInvesting Entity has invested in one of the Offerings that the Issuing Entity\noffers.\n\n  * #### Edge Cases\n    Sometimes, a holding may not directly represent one of your investments. For example, there might be a holding that contains tax documents related to a charitable contribution. Holdings aren't always direct investments as well, it's not uncommon to see a holding representing a Fund -> Fund investment.\n\n### Investing Entities\n\nThese are the entities that own holdings. Arch receives and processes investments on behalf of the Investing Entity.\n\n</td>\n<td>\n<img src=\"../static/images/user.png\" />\n</td>\n</tr>\n\n\n<tr>\n\n</tr>\n\n\n\n<tr>\n<td>\n\n### Issuing Entities\n\nThese are the entities that issue holdings, which you are investing in. They issue documents and updates that Arch receives and processes. Typically, an issuing entity is PE fund, Hedge Fund, etc. We also consider banks to be issuing entities who issue bank account holdings.\n\n  * #### Insights\n    Insights are third party data about issuing entites powered by our partner <a href=\"https://www.preqin.com\">Preqin</a>. Insights are accessible through the corresponding issuing entity.\n### Offerings\n\nThese represent the different investing opportunities that an Issuing Entity offers. For example, Uber might offer both a Seed round, and a later Series A round of investments. That would be a singular issuing entity (Uber), with two separate offerings (Seed, Series A).\n\n</td>\n<td>\n  <img src=\"../static/images/issuing.png\" />\n</td>\n</tr>\n\n<tr>\n\n<td>\n\n### Activities\n\nArch processes many types of documents and updates to your investments.\nCollectively, these updates are known as an \"Activity.\" Examples of activities\ninclude events like:\n- Account Statement Received\n- Capital Call Requested/Paid\n- Distribution Notice/Paid\n- Investor Letter\n\nWe process these activities and extract various finanicial facts about your activities. Examples of these finanical facts are:\n\n- Total Value (Capital Account)\n- Total Contribution\n- Total Distribution\n\n### Cash Flows\n\nThese represent money flowing into or out of your investments. For example, capital calls or distributions. One cash flow can be related to one or more activities.\nOne cashflow can also be related to one or more \"allocations.\" \n\nEach cash flow is also linked to one or more \"allocations,\" which represent the specific movement of money. An allocation has a specific type and describes an event initiated by the LP or GP. Each allocation has a direction: -1 (indicating cash flowing into the investment), 1 (indicating cash flowing out), or infrequently, 0 (no cash movement). The sum of the products of each allocation times its direction equals the total cash flow between the LP and the investment. These allocations can impact an investment's total value, contribution, remaining commitment, and distribution.\n\nTypes of allocations include:\n\n- Capital Calls\n- Expenses\n- Cash Distributions\n- Expenses\n\n#### Point in Time Valuation vs. Estimated Value\n\nPoint in time valuation and estimated value report the value of an investment at different times. Point in time valuation returns the value of an investment exactly as reported on the most recent statement, while estimated value starts with the most recent statement value and adjusts according to the capital calls that have occurred since the date of the most recent statement.\n\n### Tasks\n\nA specific investment related action that the user must complete. For example, confirming a new investment or verifying wire instructions.\n\n</td>\n<td>\n  <img src=\"../static/images/cashflow.png\" />\n</td>\n\n</tr>\n</table>\n\n<table>\n\n<td>\n\n### Lookthroughs\n\n**Premium Feature:** Arch can track and display the <u title=\"An SOI returns a list of your investments, including metrics such as number of shares, fair value, and liquidity.\">schedule of investments (SOI)</u> for any holdings you\nown. This allows you to \"look through\" the holdings you own to the\ninvestments that your holding made. This can make it easier to track your\n\"true\" exposure.\n\n### User Roles\n\nYou grant access to accounts, investing entities, and holdings with user roles. Each role grants a specific set of permissions.\n\n**Available role types for POST and DELETE requests:**\n- Full Access\n- Tax Only\n- Restricted Tax Only\n- View Only\n- File Only\n- Informed Tax Only\n- View Only with Task Completion\n- Restricted Investor\n- Investment Team\n\n**Note:** GET requests may return additional universal and custom role types beyond those listed above, depending on your Arch configuration.\n\nFor more information about permissions associated with roles, please refer to [Arch Permissions by User Type](https://intercom.help/archhelp/en/articles/8975969-arch-permissions-by-user-type).\n\n## Standards\n\n### Time Zone\n\nDates and times are in UTC unless otherwise specified.\n\n</td>\n\n</table>\n"
  },
  "servers": [
    {
      "url": "/"
    }
  ],
  "tags": [
    {
      "name": "Activities",
      "description": "Interact with Arch objects representing financial updates"
    },
    {
      "name": "Cash Flows",
      "description": "Read and write data relating to money inflow / outflow"
    },
    {
      "name": "Firms",
      "description": "Reference info about firms."
    },
    {
      "name": "Holdings",
      "description": "Read holding data and push new investments."
    },
    {
      "name": "Investing Entities",
      "description": "Read from and create new investing entities"
    },
    {
      "name": "Issuing Entities",
      "description": "Read from and create new issuing entities"
    },
    {
      "name": "Lookthroughs",
      "description": "Fetch data relating to the underling investments made by your own investments"
    },
    {
      "name": "Offerings",
      "description": "Get data on individual investment offering opportunities offered by your holdings"
    }
  ],
  "paths": {
    "/client-api/v0/accounts": {
      "get": {
        "summary": "Get all accounts for caller",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "description": "Returns the data for the specified account ids, if the user has access through the access token.",
        "tags": [
          "Accounts"
        ],
        "parameters": [
          {
            "name": "includeAddeparInfo",
            "in": "query",
            "description": "Include addepar account and entity info in the response",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/Account"
                  }
                }
              }
            }
          },
          "404": {
            "description": "Account id not found or is inaccessible to the user"
          },
          "500": {
            "description": "Internal server error."
          }
        }
      }
    },
    "/client-api/v0/accounts/{id}": {
      "get": {
        "summary": "Get data for a specific account",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "description": "Returns the data for a specific account, if the user has access through the access token.",
        "tags": [
          "Accounts"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "A specific account id to query for",
            "required": true,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "includeAddeparInfo",
            "in": "query",
            "description": "Include addepar account and entity info in the response",
            "required": false,
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Success",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Account"
                }
              }
            }
          },
          "404": {
            "description": "Account id not found or is inaccessible to the user"
          },
          "500": {
            "description": "Internal server error."
          }
        }
      }
    },
    "/client-api/v0/activities": {
      "get": {
        "operationId": "get-list-activities",
        "summary": "Get all activities accessible to the user",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "description": "Returns a list of all activities available to the user determined by the access token.",
        "tags": [
          "Activities"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "The number of activities to return",
            "schema": {
              "type": "integer",
              "default": 25,
              "maximum": 1000
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "The number of activities to skip before collecting results",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            }
          },
          {
            "name": "investingEntityIds",
            "example": "1,2,3,4",
            "in": "query",
            "description": "Will filter the output to only include activities belonging to one of the Investing Entity ids in the provided argument",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "issuingEntityIds",
            "example": "1,2,3,4",
            "in": "query",
            "description": "Will filter the output to only include activities belonging to one of the Issuing Entity ids in the provided argument",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "accountIds",
            "in": "query",
            "description": "Will filter the output to only include holdings relevant to one of the account ids in the provided argument",
            "example": "1,2,3,4",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "types",
            "schema": {
              "type": "string"
            },
            "example": "Investment Added,Account Statement",
            "in": "query",
            "description": "Will filter the output to only include activities with one of the types in the provided argument"
          },
          {
            "name": "beforeStatementDate",
            "in": "query",
            "description": "Filter the output for activities with a statement date before the queried timestamp.",
            "example": "2024-05-22T21:15:55.306Z",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "afterStatementDate",
            "in": "query",
            "description": "Filter the output for activities with a statement date after the queried date.",
            "example": "2024-05-22T21:15:55.306Z",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "beforeCreatedAt",
            "deprecated": true,
            "in": "query",
            "description": "Filter the output for activities with a creation time before the queried timestamp.",
            "example": "2024-05-22T21:15:55.306Z",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "afterCreatedAt",
            "deprecated": true,
            "in": "query",
            "description": "Filter the output for activities with a creation time after the queried timestamp.",
            "example": "2024-05-22T21:15:55.306Z",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "beforeDueAt",
            "in": "query",
            "description": "Filter the output for activities with a due time before the queried timestamp.",
            "example": "2024-05-22T21:15:55.306Z",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "afterDueAt",
            "in": "query",
            "description": "Filter the output for activities with a due time after the queried timestamp.",
            "example": "2024-05-22T21:15:55.306Z",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "beforeProcessedAt",
            "in": "query",
            "description": "Filter the output for activities with a processed time before the queried timestamp.",
            "example": "2024-05-22T21:15:55.306Z",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "afterProcessedAt",
            "in": "query",
            "description": "Filter the output for activities with a processed time after the queried timestamp.",
            "example": "2024-05-22T21:15:55.306Z",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "holdingIds",
            "in": "query",
            "example": "1,2,3,4",
            "description": "Filter the output for activities related to holdings with ids in the provided argument",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "includeSummaries",
            "in": "query",
            "example": true,
            "description": "Whether to include AI summaries in the data. Please contact Arch to enable this parameter.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "hasSummaries",
            "in": "query",
            "example": true,
            "description": "Filter the output for activities that have an AI summary if true, or activities that don't have an AI summary if false. Please contact Arch to enable this parameter.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "includeCashFlow",
            "in": "query",
            "example": true,
            "description": "Whether to include the cash flow associated with the activity, if it exists",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "includeEmailBodies",
            "in": "query",
            "example": true,
            "description": "Whether to include the email body and html associated with the activity",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "includeApprovalStatus",
            "in": "query",
            "example": true,
            "description": "Whether to include whether the activity is Pending/Approved. Please contact Arch to enable this parameter.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A list of activities data.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ActivityList"
                }
              }
            }
          },
          "500": {
            "description": "Internal server error."
          }
        }
      }
    },
    "/client-api/v0/activities/{id}": {
      "get": {
        "operationId": "get-single-activity",
        "summary": "Get activity by id",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "description": "Returns activity data.",
        "tags": [
          "Activities"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "A specific activity to query",
            "required": true,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "includeSummaries",
            "in": "query",
            "example": true,
            "description": "Whether to include AI summaries in the data. Please contact Arch to enable this parameter.",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "includeCashFlow",
            "in": "query",
            "example": true,
            "description": "Whether to include the cash flow associated with the activity, if it exists",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "includeEmailBodies",
            "in": "query",
            "example": true,
            "description": "Whether to include the email body and html associated with the activity",
            "schema": {
              "type": "boolean"
            }
          },
          {
            "name": "includeApprovalStatus",
            "in": "query",
            "example": true,
            "description": "Whether to include whether the activity is Pending/Approved. Please contact Arch to enable this parameter.",
            "schema": {
              "type": "boolean"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Activity data.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/Activity"
                }
              }
            }
          },
          "400": {
            "description": "Id could not be parsed"
          },
          "404": {
            "description": "Activity id not found or is inaccessible to the user"
          },
          "500": {
            "description": "Internal server error."
          }
        }
      },
      "patch": {
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "A specific activity to query",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "summary": "Update activity by id",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "description": "Updates activity data. (Not yet documented)",
        "tags": [
          "Activities"
        ],
        "responses": {
          "405": {
            "description": "Endpoint not yet implemented."
          }
        }
      }
    },
    "/client-api/v0/activities/{id}/files": {
      "get": {
        "operationId": "get-list-activity-files",
        "summary": "Get all files for a specific activity",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "description": "Returns a list of file metadata, including a presigned download link for a specific activity, if the user has access through through the access token.",
        "tags": [
          "Activities"
        ],
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "description": "A specific activity to query",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "description": "A list of file metadata for the activity.",
            "content": {
              "application/json": {
                "schema": {
                  "$ref": "#/components/schemas/ActivityFileList"
                }
              }
            }
          },
          "404": {
            "description": "Activity id not found or is inaccessible to the user"
          }
        }
      }
    },
    "/client-api/v0/activities/files": {
      "post": {
        "summary": "Query activity files",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "requestBody": {
          "content": {
            "application/json": {
              "schema": {
                "type": "object",
                "required": [
                  "activityIds"
                ],
                "properties": {
                  "activityIds": {
                    "type": "array",
                    "items": {
                      "type": "number"
                    }
                  }
                }
              }
            }
          }
        },
        "description": "Get metadata for activity files",
        "tags": [
          "Activities"
        ],
        "responses": {
          "200": {
            "description": "A flat array of files with metadata for the related activity",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "allOf": [
                      {
                        "$ref": "#/components/schemas/File"
                      },
                      {
                        "type": "object",
                        "properties": {
                          "activityUrl": {
                            "type": "string",
                            "description": "a relative url to access the parent activity",
                            "example": "/activities/1234"
                          }
                        }
                      }
                    ]
                  }
                }
              }
            }
          }
        }
      }
    },
    "/client-api/v0/activities/{activityId}/files/{fileId}/download": {
      "get": {
        "operationId": "get-activity-download-single-file",
        "summary": "Download the file, as originally received.",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "description": "Download the file, as originally received by Arch.",
        "tags": [
          "Activities"
        ],
        "parameters": [
          {
            "name": "activityId",
            "in": "path",
            "description": "The activity the file exists under",
            "required": true,
            "schema": {
              "type": "integer"
            }
          },
          {
            "name": "fileId",
            "in": "path",
            "description": "The id of the file that's being requested",
            "required": true,
            "schema": {
              "type": "integer"
            }
          }
        ],
        "responses": {
          "200": {
            "content": {
              "application/octet-stream": {
                "schema": {
                  "type": "string",
                  "format": "binary"
                }
              }
            },
            "description": "Buffer containing the content of the requested file."
          },
          "404": {
            "content": {
              "application/text": {
                "schema": {
                  "type": "string"
                }
              }
            },
            "description": "Activity id not found or is inaccessible to the user"
          }
        }
      }
    },
    "/client-api/v0/addepar/exports": {
      "get": {
        "operationId": "get-addepar-exports",
        "summary": "Get Addepar export results for accessible accounts",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "description": "Returns Addepar export for all activities Arch has attempted to export to Addepar for a given user. This includes activity IDs, export timestamps, and error messages for activities that have been exported to Addepar.",
        "tags": [
          "Addepar"
        ],
        "responses": {
          "200": {
            "description": "List of Addepar export results with error information",
            "content": {
              "application/json": {
                "schema": {
                  "type": "array",
                  "items": {
                    "$ref": "#/components/schemas/AddeparExportResult"
                  }
                }
              }
            }
          },
          "404": {
            "description": "No addepar exports found for given user"
          },
          "500": {
            "description": "Internal server error"
          }
        }
      }
    },
    "/client-api/v0/cash-flows": {
      "get": {
        "summary": "Get data for a set of cash flows available to the user",
        "security": [
          {
            "BearerAuth": []
          }
        ],
        "description": "Returns a paginated list of cash flows available to the user as determined by the user's access token.",
        "tags": [
          "Cash Flows"
        ],
        "parameters": [
          {
            "name": "limit",
            "in": "query",
            "description": "The number of cash flows to return",
            "schema": {
              "type": "integer",
              "default": 25,
              "maximum": 1000
            }
          },
          {
            "name": "offset",
            "in": "query",
            "description": "The number of cash flows to skip before collecting results",
            "schema": {
              "type": "integer",
              "default": 0,
              "minimum": 0
            }
          },
          {
            "name": "holdingIds",
            "in": "query",
            "example": "1,2,3,4",
            "description": "Filter the output for cash flows belonging to holdings with ids in the provided argument",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "investingEntityIds",
            "in": "query",
            "example": "1,2,3,4",
            "description": "Filter the output for cash flows belonging to investing entities with ids in the provided argument",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "issuingEntityIds",
            "in": "query",
            "example": "1,2,3,4",
            "description": "Filter the output for cash flows belonging to issuing entities with ids in the provided argument",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "accountIds",
            "in": "query",
            "example": "1,2,3,4",
            "description": "Will filter the output to only include holdings relevant to one of the account ids in the provided argument",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "title",
            "in": "query",
            "example": "Test Name",
            "description": "Filter the output for cash flows with a title that contains the provided value",
            "schema": {
              "type": "string"
            }
          },
          {
            "name": "types",
            "schema": {
              "type": "string"
            },
            "example": "Capital Call, Distribution, Contribution",
            "in": "query",
            "description": "Will filter the output to only include cash flows with one of the types in the provided argument"
          },
          {
            "name": "beforeDueAt",
            "in": "query",
            "description": "Filter the output for cash flows with a due time before the queried datetime.",
            "example": "2024-05-22T21:15:55.306Z",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "afterDueAt",
            "in": "query",
            "description": "Filter the output for cash flows with a due time after the queried datetime.",
            "example": "2024-05-22T21:15:55.306Z",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
          },
          {
            "name": "beforeCompletedAt",
            "in": "query",
            "description": "Filter the output for cash flows with a completion date before the queried datetime.",
            "example": "2024-05-22T21:15:55.306Z",
            "schema": {
              "type": "string",
              "format": "date-time"
            }
 

# --- truncated at 32 KB (301 KB total) ---
# Full source: https://raw.githubusercontent.com/api-evangelist/arch-labs/refs/heads/main/openapi/arch-labs-client-api-openapi.json