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

# Save Project Entity

POST https://api.sayari.com/v1/projects/{project_id}/entities/save
Content-Type: application/json

Stores a project entity given entity IDs and a list of attributes.

Reference: https://documentation.sayari.com/api/api-reference/project-entity/save-project-entity

## Authentication

- OAuth2 — send the obtained token as `Authorization: Bearer <token>`

## Servers

- `https://api.sayari.com` (Production, default)
- `https://api.internal.sayari.com` (Dev)
- `https://api.uk.sayari.com` (Production_UK)

## Request

### Path parameters

- `project_id` (string, required)

### Body (application/json)

This endpoint expects a SaveProjectEntityBody.

- `entity_ids` (list of string, required)
- `attributes` (ResolutionAttrSchema, required)
- `profile` (enum, required)
  - Allowed values: `suppliers`, `corporate`, `search`, `screen`

## Response

### 200

- `data` (ProjectEntityResponse, required)

## Errors

### 400 Bad Request

- `any`

### 401 Unauthorized

- `any`

### 404 Not Found

- `status` (integer, required)
- `message` (list of string, required)
- `success` (boolean, required)

### 405 Method Not Allowed

- `status` (integer, required)
- `message` (list of string, required)
- `success` (boolean, required)

### 429 Rate Limit Exceeded

- `any`

### 500 Internal Server Error

- `any`

## Types

### ResolutionAttrSchema

- `identifier` (list of StringOrNumber, optional)
- `name` (list of string, optional)
- `country` (list of string, optional)
- `address` (list of string, optional)
- `date_of_birth` (list of string, optional)
- `contact` (list of StringOrNumber, optional)
- `type` (list of string, optional)
- `city` (list of string, optional)
- `state` (list of string, optional)
- `custom_{field name}` (string, optional) — This property is in beta and is subject to change. It is provided for early access and testing purposes only. custom user key/value pairs (key must be prefixed with "custom\_" and value must be "string" type)

### ProjectEntityResponse

- `project_entity_id` (string, required)
- `project_id` (string, required)
- `label` (string, required)
- `upload_ids` (list of string, required)
- `strength` (enum, required)
  - Allowed values: `strong`, `partial`, `no_match`, `manual`
- `created_at` (string, required)
- `attributes` (map from string to AttributeValues, required)
- `countries` (list of string, required)
- `risk_categories` (list of ProjectRiskCategory, required)
- `risk_factors` (list of ProjectRiskFactor, required)
- `upstream` (UpstreamInfo, required)
- `tags` (list of TagResponse, required)
- `matches` (list of ProjectEntityMatchResponse, required)
- `case` (CaseInfo, optional)
- `updated_at` (string, optional)
- `updated_by` (string, optional)

### StringOrNumber

### AttributeValues

- `match_resolution` (boolean, required)
- `values` (list of string, required)

### ProjectRiskCategory

- `id` (string, required)
- `label` (string, required)
- `risk_factors` (list of string, required)

### ProjectRiskFactor

- `id` (string, required)

### UpstreamInfo

- `risk_factors` (list of ProjectRiskFactor, required)
- `countries` (list of string, required)
- `trade_counts` (TradeCounts, required)
- `has_upstream` (boolean, required)
- `products` (list of string, required)
- `risk_counts` (map from string to map from string to list of ProductCount, optional)
- `country_counts` (map from string to map from string to list of ProductCount, optional)

### TagResponse

- `id` (string, required)
- `label` (string, required)
- `created_at` (string, required)
- `updated_at` (string, optional)

### ProjectEntityMatchResponse

- `match_id` (string, required)
- `sayari_entity_id` (string, required)
- `type` (string, required)
- `label` (string, required)
- `countries` (list of string, required)
- `risk_categories` (list of ProjectRiskCategory, required)
- `risk_factors` (list of ProjectRiskFactor, required)
- `business_purpose` (list of BusinessPurpose, required)
- `upstream` (UpstreamInfo, required)
- `sources` (list of SourceField, required)
- `addresses` (list of Address, required)
- `hs_codes` (list of string, required)
- `created_at` (string, required)
- `updated_at` (string, optional)
- `match_profile` (enum, optional)
  - Allowed values: `corporate`, `suppliers`, `screen`, `search`
