MENU navbar-image

Introduction

API Documentation Capture

Authenticating requests

To authenticate requests, include a X-API-KEY header with the value "{YOUR_AUTH_KEY}".

All authenticated endpoints are marked with a requires authentication badge in the documentation below.

Assessment Purpose

APIs for managing assessment purpose

Get All Assessment Purpose

requires authentication

Example request:
curl --request GET \
    --get "https://api-staging.capture.co.id/api/v1/assessment-purpose" \
    --header "X-API-KEY: {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-staging.capture.co.id/api/v1/assessment-purpose"
);

const headers = {
    "X-API-KEY": "{YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.capture.co.id/api/v1/assessment-purpose';
$response = $client->get(
    $url,
    [
        'headers' => [
            'X-API-KEY' => '{YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):


{
    "status": 200,
    "message": "Get All Assessment Purpose",
    "data": [
        {
            "name": "Rekrutment",
            "id": 1,
            "created_at": "2025-01-01 10:00:00"
        }
    ],
    "meta": {
        "current_page": 1,
        "per_page": 10,
        "total": 20
    }
}
 

Request      

GET api/v1/assessment-purpose

Headers

X-API-KEY        

Example: {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

page   integer  optional    

optional Page number Example: 16

Division

APIs for managing division

Get All Division

requires authentication

Example request:
curl --request GET \
    --get "https://api-staging.capture.co.id/api/v1/divisions" \
    --header "X-API-KEY: {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-staging.capture.co.id/api/v1/divisions"
);

const headers = {
    "X-API-KEY": "{YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.capture.co.id/api/v1/divisions';
$response = $client->get(
    $url,
    [
        'headers' => [
            'X-API-KEY' => '{YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):


{
    "status": 200,
    "message": "Get All Division",
    "data": [
        {
            "name": "Divisi 1",
            "id": 1,
            "created_at": "2025-01-01 10:00:00"
        }
    ],
    "meta": {
        "current_page": 1,
        "per_page": 10,
        "total": 20
    }
}
 

Request      

GET api/v1/divisions

Headers

X-API-KEY        

Example: {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

page   integer  optional    

optional Page number Example: 16

Endpoints

GET api/v1/companies

requires authentication

Example request:
curl --request GET \
    --get "https://api-staging.capture.co.id/api/v1/companies" \
    --header "X-API-KEY: {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-staging.capture.co.id/api/v1/companies"
);

const headers = {
    "X-API-KEY": "{YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.capture.co.id/api/v1/companies';
$response = $client->get(
    $url,
    [
        'headers' => [
            'X-API-KEY' => '{YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "status": 401,
    "message": "Unauthorized"
}
 

Request      

GET api/v1/companies

Headers

X-API-KEY        

Example: {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/generate-token

requires authentication

Example request:
curl --request GET \
    --get "https://api-staging.capture.co.id/api/v1/generate-token" \
    --header "X-API-KEY: {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-staging.capture.co.id/api/v1/generate-token"
);

const headers = {
    "X-API-KEY": "{YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.capture.co.id/api/v1/generate-token';
$response = $client->get(
    $url,
    [
        'headers' => [
            'X-API-KEY' => '{YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "status": 401,
    "message": "Unauthorized"
}
 

Request      

GET api/v1/generate-token

Headers

X-API-KEY        

Example: {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/generate-token/user

requires authentication

Example request:
curl --request POST \
    "https://api-staging.capture.co.id/api/v1/generate-token/user" \
    --header "X-API-KEY: {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-staging.capture.co.id/api/v1/generate-token/user"
);

const headers = {
    "X-API-KEY": "{YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.capture.co.id/api/v1/generate-token/user';
$response = $client->post(
    $url,
    [
        'headers' => [
            'X-API-KEY' => '{YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Request      

POST api/v1/generate-token/user

Headers

X-API-KEY        

Example: {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

GET api/v1/candidates

requires authentication

Example request:
curl --request GET \
    --get "https://api-staging.capture.co.id/api/v1/candidates" \
    --header "X-API-KEY: {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"current_page\": 16,
    \"per_page\": 22,
    \"search\": \"g\",
    \"position\": \"z\",
    \"division\": \"m\"
}"
const url = new URL(
    "https://api-staging.capture.co.id/api/v1/candidates"
);

const headers = {
    "X-API-KEY": "{YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "current_page": 16,
    "per_page": 22,
    "search": "g",
    "position": "z",
    "division": "m"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.capture.co.id/api/v1/candidates';
$response = $client->get(
    $url,
    [
        'headers' => [
            'X-API-KEY' => '{YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'current_page' => 16,
            'per_page' => 22,
            'search' => 'g',
            'position' => 'z',
            'division' => 'm',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "status": 401,
    "message": "Unauthorized"
}
 

Request      

GET api/v1/candidates

Headers

X-API-KEY        

Example: {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

current_page   integer  optional    

validation.min. Example: 16

per_page   integer  optional    

validation.min validation.max. Example: 22

company_id   string  optional    

The id of an existing record in the companies table.

unit_id   string  optional    
search   string  optional    

validation.max. Example: g

position   string  optional    

validation.max. Example: z

division   string  optional    

validation.max. Example: m

level   string  optional    

The id of an existing record in the levels table.

GET api/v1/filters/options

requires authentication

Example request:
curl --request GET \
    --get "https://api-staging.capture.co.id/api/v1/filters/options" \
    --header "X-API-KEY: {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-staging.capture.co.id/api/v1/filters/options"
);

const headers = {
    "X-API-KEY": "{YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.capture.co.id/api/v1/filters/options';
$response = $client->get(
    $url,
    [
        'headers' => [
            'X-API-KEY' => '{YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (401):

Show headers
cache-control: no-cache, private
content-type: application/json
access-control-allow-origin: *
 

{
    "status": 401,
    "message": "Unauthorized"
}
 

Request      

GET api/v1/filters/options

Headers

X-API-KEY        

Example: {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

POST api/v1/comparison/ideal-profile

requires authentication

Example request:
curl --request POST \
    "https://api-staging.capture.co.id/api/v1/comparison/ideal-profile" \
    --header "X-API-KEY: {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"profile_ideal\": \"architecto\",
    \"user_ids\": []
}"
const url = new URL(
    "https://api-staging.capture.co.id/api/v1/comparison/ideal-profile"
);

const headers = {
    "X-API-KEY": "{YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "profile_ideal": "architecto",
    "user_ids": []
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.capture.co.id/api/v1/comparison/ideal-profile';
$response = $client->post(
    $url,
    [
        'headers' => [
            'X-API-KEY' => '{YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'profile_ideal' => 'architecto',
            'user_ids' => [],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Request      

POST api/v1/comparison/ideal-profile

Headers

X-API-KEY        

Example: {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

profile_ideal   string     

Example: architecto

user_ids   object     

POST api/v1/comparison/generate

requires authentication

Example request:
curl --request POST \
    "https://api-staging.capture.co.id/api/v1/comparison/generate" \
    --header "X-API-KEY: {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"profile_ideal\": \"architecto\",
    \"user_ids\": []
}"
const url = new URL(
    "https://api-staging.capture.co.id/api/v1/comparison/generate"
);

const headers = {
    "X-API-KEY": "{YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "profile_ideal": "architecto",
    "user_ids": []
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.capture.co.id/api/v1/comparison/generate';
$response = $client->post(
    $url,
    [
        'headers' => [
            'X-API-KEY' => '{YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'profile_ideal' => 'architecto',
            'user_ids' => [],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Request      

POST api/v1/comparison/generate

Headers

X-API-KEY        

Example: {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

profile_ideal   string     

Example: architecto

user_ids   object     

Form Data

APIs for managing form data

Get All Form Data

requires authentication

Example request:
curl --request GET \
    --get "https://api-staging.capture.co.id/api/v1/form-data" \
    --header "X-API-KEY: {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-staging.capture.co.id/api/v1/form-data"
);

const headers = {
    "X-API-KEY": "{YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.capture.co.id/api/v1/form-data';
$response = $client->get(
    $url,
    [
        'headers' => [
            'X-API-KEY' => '{YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):


{
    "status": 200,
    "message": "Get All Form Data",
    "data": [
        {
            "id": 1,
            "title": "Form Data",
            "created_at": "2025-01-01 10:00:00"
        }
    ],
    "meta": {
        "current_page": 1,
        "per_page": 10,
        "total": 20
    }
}
 

Request      

GET api/v1/form-data

Headers

X-API-KEY        

Example: {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

page   integer  optional    

optional Page number Example: 16

Level

APIs for managing level

Get All Level

requires authentication

Example request:
curl --request GET \
    --get "https://api-staging.capture.co.id/api/v1/levels" \
    --header "X-API-KEY: {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-staging.capture.co.id/api/v1/levels"
);

const headers = {
    "X-API-KEY": "{YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.capture.co.id/api/v1/levels';
$response = $client->get(
    $url,
    [
        'headers' => [
            'X-API-KEY' => '{YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):


{
    "status": 200,
    "message": "Get All Level",
    "data": [
        {
            "id": 1,
            "name": "Level 1",
            "created_at": "2025-01-01 10:00:00"
        }
    ],
    "meta": {
        "current_page": 1,
        "per_page": 10,
        "total": 20
    }
}
 

Request      

GET api/v1/levels

Headers

X-API-KEY        

Example: {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

page   integer  optional    

optional Page number Example: 16

Mail Template

APIs for managing mail template

Get All Mail Template

requires authentication

Example request:
curl --request GET \
    --get "https://api-staging.capture.co.id/api/v1/mail-templates/architecto" \
    --header "X-API-KEY: {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-staging.capture.co.id/api/v1/mail-templates/architecto"
);

const headers = {
    "X-API-KEY": "{YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.capture.co.id/api/v1/mail-templates/architecto';
$response = $client->get(
    $url,
    [
        'headers' => [
            'X-API-KEY' => '{YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):


{
    "status": 200,
    "message": "Get All Mail Template",
    "data": [
        {
            "id": 1,
            "code": "Mail Template 1",
            "name_code": "Mail Template 1",
            "unit_id": 1,
            "subject": "Mail Template 1",
            "content": "Mail Template 1",
            "created_at": "2025-01-01 10:00:00"
        }
    ],
    "meta": {
        "current_page": 1,
        "per_page": 10,
        "total": 20
    }
}
 

Example response (404):


{
    "status": 404,
    "message": "Unit not found"
}
 

Request      

GET api/v1/mail-templates/{unitId}

Headers

X-API-KEY        

Example: {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

unitId   string     

Example: architecto

page   integer  optional    

optional Page number Example: 16

Position

APIs for managing position

Get All Position

requires authentication

Example request:
curl --request GET \
    --get "https://api-staging.capture.co.id/api/v1/positions" \
    --header "X-API-KEY: {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"division_id\": 16
}"
const url = new URL(
    "https://api-staging.capture.co.id/api/v1/positions"
);

const headers = {
    "X-API-KEY": "{YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "division_id": 16
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.capture.co.id/api/v1/positions';
$response = $client->get(
    $url,
    [
        'headers' => [
            'X-API-KEY' => '{YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'division_id' => 16,
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):


{
    "status": 200,
    "message": "Get All Position",
    "data": [
        {
            "id": 1,
            "name": "Position 1",
            "division_id": 1,
            "created_at": "2025-01-01 10:00:00"
        }
    ],
    "meta": {
        "current_page": 1,
        "per_page": 10,
        "total": 20
    }
}
 

Example response (404):


{
    "status": 404,
    "message": "Division not found"
}
 

Request      

GET api/v1/positions

Headers

X-API-KEY        

Example: {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

page   integer  optional    

optional Page number Example: 16

division_id   integer     

division id. Example: 1

Body Parameters

division_id   integer     

Example: 16

Schedule

APIs for managing schedule

Create Schedule Individual

requires authentication

Example request:
curl --request POST \
    "https://api-staging.capture.co.id/api/v1/test/schedule/individu" \
    --header "X-API-KEY: {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"start_test\": \"2026-01-28 16:00:00\",
    \"finish_test\": \"2026-01-28 16:00:00\",
    \"purpose_assessment_id\": 1,
    \"form_data_id\": 1,
    \"procto_selfie\": true,
    \"procto_capture\": true,
    \"procto_camera\": true,
    \"test_type\": [
        1,
        2,
        3
    ],
    \"procto_ai\": true,
    \"procto_exit_page\": true,
    \"unit_id\": 1,
    \"division_id\": 1,
    \"position_id\": 1,
    \"level_id\": 1,
    \"candidates\": [
        \"architecto\"
    ],
    \"mail_template_id\": 1,
    \"sort_tests\": true,
    \"test_tags\": [
        1,
        2,
        3
    ]
}"
const url = new URL(
    "https://api-staging.capture.co.id/api/v1/test/schedule/individu"
);

const headers = {
    "X-API-KEY": "{YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "start_test": "2026-01-28 16:00:00",
    "finish_test": "2026-01-28 16:00:00",
    "purpose_assessment_id": 1,
    "form_data_id": 1,
    "procto_selfie": true,
    "procto_capture": true,
    "procto_camera": true,
    "test_type": [
        1,
        2,
        3
    ],
    "procto_ai": true,
    "procto_exit_page": true,
    "unit_id": 1,
    "division_id": 1,
    "position_id": 1,
    "level_id": 1,
    "candidates": [
        "architecto"
    ],
    "mail_template_id": 1,
    "sort_tests": true,
    "test_tags": [
        1,
        2,
        3
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.capture.co.id/api/v1/test/schedule/individu';
$response = $client->post(
    $url,
    [
        'headers' => [
            'X-API-KEY' => '{YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
        'json' => [
            'start_test' => '2026-01-28 16:00:00',
            'finish_test' => '2026-01-28 16:00:00',
            'purpose_assessment_id' => 1,
            'form_data_id' => 1,
            'procto_selfie' => true,
            'procto_capture' => true,
            'procto_camera' => true,
            'test_type' => [
                1,
                2,
                3,
            ],
            'procto_ai' => true,
            'procto_exit_page' => true,
            'unit_id' => 1,
            'division_id' => 1,
            'position_id' => 1,
            'level_id' => 1,
            'candidates' => [
                'architecto',
            ],
            'mail_template_id' => 1,
            'sort_tests' => true,
            'test_tags' => [
                1,
                2,
                3,
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):


{
    "status": 200,
    "start_test": "[DATETIME]",
    "finish_test": "[DATETIME]",
    "link": "https://capture.co.id",
    "candidates": [
        {
            "name": "[NAME]",
            "email": "[EMAIL_ADDRESS]",
            "password": "[PASSWORD]",
            "nit": "[NIT]",
            "tests": [
                {
                    "name": "Trial - Konfirmasi Kehadiran",
                    "duration": 0
                },
                {
                    "name": "Trial - Latihan Soal Pilihan Ganda",
                    "duration": 0
                },
                {
                    "name": "Trial - Latihan Soal Ranking",
                    "duration": 0
                }
            ]
        }
    ],
    "message": "Schedule Successfully"
}
 

Request      

POST api/v1/test/schedule/individu

Headers

X-API-KEY        

Example: {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

start_test   datetime     

start test. Example: 2026-01-28 16:00:00

finish_test   datetime     

finish test. Example: 2026-01-28 16:00:00

purpose_assessment_id   integer     

purpose assessment id. Example: 1

form_data_id   integer     

form data id. Example: 1

procto_selfie   boolean     

procto selfie. Example: true

procto_capture   boolean     

procto capture. Example: true

procto_camera   boolean     

procto camera. Example: true

test_type   string[]     

test type id.

procto_ai   boolean     

procto ai. Example: true

procto_exit_page   boolean     

procto exit page. Example: true

unit_id   integer     

unit id. Example: 1

division_id   integer     

division id. Example: 1

position_id   integer     

position id. Example: 1

level_id   integer     

level id. Example: 1

candidates   string[]     

List of candidates ([{"name": "John Doe", "email": "[EMAIL_ADDRESS]", "phone": "08123456789", "password": "", "is_dummy": 0}])

mail_template_id   integer  optional    

optional mail template id. Example: 1

sort_tests   boolean  optional    

optional sort tests. Example: true

test_tags   string[]  optional    

optional test tags.

Create Schedule Bulk

requires authentication

Example request:
curl --request POST \
    "https://api-staging.capture.co.id/api/v1/test/schedule/bulk" \
    --header "X-API-KEY: {YOUR_AUTH_KEY}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "start_test=2026-01-28 16:00:00"\
    --form "finish_test=2026-01-28 16:00:00"\
    --form "purpose_assessment_id=1"\
    --form "form_data_id=1"\
    --form "procto_selfie=1"\
    --form "procto_capture=1"\
    --form "procto_camera=1"\
    --form "procto_ai=1"\
    --form "procto_exit_page=1"\
    --form "unit_id=1"\
    --form "mail_template_id=1"\
    --form "sort_tests=1"\
    --form "test_tags[]=1"\
    --form "file=@/tmp/phpmWelcJ" 
const url = new URL(
    "https://api-staging.capture.co.id/api/v1/test/schedule/bulk"
);

const headers = {
    "X-API-KEY": "{YOUR_AUTH_KEY}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('start_test', '2026-01-28 16:00:00');
body.append('finish_test', '2026-01-28 16:00:00');
body.append('purpose_assessment_id', '1');
body.append('form_data_id', '1');
body.append('procto_selfie', '1');
body.append('procto_capture', '1');
body.append('procto_camera', '1');
body.append('procto_ai', '1');
body.append('procto_exit_page', '1');
body.append('unit_id', '1');
body.append('mail_template_id', '1');
body.append('sort_tests', '1');
body.append('test_tags[]', '1');
body.append('file', document.querySelector('input[name="file"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.capture.co.id/api/v1/test/schedule/bulk';
$response = $client->post(
    $url,
    [
        'headers' => [
            'X-API-KEY' => '{YOUR_AUTH_KEY}',
            'Content-Type' => 'multipart/form-data',
            'Accept' => 'application/json',
        ],
        'multipart' => [
            [
                'name' => 'start_test',
                'contents' => '2026-01-28 16:00:00'
            ],
            [
                'name' => 'finish_test',
                'contents' => '2026-01-28 16:00:00'
            ],
            [
                'name' => 'purpose_assessment_id',
                'contents' => '1'
            ],
            [
                'name' => 'form_data_id',
                'contents' => '1'
            ],
            [
                'name' => 'procto_selfie',
                'contents' => '1'
            ],
            [
                'name' => 'procto_capture',
                'contents' => '1'
            ],
            [
                'name' => 'procto_camera',
                'contents' => '1'
            ],
            [
                'name' => 'procto_ai',
                'contents' => '1'
            ],
            [
                'name' => 'procto_exit_page',
                'contents' => '1'
            ],
            [
                'name' => 'unit_id',
                'contents' => '1'
            ],
            [
                'name' => 'mail_template_id',
                'contents' => '1'
            ],
            [
                'name' => 'sort_tests',
                'contents' => '1'
            ],
            [
                'name' => 'test_tags[]',
                'contents' => '1'
            ],
            [
                'name' => 'file',
                'contents' => fopen('/tmp/phpmWelcJ', 'r')
            ],
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):


{
    "status": 200,
    "start_test": "[DATETIME]",
    "finish_test": "[DATETIME]",
    "link": "https://capture.co.id",
    "candidates": [
        {
            "name": "[NAME]",
            "email": "[EMAIL_ADDRESS]",
            "password": "[PASSWORD]",
            "nit": "[NIT]",
            "tests": [
                {
                    "name": "Trial - Konfirmasi Kehadiran",
                    "duration": 0
                },
                {
                    "name": "Trial - Latihan Soal Pilihan Ganda",
                    "duration": 0
                },
                {
                    "name": "Trial - Latihan Soal Ranking",
                    "duration": 0
                }
            ]
        }
    ],
    "message": "Schedule Successfully"
}
 

Request      

POST api/v1/test/schedule/bulk

Headers

X-API-KEY        

Example: {YOUR_AUTH_KEY}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

Body Parameters

start_test   datetime     

start test. Example: 2026-01-28 16:00:00

finish_test   datetime     

finish test. Example: 2026-01-28 16:00:00

file   file     

file candidate xls. Example: /tmp/phpmWelcJ

purpose_assessment_id   integer     

purpose assessment id. Example: 1

form_data_id   integer     

form data id. Example: 1

procto_selfie   boolean     

procto selfie. Example: true

procto_capture   boolean     

procto capture. Example: true

procto_camera   boolean     

procto camera. Example: true

procto_ai   boolean     

procto ai. Example: true

procto_exit_page   boolean     

procto exit page. Example: true

unit_id   integer     

unit id. Example: 1

mail_template_id   integer  optional    

optional mail template id. Example: 1

sort_tests   boolean  optional    

optional sort tests. Example: true

test_tags   string[]  optional    

optional test tags.

Download Excel Template

requires authentication

Download file template to import file candidate (excel format).

Example request:
curl --request GET \
    --get "https://api-staging.capture.co.id/api/v1/test/download-template-candidate" \
    --header "X-API-KEY: {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-staging.capture.co.id/api/v1/test/download-template-candidate"
);

const headers = {
    "X-API-KEY": "{YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.capture.co.id/api/v1/test/download-template-candidate';
$response = $client->get(
    $url,
    [
        'headers' => [
            'X-API-KEY' => '{YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):

Binary data -  The generated template file in excel format.
 

Request      

GET api/v1/test/download-template-candidate

Headers

X-API-KEY        

Example: {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

Test

APIs for managing test

Get All Test Availability

requires authentication

Example request:
curl --request GET \
    --get "https://api-staging.capture.co.id/api/v1/test/list" \
    --header "X-API-KEY: {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-staging.capture.co.id/api/v1/test/list"
);

const headers = {
    "X-API-KEY": "{YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.capture.co.id/api/v1/test/list';
$response = $client->get(
    $url,
    [
        'headers' => [
            'X-API-KEY' => '{YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):


{
    "status": 200,
    "message": "Get All Test",
    "data": [
        {
            "name": "Logika Berfikir",
            "id": 1,
            "duration": 60,
            "price": 1,
            "created_at": "2025-01-01 10:00:00"
        }
    ],
    "meta": {
        "current_page": 1,
        "per_page": 10,
        "total": 20
    }
}
 

Request      

GET api/v1/test/list

Headers

X-API-KEY        

Example: {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

page   integer  optional    

optional Page number Example: 16

Unit

APIs for managing unit

Get All Unit

requires authentication

Example request:
curl --request GET \
    --get "https://api-staging.capture.co.id/api/v1/units" \
    --header "X-API-KEY: {YOUR_AUTH_KEY}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://api-staging.capture.co.id/api/v1/units"
);

const headers = {
    "X-API-KEY": "{YOUR_AUTH_KEY}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());
$client = new \GuzzleHttp\Client();
$url = 'https://api-staging.capture.co.id/api/v1/units';
$response = $client->get(
    $url,
    [
        'headers' => [
            'X-API-KEY' => '{YOUR_AUTH_KEY}',
            'Content-Type' => 'application/json',
            'Accept' => 'application/json',
        ],
    ]
);
$body = $response->getBody();
print_r(json_decode((string) $body));

Example response (200):


{
    "status": 200,
    "message": "Get All Unit",
    "data": [
        {
            "id": 1,
            "name": "Unit 1",
            "created_at": "2025-01-01 10:00:00"
        }
    ],
    "meta": {
        "current_page": 1,
        "per_page": 10,
        "total": 20
    }
}
 

Request      

GET api/v1/units

Headers

X-API-KEY        

Example: {YOUR_AUTH_KEY}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

page   integer  optional    

optional Page number Example: 16