# Base API

## API Signatures

* The authorization signature uses 'Ethereum message signing', assuming the ChainID of the relevant chain (e.g., ETH: 1, Silicon Mainnet: 2355).
* For signatures used in snapshot submissions, verification is conducted using the ETH ChainID of 1 (the ChainID is included in the message).

## Basic Response

{% code lineNumbers="true" %}

```
{
  statusCode: number;
  message: string;
  data: ResponseData;
}
```

{% endcode %}

## Success

{% code lineNumbers="true" %}

```

{
	"statusCode": 200
	"data": {},
	"message": "success"
	
}
```

{% endcode %}

## Fail

{% code lineNumbers="true" %}

```
{
	"statusCode": 500
	"message": error_message
}
```

{% endcode %}

## Error Message List

The following are basic error messages. Additional error messages may be present depending on the handling within each method.

### Basic Validation

| Message                 | Description                                                                                                                                        |
| ----------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
| invalid\_target         | When `managerName` does not match the name of the requested Manager.                                                                               |
| request\_timeout        | Request timed out.                                                                                                                                 |
| used\_signature         | When the signature value has already been processed within the allotted time (to prevent double usage).                                            |
| invalid\_cohort         | When the `CohortId` in the request does not match the `CohortId` in the requestPath, or if the `CohortId` is invalid or the cohort does not exist. |
| invalid\_owner          | When the owner in the request is missing or does not match the Owner of the `CohortId`.                                                            |
| invalid\_method         | When the method is incorrect.                                                                                                                      |
| fail\_to\_authorization | When the authorization signature verified with the hash in the body does not match the Cohort Owner.                                               |

### Basic Method Validation

| Message            | Description                                                                                                      |
| ------------------ | ---------------------------------------------------------------------------------------------------------------- |
| invalid\_members   | When the members field is missing or not in a dictionary format.                                                 |
| exceed\_limit      | When the number of members being added exceeds the limit per request.                                            |
| too\_many\_members | When the total number of members, after attempted additions, exceeds the overall limit.                          |
| invalid\_address   | When one or more addresses in the members field have an incorrect format.                                        |
| invalid\_weight    | When the format of the weight in the members field is incorrect (must be an integer between 0 and `uint32.max`). |
| pending\_snapshot  | When an `add` request is sent during the snapshot `prepare` status, but a `submit` is expected.                  |

### Signature Generation Example

#### Example 1

{% code lineNumbers="true" %}

```
dataHash = keccak256(
		abi.encode(
				[string, address, uint256, address[], address[], bytes[], uint256],
				["OpenCohort:UpdateIdentity", cohort, chainId, identityList, addressList, signatureList, validUntil]
		)
);
signingHash = ERC191(dataHash);
```

{% endcode %}

#### Example 2&#x20;

{% code lineNumbers="true" %}

```
const {
    cohort,
    chainId,
    cohortId,
    snapshotTime,
    snapshotSignature,
    validUntil
} = dto;

const dataBytes = defaultAbiCoder.encode(
    ['string', 'address', 'uint256', 'uint256', 'uint256', 'bytes', 'uint256'],
    ['OpenCohort:Submit', cohort, chainId, cohortId, snapshotTime, snapshotSignature, validUntil]
);
const dataHash = keccak256(dataBytes);
const signingBytes = Buffer.concat([
    Buffer.from('\x19Ethereum Signed Message:\n32', 'ascii'),
    Buffer.from(dataHash.replace("0x",""), 'hex')
]);
const signingHash = keccak256(signingBytes);
```

{% endcode %}