- `deleted_at` (string, optional)
- `match_explanation` (list of ProjectEntityMatchExplanation, optional)

### CaseInfo

- `id` (string, required)
- `status` (enum, required)
  - Allowed values: `not_assigned`, `in_review`, `approved`, `rejected`
- `created_at` (string, required)
- `comment` (string, optional)

### TradeCounts

- `receiver_of` (integer, required)
- `shipper_of` (integer, required)

### ProductCount

- `count` (integer, required)
- `product` (string, optional)

### BusinessPurpose

- `code` (string, required)
- `standard` (string, required)

### SourceField

- `id` (string, required)
- `label` (string, required)

### Address

- `value` (string, required)
- `country` (string, optional)
- `city` (string, optional)
- `state` (string, optional)
- `location` (Location, optional)

### ProjectEntityMatchExplanation

- `field` (string, required)
- `quality` (enum, required) — Quality of the match
  - Allowed values: `high`, `medium`, `low`, `na`
- `description` (list of string, optional)
- `matches` (list of string, optional)

### Location

- `lat` (double, required)
- `lon` (double, required)

## Examples

**Request**

```json
{
  "entity_ids": [
    "entity_id_1",
    "entity_id_2"
  ],
  "attributes": {
    "name": [
      "Example Company"
    ],
    "country": [
      "USA"
    ]
  },
  "profile": "corporate"
}
```

**Response**

