> This page is for version v1.
> For other versions, use one of these documentation indexes:
> - v2 (default): https://autodesk-poc.ferndocs.com/v2/llms.txt
> - v1: https://autodesk-poc.ferndocs.com/v1/llms.txt

> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://autodesk-poc.ferndocs.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://autodesk-poc.ferndocs.com/_mcp/server.

# Get account companies

GET https://developer.api.autodesk.com/construction/admin/v1/accounts/{accountId}/companies

Returns a list of companies in a hub.

You can also use this endpoint to filter out the list of companies by setting the filter parameters.

**Note:** This operation is forward compatible. Autodesk may add attributes to the response without prior notice, so your app should ignore any attribute it does not recognize.

Reference: https://autodesk-poc.ferndocs.com/v1/acc-admin/companies/get-companies

## Authentication

- OAuth2 — send the obtained token as `Authorization: Bearer <token>`
- OAuth2 — send the obtained token as `Authorization: Bearer <token>`
- `Authorization` header (bearer token, required) — **OAuth 2.0 (3-legged)** — user context required. Also accepts a Secure Service Account (SSA) token, which is headless like a two-legged flow but classified as three-legged because it preserves user context. **Authorization Code Flow** Authorization URL: [https://developer.api.autodesk.com/authentication/v2/authorize](https://developer.api.autodesk.com/authentication/v2/authorize) Token URL: [https://developer.api.autodesk.com/authentication/v2/token](https://developer.api.autodesk.com/authentication/v2/token) Refresh URL: [https://developer.api.autodesk.com/authentication/v2/token](https://developer.api.autodesk.com/authentication/v2/token) Scopes: - `data:read` — read your data - `account:read` — read account and project data - `account:write` — modify account and project data

## Request

### Path parameters

- `accountId` (string, required) — The ID of the hub that contains the projects. This corresponds to the hub ID used in the [Data Management API](https://aps.autodesk.com/en/docs/data/v2/), with the "**b.**\" prefix removed. For example, `b.c8b0c73d-3ae9` becomes `c8b0c73d-3ae9`.

### Query parameters

- `filter[name]` (string, optional) — Filter companies by name. Can be a partial match based on the value of `filterTextMatch` provided.
- `filter[trade]` (string, optional) — Filter companies by trade. Can be a partial match based on the value of `filterTextMatch` provided.
- `filter[erpId]` (string, optional) — Filter companies by ERP Id. Can be a partial match based on the value of `filterTextMatch` provided.
- `filter[taxId]` (string, optional) — Filter companies by tax Id. Can be a partial match based on the value of `filterTextMatch` provided.
- `filter[updatedAt]` (string, optional) — Filter companies by updated at date range. The range must be specified with dates in an ISO-8601 format with time required. The start and end dates of the range should be separated by `..` One of the dates in the range may be omitted. For example, to get everything on or before June 1, 2019 the range would be `..2019-06-01T23:59:59.999Z`. To get everything after June 1, 2019 the range would be `2019-06-01T00:00:00.000Z..`.
- `filter[status]` (enum, optional) — Filters companies by status. Possible values: `active`, `inactive`, `all`. Defaults to `active`.
  - Allowed values: `active`, `inactive`, `all`
- `orFilters` (list of enum, optional) — List of filtered fields to apply an "or" operator. Valid list of fields are `erpId`, `name`, `taxId`, `trade`, `updatedAt`.
  - Allowed values: `erpId`, `name`, `taxId`, `trade`, `updatedAt`
- `filterTextMatch` (enum, optional, default: contains) — Specifies how text-based filters should match values in supported fields. This parameter can be used in any endpoint that supports text-based filtering (e.g., `filter[name]`, `filter[jobNumber]`, `filter[companyName]`, etc.). Possible values: `contains` (default) – Matches if the field contains the specified text anywhere `startsWith` – Matches if the field starts with the specified text `endsWith` – Matches if the field ends with the specified text `equals` – Matches only if the field exactly matches the specified text Matching is case-insensitive. Wildcards and regular expressions are not supported.
  - Allowed values: `contains`, `startsWith`, `endsWith`, `equals`
- `sort` (list of enum, optional, default: name) — The list of fields to sort by. When multiple fields are listed the later property is used to sort the resources where the previous fields have the same value. Each property can be followed by a direction modifier of either `asc` (ascending) or `desc` (descending). If no direction is specified then `asc` is assumed. Valid fields for sorting are `name`, `trade`, `erpId`, `taxId`, `status`, `createdAt`, `updatedAt`, `projectSize` and `userSize`. Default sort is `name`.
  - Allowed values: `name`, `name asc`, `name desc`, `trade`, `trade asc`, `trade desc`, `erpId`, `erpId asc`, `erpId desc`, `taxId`, `taxId asc`, `taxId desc`, `status`, `status asc`, `status desc`, `createdAt`, `createdAt asc`, `createdAt desc`, `updatedAt`, `updatedAt asc`, `updatedAt desc`, `projectSize`, `projectSize asc`, `projectSize desc`, `userSize`, `userSize asc`, `userSize desc`
- `fields` (list of enum, optional) — List of fields to return in the response. Defaults to all fields. Valid list of fields are `accountId`, `name`, `trade`, `addresses`, `websiteUrl`, `description`, `erpId`, `taxId`, `imageUrl`, `status`, `createdAt`, `updatedAt`, `projectSize`, `userSize` and `originalName`.
  - Allowed values: `accountId`, `name`, `trade`, `addresses`, `websiteUrl`, `description`, `erpId`, `taxId`, `imageUrl`, `status`, `createdAt`, `updatedAt`, `projectSize`, `userSize`, `originalName`
- `limit` (integer, optional, default: 20) — The maximum number of records to return in the response. Default: `20` Minimum: `1` Maximum: `200` (If a larger value is provided, only 200 records are returned)
- `offset` (integer, optional, default: 0) — The index of the first record to return. Used for pagination in combination with the `limit` parameter. Example: `limit=20` and `offset=40` returns records 41–60.

### Headers

- `Accept-Language` (string, optional, default: en) — This header is not currently supported in the hub Admin API.
- `Region` (string, optional) — Specifies the region where your request should be routed. If not set, the request is routed automatically, which may result in a slight increase in latency. Possible values: `US`, `EMEA`. For a complete list of supported regions, see the [Regions](https://aps.autodesk.com/en/docs/acc/v1/overview/acc-regions/) page.
- `User-Id` (string, optional) — The ID of a user on whose behalf your request is acting. Your app has access to all users specified by the administrator in the SaaS integrations UI. Provide this header value to identify the user to be affected by the request. You can use either the user's Forma ID (`id`), or their Autodesk ID (`autodeskId`). Note that this header is required for hub Admin POST, PATCH, and DELETE endpoints if you want to use a 2-legged authentication context. This header is optional for hub Admin GET endpoints.

## Response

### 200

The list of requested companies.

- `pagination` (pagination, optional) — Contains pagination details for the records returned by the endpoint.
- `results` (list of company, optional) — The requested page of companies.

## Errors

### 400 Bad Request Error

The request could not be understood by the server due to malformed syntax.

- `status` (integer, optional) — The status code for the error.
- `type` (string, optional) — HQ defined error code for the type of error.
- `title` (string, optional) — The title of the error. ex: Bad Request.
- `detail` (string, optional) — A detailed description of the error with possible suggestions for fixing them.
- `id` (string, optional) — A unique id for the request.
- `errors` (list of fieldError, optional) — List of field validation errors.

### 401 Unauthorized Error

Request has not been applied because it lacks valid authentication credentials for the target resource.

- `authenticationUrl` (string, optional) — The url used for authenticating the user.
- `status` (integer, optional) — The status code for the error.
- `type` (string, optional) — HQ defined error code for the type of error.
- `title` (string, optional) — The title of the error. ex: Bad Request.
- `detail` (string, optional) — A detailed description of the error with possible suggestions for fixing them.
- `id` (string, optional) — A unique id for the request.

### 403 Forbidden Error

The server understood the request but refuses to authorize it.

- `status` (integer, optional) — The status code for the error.
- `type` (string, optional) — HQ defined error code for the type of error.
- `title` (string, optional) — The title of the error. ex: Bad Request.
- `detail` (string, optional) — A detailed description of the error with possible suggestions for fixing them.
- `id` (string, optional) — A unique id for the request.

### 404 Not Found Error

The resource could not be found.

- `status` (integer, optional) — The status code for the error.
- `type` (string, optional) — HQ defined error code for the type of error.
- `title` (string, optional) — The title of the error. ex: Bad Request.
- `detail` (string, optional) — A detailed description of the error with possible suggestions for fixing them.
- `id` (string, optional) — A unique id for the request.

### 406 Not Acceptable Error

The server cannot produce a response matching the list of acceptable values defined in the request.

- `status` (integer, optional) — The status code for the error.
- `type` (string, optional) — HQ defined error code for the type of error.
- `title` (string, optional) — The title of the error. ex: Bad Request.
- `detail` (string, optional) — A detailed description of the error with possible suggestions for fixing them.
- `id` (string, optional) — A unique id for the request.

### 410 Gone Error

Access to the target resource is no longer available.

- `status` (integer, optional) — The status code for the error.
- `type` (string, optional) — HQ defined error code for the type of error.
- `title` (string, optional) — The title of the error. ex: Bad Request.
- `detail` (string, optional) — A detailed description of the error with possible suggestions for fixing them.
- `id` (string, optional) — A unique id for the request.

### 429 Too Many Requests Error

User has sent too many requests in a given amount of time.

- `any`

### 500 Internal Server Error

An unexpected error occurred on the server.

- `status` (integer, optional) — The status code for the error.
- `type` (string, optional) — HQ defined error code for the type of error.
- `title` (string, optional) — The title of the error. ex: Bad Request.
- `detail` (string, optional) — A detailed description of the error with possible suggestions for fixing them.
- `id` (string, optional) — A unique id for the request.

### 503 Service Unavailable Error

Server is not ready to handle the request.

- `status` (integer, optional) — The status code for the error.
- `type` (string, optional) — HQ defined error code for the type of error.
- `title` (string, optional) — The title of the error. ex: Bad Request.
- `detail` (string, optional) — A detailed description of the error with possible suggestions for fixing them.
- `id` (string, optional) — A unique id for the request.

## Types

### pagination

Contains pagination details for the records returned by the endpoint.

- `limit` (integer, optional, default: 20) — The maximum number of records returned per page. The last page may contain fewer records than the specified limit.
- `offset` (integer, optional, default: 0) — The index of the first record in the returned page. Used for pagination.
- `totalResults` (integer, optional) — The total number of records matching the request.
- `nextUrl` (string, optional) — The URL for the next page of records, if more results are available. Max length: 2000 characters.
- `previousUrl` (string, optional) — The URL for the previous page of records, if applicable. Max length: 2000 characters.

### company

hub level company information.

- `id` (string, optional) — Id of the company.
- `accountId` (string, optional) — The identifier of the hub this company is associated with.
- `name` (string, optional) — The name of the company. The company name should be unique under a hub.
- `trade` (string, optional) — Trade or company type based on specialization.
- `addresses` (list of address, optional) — The company addresses.
- `websiteUrl` (string, optional) — The URL of the company website.
- `description` (string, optional) — The description of the company.
- `erpId` (string, optional) — The ERP Partner Company ID.
- `taxId` (string, optional) — The Tax ID.
- `imageUrl` (string, optional) — The URL of the image associated to the company.
- `status` (enum, optional, default: active) — The status of the company.
  - Allowed values: `deleted`, `active`
- `createdAt` (datetime, optional) — The timestamp when this company was created.
- `updatedAt` (datetime, optional) — The timestamp when this company was last updated. This will only reflect changes to the company fields and not changes to any resources in the company.
- `originalName` (string, optional, nullable) — Original name of the company. Only returned when a company is deleted, since, in this case, the company "name" will be updated to "removed at MMDDYYYY".
- `projectSize` (integer, optional) — The number of projects associated with the company.
- `userSize` (integer, optional) — The number of users that are associated with the company.

### fieldError

Error description for a field validation error.

- `type` (string, optional) — HQ defined error code for the type of error.
- `field` (string, optional) — Name of the field associated to the error.
- `title` (string, optional) — Title for the error.
- `detail` (string, optional) — A detailed description of the error so the user knows how to fix it.

### address

Address information.

- `type` (enum, optional, default: Main) — The address type.
  - Allowed values: `Main`
- `addressLine1` (string, optional) — The street address line 1.
- `addressLine2` (string, optional) — The street address line 2.
- `city` (string, optional) — City.
- `stateOrProvince` (string, optional, nullable) — The state or province location. Only valid state/province names and ISO 3166-2 alpha-2 codes will be accepted. The provided state or province must exist in the provided country.
- `postalCode` (string, optional) — The zip or postal code in which this address is located.
- `country` (string, optional, nullable, default: US) — Only valid country names and ISO 3166-1 alpha-2 codes will be accepted.
- `phone` (string, optional) — Phone Number.

## Examples

**Response**

```json
{
  "pagination": {
    "limit": 20,
    "offset": 10,
    "totalResults": 121,
    "nextUrl": "https://resource?limit=20&offset=30",
    "previousUrl": "https://resource?limit=20&offset=0"
  },
  "results": [
    {
      "id": "d1163421-e7eb-4862-ac15-b33777ba42de",
      "accountId": "d73fc742-4538-401c-8d0f-853b49b750b2",
      "name": "Plumbing Unlimited",
      "trade": "Plumbing",
      "addresses": [
        {
          "type": "Main",
          "addressLine1": "123 Main Street",
          "addressLine2": "Suite 2",
          "city": "San Francisco",
          "stateOrProvince": "California",
          "postalCode": "94001",
          "country": "US",
          "phone": "555-555-5555"
        }
      ],
      "websiteUrl": "https://www.plumbingunlimited.com",
      "description": "Plumbing subcontractor in southern California",
      "erpId": "12345678",
      "taxId": "87654321",
      "imageUrl": "https://images.acc.autodesk.com/plumbingunlimited.png",
      "status": "active",
      "createdAt": "2018-01-01T12:45:00.000Z",
      "updatedAt": "2018-01-01T12:45:00.000Z",
      "originalName": "",
      "projectSize": 3,
      "userSize": 12
    }
  ]
}
```

**SDK Code**

```python
import requests

url = "https://developer.api.autodesk.com/construction/admin/v1/accounts/d73fc742-4538-401c-8d0f-853b49b750b2/companies"

querystring = {"fields":"name","filterTextMatch":"contains","filter[erpId]":"companyErpId","filter[name]":"Plumbing unlimited","filter[status]":"active","filter[taxId]":"434920482-22","filter[trade]":"Plumbing","filter[updatedAt]":"2019-06-01T00:00:00.000Z..","limit":"20","offset":"0","orFilters":"name,trade","sort":"name"}

headers = {
    "Accept-Language": "en",
    "Region": "US",
    "User-Id": "6cc15635-2fbd-4f73-afbe-abd833408a1d",
    "Authorization": "<token>."
}

response = requests.get(url, headers=headers, params=querystring)

print(response.json())
```

```javascript
const url = 'https://developer.api.autodesk.com/construction/admin/v1/accounts/d73fc742-4538-401c-8d0f-853b49b750b2/companies?fields=name&filterTextMatch=contains&filter%5BerpId%5D=companyErpId&filter%5Bname%5D=Plumbing+unlimited&filter%5Bstatus%5D=active&filter%5BtaxId%5D=434920482-22&filter%5Btrade%5D=Plumbing&filter%5BupdatedAt%5D=2019-06-01T00%3A00%3A00.000Z..&limit=20&offset=0&orFilters=name%2Ctrade&sort=name';
const options = {
  method: 'GET',
  headers: {
    'Accept-Language': 'en',
    Region: 'US',
    'User-Id': '6cc15635-2fbd-4f73-afbe-abd833408a1d',
    Authorization: '<token>.'
  }
};

try {
  const response = await fetch(url, options);
  const data = await response.json();
  console.log(data);
} catch (error) {
  console.error(error);
}
```

```go
package main

import (
	"fmt"
	"net/http"
	"io"
)

func main() {

	url := "https://developer.api.autodesk.com/construction/admin/v1/accounts/d73fc742-4538-401c-8d0f-853b49b750b2/companies?fields=name&filterTextMatch=contains&filter%5BerpId%5D=companyErpId&filter%5Bname%5D=Plumbing+unlimited&filter%5Bstatus%5D=active&filter%5BtaxId%5D=434920482-22&filter%5Btrade%5D=Plumbing&filter%5BupdatedAt%5D=2019-06-01T00%3A00%3A00.000Z..&limit=20&offset=0&orFilters=name%2Ctrade&sort=name"

	req, _ := http.NewRequest("GET", url, nil)

	req.Header.Add("Accept-Language", "en")
	req.Header.Add("Region", "US")
	req.Header.Add("User-Id", "6cc15635-2fbd-4f73-afbe-abd833408a1d")
	req.Header.Add("Authorization", "<token>.")

	res, _ := http.DefaultClient.Do(req)

	defer res.Body.Close()
	body, _ := io.ReadAll(res.Body)

	fmt.Println(res)
	fmt.Println(string(body))

}
```

```ruby
require 'uri'
require 'net/http'

url = URI("https://developer.api.autodesk.com/construction/admin/v1/accounts/d73fc742-4538-401c-8d0f-853b49b750b2/companies?fields=name&filterTextMatch=contains&filter%5BerpId%5D=companyErpId&filter%5Bname%5D=Plumbing+unlimited&filter%5Bstatus%5D=active&filter%5BtaxId%5D=434920482-22&filter%5Btrade%5D=Plumbing&filter%5BupdatedAt%5D=2019-06-01T00%3A00%3A00.000Z..&limit=20&offset=0&orFilters=name%2Ctrade&sort=name")

http = Net::HTTP.new(url.host, url.port)
http.use_ssl = true

request = Net::HTTP::Get.new(url)
request["Accept-Language"] = 'en'
request["Region"] = 'US'
request["User-Id"] = '6cc15635-2fbd-4f73-afbe-abd833408a1d'
request["Authorization"] = '<token>.'

response = http.request(request)
puts response.read_body
```

```java
import com.mashape.unirest.http.HttpResponse;
import com.mashape.unirest.http.Unirest;

HttpResponse<String> response = Unirest.get("https://developer.api.autodesk.com/construction/admin/v1/accounts/d73fc742-4538-401c-8d0f-853b49b750b2/companies?fields=name&filterTextMatch=contains&filter%5BerpId%5D=companyErpId&filter%5Bname%5D=Plumbing+unlimited&filter%5Bstatus%5D=active&filter%5BtaxId%5D=434920482-22&filter%5Btrade%5D=Plumbing&filter%5BupdatedAt%5D=2019-06-01T00%3A00%3A00.000Z..&limit=20&offset=0&orFilters=name%2Ctrade&sort=name")
  .header("Accept-Language", "en")
  .header("Region", "US")
  .header("User-Id", "6cc15635-2fbd-4f73-afbe-abd833408a1d")
  .header("Authorization", "<token>.")
  .asString();
```

```php
<?php
require_once('vendor/autoload.php');

$client = new \GuzzleHttp\Client();

$response = $client->request('GET', 'https://developer.api.autodesk.com/construction/admin/v1/accounts/d73fc742-4538-401c-8d0f-853b49b750b2/companies?fields=name&filterTextMatch=contains&filter%5BerpId%5D=companyErpId&filter%5Bname%5D=Plumbing+unlimited&filter%5Bstatus%5D=active&filter%5BtaxId%5D=434920482-22&filter%5Btrade%5D=Plumbing&filter%5BupdatedAt%5D=2019-06-01T00%3A00%3A00.000Z..&limit=20&offset=0&orFilters=name%2Ctrade&sort=name', [
  'headers' => [
    'Accept-Language' => 'en',
    'Authorization' => '<token>.',
    'Region' => 'US',
    'User-Id' => '6cc15635-2fbd-4f73-afbe-abd833408a1d',
  ],
]);

echo $response->getBody();
```

```csharp
using RestSharp;

var client = new RestClient("https://developer.api.autodesk.com/construction/admin/v1/accounts/d73fc742-4538-401c-8d0f-853b49b750b2/companies?fields=name&filterTextMatch=contains&filter%5BerpId%5D=companyErpId&filter%5Bname%5D=Plumbing+unlimited&filter%5Bstatus%5D=active&filter%5BtaxId%5D=434920482-22&filter%5Btrade%5D=Plumbing&filter%5BupdatedAt%5D=2019-06-01T00%3A00%3A00.000Z..&limit=20&offset=0&orFilters=name%2Ctrade&sort=name");
var request = new RestRequest(Method.GET);
request.AddHeader("Accept-Language", "en");
request.AddHeader("Region", "US");
request.AddHeader("User-Id", "6cc15635-2fbd-4f73-afbe-abd833408a1d");
request.AddHeader("Authorization", "<token>.");
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Accept-Language": "en",
  "Region": "US",
  "User-Id": "6cc15635-2fbd-4f73-afbe-abd833408a1d",
  "Authorization": "<token>."
]

let request = NSMutableURLRequest(url: NSURL(string: "https://developer.api.autodesk.com/construction/admin/v1/accounts/d73fc742-4538-401c-8d0f-853b49b750b2/companies?fields=name&filterTextMatch=contains&filter%5BerpId%5D=companyErpId&filter%5Bname%5D=Plumbing+unlimited&filter%5Bstatus%5D=active&filter%5BtaxId%5D=434920482-22&filter%5Btrade%5D=Plumbing&filter%5BupdatedAt%5D=2019-06-01T00%3A00%3A00.000Z..&limit=20&offset=0&orFilters=name%2Ctrade&sort=name")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers

let session = URLSession.shared
let dataTask = session.dataTask(with: request as URLRequest, completionHandler: { (data, response, error) -> Void in
  if (error != nil) {
    print(error as Any)
  } else {
    let httpResponse = response as? HTTPURLResponse
    print(httpResponse)
  }
})

dataTask.resume()
```