> ## Documentation Index
> Fetch the complete documentation index at: https://developers.argosidentity.com/llms.txt
> Use this file to discover all available pages before exploring further.

# POST/Submission

> This API allows clients to forcibly insert and submit user ID verification data without going through ARGOS ID verification. It supports string data only. For image data, use the separate `PUT Image API`.

<Note>
  This API is particularly useful for migrating user data from existing systems to the ARGOS system or in special cases where direct user ID verification data submission is necessary. It can also assist in testing various scenarios during development.
</Note>

<Warning>
  Submissions created using this API do not undergo ARGOS' standard verification process. The accuracy and validity of submitted data is entirely the client's responsibility. Therefore, this API should not replace the regular ID verification process and is recommended only for exceptional use cases.
</Warning>

## 1. Endpoint

```plaintext theme={null}
POST https://rest-api.argosidentity.com/v3/submission/migration
```

## 2. Authentication

Include the API key in the x-api-key header:

```text x-api-key theme={null}
x-api-key: {yourAPIKey}
```

## 3. Request Body

The request body must be in JSON format. Below are the field descriptions:

<ResponseField name="admin" type="string" required="true">
  Email of the project administrator (must be registered in the dashboard).
</ResponseField>

<ResponseField name="email" type="string" required="true">
  Email address of the KYC submitter.
</ResponseField>

<ResponseField name="fullName" type="string" required="true">
  Full name of the KYC submitter.
</ResponseField>

<ResponseField name="first_name" type="string">
  First name of the submitter.
</ResponseField>

<ResponseField name="last_name" type="string">
  Last name (family name) of the submitter.
</ResponseField>

<ResponseField name="birthDate" type="string" required="true">
  Birthdate of the KYC submitter.
</ResponseField>

<ResponseField name="kycStatus" type="string" required="true">
  KYC result: `approved` or `rejected`.
</ResponseField>

<ResponseField name="idType" type="string">
  ID type [ID Card Codes](/en/idcheck/reference_tables/id-card-types).
</ResponseField>

<ResponseField name="issuingCountry" type="string">
  Issuing country of the [ID Country Codes](/en/idcheck/reference_tables/supported-id-types-alpha-3-country-codes).
</ResponseField>

<ResponseField name="nationality" type="string">
  Nationality of the KYC submitter [Country Codes](/en/idcheck/reference_tables/supported-id-types-alpha-3-country-codes).
</ResponseField>

<ResponseField name="gender" type="string">
  `female` or `male`.
</ResponseField>

<ResponseField name="issueDate" type="string">
  Issue date of the ID in `YYYY-MM-DD` format.
</ResponseField>

<ResponseField name="expireDate" type="string">
  Expiry date of the ID in `YYYY-MM-DD` format.
</ResponseField>

<ResponseField name="ipAddress" type="string">
  IP address of the KYC submitter.
</ResponseField>

<ResponseField name="identityNumber" type="string">
  Identity number of the KYC submitter.
</ResponseField>

<ResponseField name="documentNumber" type="string">
  Document number of the KYC submitter.
</ResponseField>

<ResponseField name="address_city" type="string">
  City of residence.
</ResponseField>

<ResponseField name="address_country" type="string">
  Country of residence.
</ResponseField>

<ResponseField name="address_state" type="string">
  State/Province of residence.
</ResponseField>

<ResponseField name="address_street" type="string">
  Street address.
</ResponseField>

<ResponseField name="address_full" type="string">
  Full address.
</ResponseField>

<ResponseField name="cf1" type="string">
  Custom field #1.
</ResponseField>

<ResponseField name="cf2" type="string">
  Custom field #2.
</ResponseField>

<ResponseField name="cf3" type="string">
  Custom field #3.
</ResponseField>

<ResponseField name="userid" type="string">
  Unique user ID.
</ResponseField>

## 4. Request Example

```curl POST/Submission theme={null}
curl --location 'https://rest-api.argosidentity.com/v3/submission/migration' \
--header 'Content-Type: application/json' \
--header 'x-api-key: {yourAPIKey}' \
--data-raw '{
  "admin": "{admin}",
  "email": "{email}",
  "fullName": "{fullName}",
  "firstName": "{firstName}",
  "lastName": "{lastName}",  
  "birthDate": "{birthDate}",
  "kycStatus": "approved",
  "idType": "drvlic",
  "issuingCountry": "USA",
  ...
}'
```

## 5. Response

### 5-1. Success Response

```json result.json theme={null}
{
    "message": "success",
    "submissionId": "submissionId123"
}
```

### 5-2. Error Response

If an error occurs, a `400` status code is returned with details in the response body:

```json error.json theme={null}
{
    "errorCode": "invalid_payload",
    "message": "Invalid payload."
}
```

### 5-3. Error Codes

| Error Code          | Message                          | Description                                              |
| ------------------- | -------------------------------- | -------------------------------------------------------- |
| `invalid_payload`   | Invalid payload                  | Unable to parse the request body                         |
| `missing_data`      | Required input data is missing   | One or more required fields are missing                  |
| `invalid_project`   | Invalid project                  | The project ID is not valid                              |
| `invalid_admin`     | Invalid admin                    | Administrator account lacks permissions for this project |
| `invalid_parameter` | invalid parameter: `{parameter}` | Unexpected parameter submitted                           |
| `invalid_format`    | invalid format: `${parameter}`   | Parameter does not match the expected format             |
| `processing_error`  | Failed to complete migration     | Unknown error occurred during processing                 |

## 6. Encryption Options

To enhance security, the request body can be encrypted. When using encryption:

* Encrypt the entire request body object.
* Send the encrypted string as the `data` parameter (not as a `body` field).

### 6-1. Encrypted Request Example

```python post-encrypted.py theme={null}
encryption = Encryption(api_key, mode='ECB')

payload_data = {
    "admin": "yourAdmin@sample.com",
    "email": "user@example.com",
    "fullName": "hong kil dong",
    "firstName": "kil dong",
    "lastName": "hong"
    "birthDate": "1999-11-31",
    "kycStatus": "approved",
    "idType": "drivers_license",
    "issuingCountry": "KOR"
}

# Encrypt the entire payload
payload_encrypted = encryption.encrypt(payload_data)

# Send the encrypted data as the data parameter
response = requests.post(
    url,
    headers=headers,
    data=payload_encrypted
)
```

```curl POST/Submission (Encrypted) theme={null}
curl --location 'https://rest-api.argosidentity.com/v3/submission/migration' \
--header 'x-api-key: {yourAPIKey}' \
--header 'Content-Type: application/json' \
--data 'N34SNtWaavEfgtg1g%2Bo%2B9JhQ9rp9dGUbyFNxAsHKKGH24aVQTRXYfNpFDHIGJU6Wo0RVpOupAubiDvFDuFyTkw%3D%3D'
```

### 6-2. Encrypted Response

The response includes an `isEncrypted` flag and the encrypted data:

```json result.json theme={null}
response : {
   body : {
    "data": "encrypted-string",
    "isEncrypted": true
   }
}
```