```json
{
  "data": {
    "project_entity_id": "52z4Wa",
    "project_id": "YVB88Y",
    "label": "VTB Bank",
    "upload_ids": [],
    "strength": "strong",
    "created_at": "2025-04-22 22:54:00.913586+00",
    "attributes": {
      "name": {
        "match_resolution": true,
        "values": [
          "VTB Bank"
        ]
      },
      "country": {
        "match_resolution": true,
        "values": [
          "RUS"
        ]
      },
      "address": {
        "match_resolution": true,
        "values": [
          "Moscow"
        ]
      },
      "identifier": {
        "match_resolution": true,
        "values": [
          "253400V1H6ART1UQ0N98"
        ]
      }
    },
    "countries": [
      "USA",
      "CYP",
      "ITA",
      "CHN",
      "RUS",
      "UKR",
      "IND",
      "IRL",
      "KAZ",
      "DEU"
    ],
    "risk_categories": [
      {
        "id": "regulatory_action",
        "label": "Regulatory action",
        "risk_factors": [
          "regulatory_action"
        ]
      },
      {
        "id": "export_controls",
        "label": "Export controls",
        "risk_factors": [
          "meu_list_contractors",
          "export_controls"
        ]
      },
      {
        "id": "political_exposure",
        "label": "Political exposure",
        "risk_factors": [
          "soe_adjacent",
          "pep_adjacent"
        ]
      },
      {
        "id": "sanctions",
        "label": "Sanctions",
        "risk_factors": [
          "sanctioned",
          "formerly_sanctioned"
        ]
      },
      {
        "id": "adverse_media",
        "label": "Adverse media",
        "risk_factors": [
          "reputational_risk_other"
        ]
      }
    ],
    "risk_factors": [
      {
        "id": "regulatory_action"
      },
      {
        "id": "sanctioned"
      },
      {
        "id": "meu_list_contractors"
      },
      {
        "id": "reputational_risk_other"
      },
      {
        "id": "pep_adjacent"
      },
      {
        "id": "state_owned"
      },
      {
        "id": "export_controls"
      },
      {
        "id": "formerly_sanctioned"
      },
      {
        "id": "basel_aml"
      },
      {
        "id": "cpi_score"
      }
    ],
    "upstream": {
      "risk_factors": [],
      "countries": [],
      "trade_counts": {
        "receiver_of": 2,
        "shipper_of": 56
      },
      "has_upstream": false,
      "products": []
    },
    "tags": [],
    "matches": [
      {
        "match_id": "52z4Wa:dy-rh2g0QtzUN_jC_e9S_A",
        "sayari_entity_id": "dy-rh2g0QtzUN_jC_e9S_A",
        "type": "company",
        "label": "ОТКРЫТОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО \"РОССИЙСКИЕ ЖЕЛЕЗНЫЕ ДОРОГИ\"",
        "countries": [
          "USA",
          "CYP",
          "ITA",
          "CHN",
          "RUS",
          "UKR",
          "IND",
          "IRL",
          "KAZ",
          "DEU"
        ],
        "risk_categories": [
          {
            "id": "regulatory_action",
            "label": "Regulatory action",
            "risk_factors": [
              "regulatory_action"
            ]
          },
          {
            "id": "export_controls",
            "label": "Export controls",
            "risk_factors": [
              "meu_list_contractors",
              "export_controls"
            ]
          },
          {
            "id": "political_exposure",
            "label": "Political exposure",
            "risk_factors": [
              "soe_adjacent",
              "pep_adjacent"
            ]
          },
          {
            "id": "sanctions",
            "label": "Sanctions",
            "risk_factors": [
              "sanctioned",
              "formerly_sanctioned"
            ]
          },
          {
            "id": "adverse_media",
            "label": "Adverse media",
            "risk_factors": [
              "reputational_risk_other"
            ]
          }
        ],
        "risk_factors": [
          {
            "id": "regulatory_action"
          },
          {
            "id": "sanctioned"
          },
          {
            "id": "meu_list_contractors"
          },
          {
            "id": "reputational_risk_other"
          },
          {
            "id": "pep_adjacent"
          },
          {
            "id": "state_owned"
          },
          {
            "id": "export_controls"
          },
          {
            "id": "formerly_sanctioned"
          },
          {
            "id": "basel_aml"
          },
          {
            "id": "cpi_score"
          }
        ],
        "business_purpose": [
          {
            "code": "6419",
            "standard": "ISIC4"
          },
          {
            "code": "64.19",
            "standard": "unknown"
          },
          {
            "code": "64.9",
            "standard": "unknown"
          },
          {
            "code": "62.09",
            "standard": "unknown"
          },
          {
            "code": "64.19",
            "standard": "NACE2"
          },
          {
            "code": "64.19",
            "standard": "unknown"
          },
          {
            "code": "649",
            "standard": "ISIC4"
          },
          {
            "code": "66.12",
            "standard": "unknown"
          },
          {
            "code": "6419",
            "standard": "ISIC4"
          },
          {
            "code": "6209",
            "standard": "ISIC4"
          },
          {
            "code": "6612",
            "standard": "ISIC4"
          }
        ],
        "upstream": {
          "risk_factors": [],
          "countries": [],
          "trade_counts": {
            "receiver_of": 2,
            "shipper_of": 56
          },
          "has_upstream": false,
          "products": [],
          "risk_counts": {},
          "country_counts": {}
        },
        "sources": [
          {
            "id": "eb361ba33d05a9d15b2d28aea739362a",
            "label": "USA SEC Central Index Key Database"
          },
          {
            "id": "a8c6ee1cd4dfc952105ee8c0e4836f08",
            "label": "Acuris Risk Intelligence KYC6 (3rd Party Data)"
          },
          {
            "id": "3322a755c28851ec06eda3280cc2a2b2",
            "label": "Russia ClearSpending (3rd Party Data)"
          },
          {
            "id": "93de05b55a68cc964f34bbfc7ec7bc86",
            "label": "Consolidated Canadian Autonomous Sanctions List"
          },
          {
            "id": "fdfedf11a5122e2aef9dc3f176c7427d",
            "label": "Sayari Intel (Sayari Curated Risk Data) - Archived"
          },
          {
            "id": "e517c714b560f159a89a9501ed7dd84e",
            "label": "Infocredit Cyprus Company Shareholders Database (3rd Party Data)"
          },
          {
            "id": "bef2f30139ea37c723ecb0f953b5f024",
            "label": "Australia Consolidated Sanctions List"
          },
          {
            "id": "9048153c770d941afe9500c6ad810a80",
            "label": "Kazakhstan DFO Registry"
          },
          {
            "id": "635021e4e01979cdf95fa7ee76501696",
            "label": "Russia E-Disclosures"
          },
          {
            "id": "e85d865943ee6d8369307569d2ad9de0",
            "label": "Acuris Risk Intelligence Adverse Media Data"
          },
          {
            "id": "4ff85397f508e4ff8e71c5ca5ea895dd",
            "label": "Japan Ministry of Finance Economic Sanctions List"
          },
          {
            "id": "ce873f184abee5b13c9e89791bd78229",
            "label": "Ukraine Significant Shareholders of Securities Issuers"
          },
          {
            "id": "8511f57f6098dcc36e3a814c3ea5bdd7",
            "label": "Uzbekistan Imports & Exports (January 2022 - Present)"
          },
          {
            "id": "e6e4acebdea4e9e71af8d3586d34fcdd",
            "label": "Ukraine Sanctions List"
          },
          {
            "id": "db3416894cd5f0c4d2d6ecc79bdaf366",
            "label": "EDI Publicly-Listed Global Security Issuers (3rd Party Data)"
          },
          {
            "id": "b812677c0a32a1746b3ac741c7b97ae0",
            "label": "Legal Entity Identifier (LEI) Registry (3rd Party Data)"
          },
          {
            "id": "a9a18eeb901e4376c912e95dc05ceb78",
            "label": "Russia Federal Tax Registry"
          },
          {
            "id": "d357238101a2bb02d97d5d77a56d9455",
            "label": "New Zealand Russia Sanctions"
          },
          {
            "id": "f4ce10ac8bdc0bd9bcb31cb868b4b539",
            "label": "EU Financial Sanctions List"
          },
          {
            "id": "c10d482320f207d92aa814519c3bd686",
            "label": "UK Consolidated Sanctions List"
          },
          {
            "id": "d1bce737c158efddbef5048d63aaf124",
            "label": "Ukraine Ministry of Justice Registry of Companies"
          },
          {
            "id": "92edb8fe6615498f6e3e7b0e220f74e6",
            "label": "USA Treasury OFAC Specially Designated Nationals (SDN) List"
          },
          {
            "id": "66dfefb726ae00fde8f09f34c5578d35",
            "label": "Russia Imports & Exports (January 2023 - Present)"
          },
          {
            "id": "ad6dc774c74b92159422deabc5aee661",
            "label": "France National Asset Freeze Register"
          },
          {
            "id": "b97ad5c858093e5227b2359a0078696f",
            "label": "USA SAM.gov Entity Exclusions Database"
          },
          {
            "id": "ddbf93a5c5d568ccdb0c2455f7ecbfc8",
            "label": "USA CorpWatch SEC 10-K Exhibit 21 Database (3rd Party Data)"
          },
          {
            "id": "52a7bc4a30e787544ad2d95e7f54adca",
            "label": "USA OFAC Non-SDN Consolidated Sanctions List"
          },
          {
            "id": "f43658cf2a19452fb45b830edeeeea44",
            "label": "Russia Central Bank Financial Institution UBO Disclosures"
          },
          {
            "id": "828f81c7c31410de845d9e6ed1a0f3e6",
            "label": "Russia Central Bank Financial Institutions"
          },
          {
            "id": "56bce0e008204712e302271ddd7b4fb1",
            "label": "Russia Federal Tax Registry (2018)"
          },
          {
            "id": "e0b32f41da3b4e6c75f1f7bf6fe1c9c5",
            "label": "S&P Global Market Intelligence Database (3rd Party Data)"
          },
          {
            "id": "10a889609ddae6cc31773feebe48166b",
            "label": "Switzerland SECO Sanctions List"
          },
          {
            "id": "ded706ef28cdc649b6fc5142bc542890",
            "label": "EU Sanctions Map"
          },
          {
            "id": "417400a1ac439843fda5bb2f05fb4161",
            "label": "USA Consolidated Screening List"
          },
          {
            "id": "765d0dc816bb7db35031c43a37290350",
            "label": "Ireland Companies Registration Office Database"
          }
        ],
        "addresses": [
          {
            "value": "190000, г Санкт-Петербург, ул Большая Морская, дом 29"
          },
          {
            "value": "109147 г. Москва, ул. Воронцовская, д.43 стр.1"
          },
          {
            "value": "119121 г. Москва, ул. Плющиха, д. 37."
          },
          {
            "value": "43, Vorontsovskaya str., Moscow, 109044, Russia"
          },
          {
            "value": "11, lit A, Degtyarnyy pereulok, St. Petersburg, 191144, Russia"
          },
          {
            "value": "29, Bolshaya Morskaya str., St. Petersburg, 190000, Russia"
          }
        ],
        "hs_codes": [
          "847150",
          "8471500000",
          "852351",
          "8523519101",
          "860610",
          "8606100000",
          "271019",
          "2710196601",
          "490700",
          "4907003000",
          "711890",
          "7118900000",
          "490700",
          "4907003000",
          "711890",
          "7118900000"
        ],
        "created_at": "2025-04-22 22:54:00.913586+00",
        "updated_at": "2025-04-22 22:54:00.913586+00",
        "match_explanation": [
          {
            "field": "name",
            "quality": "high",
            "matches": [
              "<em>БАНК</em> <em>ВТБ</em> (ПАО)",
              "<em>VTB</em> <em>BANK</em> (PJSC)",
              "<em>БАНК</em> <em>ВТБ</em> (ПУБЛИЧНОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО)",
              "<em>VTB</em> <em>BANK</em> (PUBLIC JOINT STOCK COMPANY)",
              "<em>VTB</em> <em>Bank</em>"
            ]
          },
          {
            "field": "address",
            "quality": "medium",
            "matches": [
              "109147 <em>Moscow</em>, st. Vorontsovskaya, 43 building 1",
              "119121 <em>Moscow</em>, st. Plyushchikha, 37.",
              "Vorontsovskaya Str., 43 <em>Moscow</em> 109044 RUSSIAN FEDERATION",
              "37 Plyushchikha ul., <em>Moscow</em>, 119121, Russia",
              "Bashnya Zapad, Kompleks Federatsiya, 12, nab. Presnenskaya, <em>Moscow</em>, 123317, Russia"
            ]
          },
          {
            "field": "country",
            "quality": "high",
            "matches": [
              "<em>RUS</em>"
            ]
          },
          {
            "field": "identifier",
            "quality": "high",
            "matches": [
              "<em>253400V1H6ART1UQ0N98</em>"
            ]
          }
        ]
      }
    ],
    "case": {
      "id": "YVB88Y",
      "status": "not_assigned",
      "created_at": "2025-10-02"
    },
    "updated_at": "2025-04-23 13:37:00.215522+00",
    "updated_by": "auth0|5e45bd8caccd890e68147513"
  }
}
```

**SDK Code**

```python
import requests

url = "https://api.sayari.com/v1/projects/YVB88Y/entities/save"

payload = {
    "entity_ids": ["entity_id_1", "entity_id_2"],
    "attributes": {
        "name": ["Example Company"],
        "country": ["USA"]
    },
    "profile": "corporate"
}
headers = {
    "Authorization": "<token>.",
    "Content-Type": "application/json"
}

response = requests.post(url, json=payload, headers=headers)

print(response.json())
```

```javascript
const url = 'https://api.sayari.com/v1/projects/YVB88Y/entities/save';
const options = {
  method: 'POST',
  headers: {Authorization: '<token>.', 'Content-Type': 'application/json'},
  body: '{"entity_ids":["entity_id_1","entity_id_2"],"attributes":{"name":["Example Company"],"country":["USA"]},"profile":"corporate"}'
};

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"
	"strings"
	"net/http"
	"io"
)

func main() {

	url := "https://api.sayari.com/v1/projects/YVB88Y/entities/save"

	payload := strings.NewReader("{\n  \"entity_ids\": [\n    \"entity_id_1\",\n    \"entity_id_2\"\n  ],\n  \"attributes\": {\n    \"name\": [\n      \"Example Company\"\n    ],\n    \"country\": [\n      \"USA\"\n    ]\n  },\n  \"profile\": \"corporate\"\n}")

	req, _ := http.NewRequest("POST", url, payload)

	req.Header.Add("Authorization", "<token>.")
	req.Header.Add("Content-Type", "application/json")

	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://api.sayari.com/v1/projects/YVB88Y/entities/save")

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

request = Net::HTTP::Post.new(url)
request["Authorization"] = '<token>.'
request["Content-Type"] = 'application/json'
request.body = "{\n  \"entity_ids\": [\n    \"entity_id_1\",\n    \"entity_id_2\"\n  ],\n  \"attributes\": {\n    \"name\": [\n      \"Example Company\"\n    ],\n    \"country\": [\n      \"USA\"\n    ]\n  },\n  \"profile\": \"corporate\"\n}"

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.post("https://api.sayari.com/v1/projects/YVB88Y/entities/save")
  .header("Authorization", "<token>.")
  .header("Content-Type", "application/json")
  .body("{\n  \"entity_ids\": [\n    \"entity_id_1\",\n    \"entity_id_2\"\n  ],\n  \"attributes\": {\n    \"name\": [\n      \"Example Company\"\n    ],\n    \"country\": [\n      \"USA\"\n    ]\n  },\n  \"profile\": \"corporate\"\n}")
  .asString();
```

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

$client = new \GuzzleHttp\Client();

$response = $client->request('POST', 'https://api.sayari.com/v1/projects/YVB88Y/entities/save', [
  'body' => '{
  "entity_ids": [
    "entity_id_1",
    "entity_id_2"
  ],
  "attributes": {
    "name": [
      "Example Company"
    ],
    "country": [
      "USA"
    ]
  },
  "profile": "corporate"
}',
  'headers' => [
    'Authorization' => '<token>.',
    'Content-Type' => 'application/json',
  ],
]);

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

```csharp
using RestSharp;

var client = new RestClient("https://api.sayari.com/v1/projects/YVB88Y/entities/save");
var request = new RestRequest(Method.POST);
request.AddHeader("Authorization", "<token>.");
request.AddHeader("Content-Type", "application/json");
request.AddParameter("application/json", "{\n  \"entity_ids\": [\n    \"entity_id_1\",\n    \"entity_id_2\"\n  ],\n  \"attributes\": {\n    \"name\": [\n      \"Example Company\"\n    ],\n    \"country\": [\n      \"USA\"\n    ]\n  },\n  \"profile\": \"corporate\"\n}", ParameterType.RequestBody);
IRestResponse response = client.Execute(request);
```

```swift
import Foundation

let headers = [
  "Authorization": "<token>.",
  "Content-Type": "application/json"
]
let parameters = [
  "entity_ids": ["entity_id_1", "entity_id_2"],
  "attributes": [
    "name": ["Example Company"],
    "country": ["USA"]
  ],
  "profile": "corporate"
] as [String : Any]

let postData = JSONSerialization.data(withJSONObject: parameters, options: [])

let request = NSMutableURLRequest(url: NSURL(string: "https://api.sayari.com/v1/projects/YVB88Y/entities/save")! as URL,
                                        cachePolicy: .useProtocolCachePolicy,
                                    timeoutInterval: 10.0)
request.httpMethod = "POST"
request.allHTTPHeaderFields = headers
request.httpBody = postData as Data

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()
```