MENU navbar-image

Introduction

Industry Tuner API - A comprehensive API for authentication, user/company/expert management, projects & proposals, subscriptions, blogs, FAQs, locations, policies, site settings, and more.

This documentation aims to provide all the information you need to work with our API.

<aside>As you scroll, you'll see code examples for working with the API in different programming languages in the dark area to the right (or as part of the content on mobile).
You can switch the language used with the tabs at the top right (or from the nav menu at the top left on mobile).</aside>

Authenticating requests

To authenticate requests, include an Authorization header with the value "Bearer {YOUR_AUTH_TOKEN}".

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

You can retrieve your token by logging in through the authentication endpoints. Include the token in the Authorization header as: Bearer {YOUR_AUTH_TOKEN}.

Admin About Page

Get current about page content.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/about-page" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/about-page"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "About page content retrieved successfully",
    "data": {
        "id": 1,
        "page_title": "About Us",
        "side_image": "http://localhost/images/about/side.jpg",
        "heading": "Welcome",
        "description": "Description",
        "our_mission_text": "Mission text",
        "our_vision_text": "Vision text",
        "our_values_text": "Values text",
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

GET api/v1/admin/about-page

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Update about page content.

requires authentication

Example request:
curl --request PUT \
    "https://industry-tuner-api.test/api/v1/admin/about-page" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "page_title=About Us"\
    --form "heading=Welcome to Our Company"\
    --form "description=We are a leading company"\
    --form "our_mission_text=Our mission is to..."\
    --form "our_vision_text=Our vision is to..."\
    --form "our_values_text=Our values are..."\
    --form "side_image=@C:\Users\AMITB\AppData\Local\Temp\php3BDB.tmp" 
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/about-page"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('page_title', 'About Us');
body.append('heading', 'Welcome to Our Company');
body.append('description', 'We are a leading company');
body.append('our_mission_text', 'Our mission is to...');
body.append('our_vision_text', 'Our vision is to...');
body.append('our_values_text', 'Our values are...');
body.append('side_image', document.querySelector('input[name="side_image"]').files[0]);

fetch(url, {
    method: "PUT",
    headers,
    body,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "About page content updated successfully",
    "data": {
        "id": 1,
        "page_title": "About Us",
        "side_image": "http://localhost/images/about/side.jpg",
        "heading": "Welcome",
        "description": "Description",
        "our_mission_text": "Mission text",
        "our_vision_text": "Vision text",
        "our_values_text": "Values text",
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "page_title": [
            "The page title field is required."
        ]
    }
}
 

Request      

PUT api/v1/admin/about-page

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

Body Parameters

page_title   string  optional    

optional Page title. Example: About Us

side_image   file  optional    

optional Side image (max 5MB, jpeg/png/jpg/gif/webp). Example: C:\Users\AMITB\AppData\Local\Temp\php3BDB.tmp

heading   string  optional    

optional Heading. Example: Welcome to Our Company

description   string  optional    

optional Description. Example: We are a leading company

our_mission_text   string  optional    

optional Our mission text. Example: Our mission is to...

our_vision_text   string  optional    

optional Our vision text. Example: Our vision is to...

our_values_text   string  optional    

optional Our values text. Example: Our values are...

Update about page content.

requires authentication

Example request:
curl --request PATCH \
    "https://industry-tuner-api.test/api/v1/admin/about-page" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "page_title=About Us"\
    --form "heading=Welcome to Our Company"\
    --form "description=We are a leading company"\
    --form "our_mission_text=Our mission is to..."\
    --form "our_vision_text=Our vision is to..."\
    --form "our_values_text=Our values are..."\
    --form "side_image=@C:\Users\AMITB\AppData\Local\Temp\php4004.tmp" 
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/about-page"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('page_title', 'About Us');
body.append('heading', 'Welcome to Our Company');
body.append('description', 'We are a leading company');
body.append('our_mission_text', 'Our mission is to...');
body.append('our_vision_text', 'Our vision is to...');
body.append('our_values_text', 'Our values are...');
body.append('side_image', document.querySelector('input[name="side_image"]').files[0]);

fetch(url, {
    method: "PATCH",
    headers,
    body,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "About page content updated successfully",
    "data": {
        "id": 1,
        "page_title": "About Us",
        "side_image": "http://localhost/images/about/side.jpg",
        "heading": "Welcome",
        "description": "Description",
        "our_mission_text": "Mission text",
        "our_vision_text": "Vision text",
        "our_values_text": "Values text",
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "page_title": [
            "The page title field is required."
        ]
    }
}
 

Request      

PATCH api/v1/admin/about-page

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

Body Parameters

page_title   string  optional    

optional Page title. Example: About Us

side_image   file  optional    

optional Side image (max 5MB, jpeg/png/jpg/gif/webp). Example: C:\Users\AMITB\AppData\Local\Temp\php4004.tmp

heading   string  optional    

optional Heading. Example: Welcome to Our Company

description   string  optional    

optional Description. Example: We are a leading company

our_mission_text   string  optional    

optional Our mission text. Example: Our mission is to...

our_vision_text   string  optional    

optional Our vision text. Example: Our vision is to...

our_values_text   string  optional    

optional Our values text. Example: Our values are...

Admin Blogs

Blog Categories

List blog categories (admin).

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/blog-categories" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/blog-categories"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Blog categories retrieved",
    "data": [
        {
            "id": 1,
            "name": "Tech",
            "is_active": true,
            "blogs_count": 5,
            "created_at": "2026-01-21T12:00:00+00:00",
            "updated_at": "2026-01-21T12:00:00+00:00"
        }
    ]
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

GET api/v1/admin/blog-categories

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Create a blog category.

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/admin/blog-categories" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Technology\",
    \"is_active\": true
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/blog-categories"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Technology",
    "is_active": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (201):


{
    "success": true,
    "message": "Blog category created",
    "data": {
        "id": 1,
        "name": "Technology",
        "is_active": true,
        "blogs_count": 0,
        "created_at": "2026-01-21T12:00:00+00:00",
        "updated_at": "2026-01-21T12:00:00+00:00"
    }
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (422):


{
    "success": false,
    "message": "The name has already been taken.",
    "errors": {
        "name": [
            "The name has already been taken."
        ]
    }
}
 

Request      

POST api/v1/admin/blog-categories

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

Category name. Example: Technology

is_active   boolean  optional    

optional Whether category is active. Example: true

Show a single category (admin).

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/blog-categories/1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/blog-categories/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Blog category retrieved",
    "data": {
        "id": 1,
        "name": "Technology",
        "is_active": true,
        "blogs_count": 3,
        "created_at": "2026-01-21T12:00:00+00:00",
        "updated_at": "2026-01-21T12:00:00+00:00"
    }
}
 

Example response (404):


{
    "success": false,
    "message": "Blog category not found"
}
 

Request      

GET api/v1/admin/blog-categories/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The category ID. Example: 1

Update a category.

requires authentication

Example request:
curl --request PUT \
    "https://industry-tuner-api.test/api/v1/admin/blog-categories/1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"AI\",
    \"is_active\": false
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/blog-categories/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "AI",
    "is_active": false
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Blog category updated",
    "data": {
        "id": 1,
        "name": "AI",
        "is_active": false,
        "blogs_count": 3,
        "created_at": "2026-01-21T12:00:00+00:00",
        "updated_at": "2026-01-21T12:10:00+00:00"
    }
}
 

Example response (404):


{
    "success": false,
    "message": "Blog category not found"
}
 

Request      

PUT api/v1/admin/blog-categories/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The category ID. Example: 1

Body Parameters

name   string  optional    

optional Category name. Example: AI

is_active   boolean  optional    

optional Whether active. Example: false

Delete a category.

requires authentication

Example request:
curl --request DELETE \
    "https://industry-tuner-api.test/api/v1/admin/blog-categories/1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/blog-categories/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Blog category deleted",
    "data": null
}
 

Example response (404):


{
    "success": false,
    "message": "Blog category not found"
}
 

Request      

DELETE api/v1/admin/blog-categories/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The category ID. Example: 1

Blogs

List blogs for admin.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/blogs" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/blogs"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Blogs retrieved",
    "data": [
        {
            "id": 1,
            "name": "Launch Update",
            "blog_category_id": 2,
            "category": {
                "id": 2,
                "name": "News",
                "is_active": true,
                "blogs_count": 1
            },
            "thumbnail_image": "https://cdn/img.png",
            "description": "Short summary",
            "share_facebook": true,
            "share_twitter": false,
            "share_linkedin": true,
            "is_active": true,
            "sections": [
                {
                    "id": 1,
                    "heading": "Intro",
                    "description": "...",
                    "image": null,
                    "position": "left",
                    "button_name": null,
                    "button_url": null,
                    "order": 0
                }
            ],
            "created_at": "2026-01-21T12:00:00+00:00",
            "updated_at": "2026-01-21T12:00:00+00:00"
        }
    ]
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

GET api/v1/admin/blogs

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Create a blog with sections.

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/admin/blogs" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Launch Update\",
    \"blog_category_id\": 2,
    \"thumbnail_image\": \"https:\\/\\/cdn\\/img.png\",
    \"description\": \"Eius et animi quos velit et.\",
    \"share_facebook\": true,
    \"share_twitter\": false,
    \"share_linkedin\": true,
    \"is_active\": true,
    \"sections\": [
        \"architecto\"
    ]
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/blogs"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Launch Update",
    "blog_category_id": 2,
    "thumbnail_image": "https:\/\/cdn\/img.png",
    "description": "Eius et animi quos velit et.",
    "share_facebook": true,
    "share_twitter": false,
    "share_linkedin": true,
    "is_active": true,
    "sections": [
        "architecto"
    ]
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (201):


{
    "success": true,
    "message": "Blog created",
    "data": {
        "id": 1,
        "name": "Launch Update",
        "blog_category_id": 2,
        "thumbnail_image": "https://cdn/img.png",
        "description": "...",
        "share_facebook": true,
        "share_twitter": false,
        "share_linkedin": true,
        "is_active": true,
        "sections": [
            {
                "id": 1,
                "heading": "Intro",
                "description": "...",
                "image": null,
                "position": "left",
                "button_name": null,
                "button_url": null,
                "order": 0
            }
        ],
        "created_at": "2026-01-21T12:00:00+00:00",
        "updated_at": "2026-01-21T12:00:00+00:00"
    }
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "sections.0.heading": [
            "The heading field is required."
        ]
    }
}
 

Request      

POST api/v1/admin/blogs

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

Blog title. Example: Launch Update

blog_category_id   integer     

Category ID. Example: 2

thumbnail_image   string     

Thumbnail URL/path. Example: https://cdn/img.png

description   string     

Blog description/summary. Example: Eius et animi quos velit et.

share_facebook   boolean  optional    

optional Enable Facebook share. Example: true

share_twitter   boolean  optional    

optional Enable Twitter share. Example: false

share_linkedin   boolean  optional    

optional Enable LinkedIn share. Example: true

is_active   boolean  optional    

optional Mark blog active. Example: true

sections   string[]     

Array of blog sections.

heading   string     

Section heading. Example: Introduction

description   string     

Section body text. Example: Eius et animi quos velit et.

image   string  optional    

optional Section image URL/path. Example: architecto

position   string     

Section image position (left|right|center). Example: left

button_name   string  optional    

optional Button label. Example: Learn more

button_url   string  optional    

optional Button URL. Example: https://example.com

order   integer  optional    

optional Sort order. Example: 0

Show a blog (admin).

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/blogs/1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/blogs/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Blog retrieved",
    "data": {
        "id": 1,
        "name": "Launch Update",
        "blog_category_id": 2,
        "category": {
            "id": 2,
            "name": "News",
            "is_active": true,
            "blogs_count": 1
        },
        "thumbnail_image": "https://cdn/img.png",
        "description": "...",
        "share_facebook": true,
        "share_twitter": false,
        "share_linkedin": true,
        "is_active": true,
        "sections": [
            {
                "id": 1,
                "heading": "Intro",
                "description": "...",
                "image": null,
                "position": "left",
                "button_name": null,
                "button_url": null,
                "order": 0
            }
        ],
        "created_at": "2026-01-21T12:00:00+00:00",
        "updated_at": "2026-01-21T12:00:00+00:00"
    }
}
 

Example response (404):


{
    "success": false,
    "message": "Blog not found"
}
 

Request      

GET api/v1/admin/blogs/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

Blog ID. Example: 1

Update a blog and its sections.

requires authentication

Example request:
curl --request PUT \
    "https://industry-tuner-api.test/api/v1/admin/blogs/1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Launch Update v2\",
    \"blog_category_id\": 2,
    \"thumbnail_image\": \"https:\\/\\/cdn\\/img2.png\",
    \"description\": \"Eius et animi quos velit et.\",
    \"share_facebook\": false,
    \"share_twitter\": false,
    \"share_linkedin\": false,
    \"is_active\": false,
    \"sections\": [
        \"architecto\"
    ]
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/blogs/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Launch Update v2",
    "blog_category_id": 2,
    "thumbnail_image": "https:\/\/cdn\/img2.png",
    "description": "Eius et animi quos velit et.",
    "share_facebook": false,
    "share_twitter": false,
    "share_linkedin": false,
    "is_active": false,
    "sections": [
        "architecto"
    ]
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Blog updated",
    "data": {
        "id": 1,
        "name": "Launch Update v2",
        "blog_category_id": 2,
        "thumbnail_image": "https://cdn/img2.png",
        "description": "...",
        "share_facebook": true,
        "share_twitter": false,
        "share_linkedin": true,
        "is_active": true,
        "sections": [
            {
                "id": 1,
                "heading": "Intro",
                "description": "...",
                "image": null,
                "position": "left",
                "button_name": null,
                "button_url": null,
                "order": 0
            }
        ],
        "created_at": "2026-01-21T12:00:00+00:00",
        "updated_at": "2026-01-21T12:10:00+00:00"
    }
}
 

Example response (404):


{
    "success": false,
    "message": "Blog not found"
}
 

Example response (422):


{
    "success": false,
    "message": "One or more section ids are invalid for this blog."
}
 

Request      

PUT api/v1/admin/blogs/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

Blog ID. Example: 1

Body Parameters

name   string  optional    

optional Blog title. Example: Launch Update v2

blog_category_id   integer  optional    

optional Category ID. Example: 2

thumbnail_image   string  optional    

optional Thumbnail URL/path. Example: https://cdn/img2.png

description   string  optional    

optional Blog description/summary. Example: Eius et animi quos velit et.

share_facebook   boolean  optional    

optional Enable Facebook share. Example: false

share_twitter   boolean  optional    

optional Enable Twitter share. Example: false

share_linkedin   boolean  optional    

optional Enable LinkedIn share. Example: false

is_active   boolean  optional    

optional Mark blog active. Example: false

sections   string[]  optional    

optional Array of sections (replaces existing; omitted keeps current).

id   integer  optional    

optional Section ID for updates. Example: 16

heading   string  optional    

required_without:sections[].id Section heading. Example: architecto

description   string  optional    

required_without:sections[].id Section body text. Example: Eius et animi quos velit et.

image   string  optional    

optional Section image URL/path. Example: architecto

position   string  optional    

required_without:sections[].id Section image position (left|right|center). Example: architecto

button_name   string  optional    

optional Button label. Example: architecto

button_url   string  optional    

optional Button URL. Example: http://www.bailey.biz/quos-velit-et-fugiat-sunt-nihil-accusantium-harum.html

order   integer  optional    

optional Sort order. Example: 16

Delete a blog.

requires authentication

Example request:
curl --request DELETE \
    "https://industry-tuner-api.test/api/v1/admin/blogs/1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/blogs/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Blog deleted",
    "data": null
}
 

Example response (404):


{
    "success": false,
    "message": "Blog not found"
}
 

Request      

DELETE api/v1/admin/blogs/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

Blog ID. Example: 1

Admin Commission Settings

Get current commission (platform fee) settings.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/commission-settings" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/commission-settings"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Commission settings retrieved successfully",
    "data": {
        "id": 1,
        "platform_fee_company_percent": 10,
        "platform_fee_expert_percent": 5,
        "is_enabled": true,
        "created_at": "2026-02-12T00:00:00+00:00",
        "updated_at": "2026-02-12T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

GET api/v1/admin/commission-settings

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Update commission (platform fee) settings.

requires authentication

Example request:
curl --request PUT \
    "https://industry-tuner-api.test/api/v1/admin/commission-settings" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"platform_fee_company_percent\": 10,
    \"platform_fee_expert_percent\": 5,
    \"is_enabled\": true
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/commission-settings"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "platform_fee_company_percent": 10,
    "platform_fee_expert_percent": 5,
    "is_enabled": true
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Commission settings updated successfully",
    "data": {
        "id": 1,
        "platform_fee_company_percent": 10,
        "platform_fee_expert_percent": 5,
        "is_enabled": true,
        "created_at": "2026-02-12T00:00:00+00:00",
        "updated_at": "2026-02-12T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "platform_fee_company_percent": [
            "Platform fee for companies must not exceed 100."
        ]
    }
}
 

Request      

PUT api/v1/admin/commission-settings

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

platform_fee_company_percent   number  optional    

optional Platform fee percentage charged to companies on each milestone (0-100). Example: 10

platform_fee_expert_percent   number  optional    

optional Platform fee percentage deducted from expert payout per milestone (0-100). Example: 5

is_enabled   boolean  optional    

optional Whether commission is applied. Set to false to turn commission off entirely. Example: true

Update commission (platform fee) settings.

requires authentication

Example request:
curl --request PATCH \
    "https://industry-tuner-api.test/api/v1/admin/commission-settings" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"platform_fee_company_percent\": 10,
    \"platform_fee_expert_percent\": 5,
    \"is_enabled\": true
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/commission-settings"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "platform_fee_company_percent": 10,
    "platform_fee_expert_percent": 5,
    "is_enabled": true
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Commission settings updated successfully",
    "data": {
        "id": 1,
        "platform_fee_company_percent": 10,
        "platform_fee_expert_percent": 5,
        "is_enabled": true,
        "created_at": "2026-02-12T00:00:00+00:00",
        "updated_at": "2026-02-12T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "platform_fee_company_percent": [
            "Platform fee for companies must not exceed 100."
        ]
    }
}
 

Request      

PATCH api/v1/admin/commission-settings

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

platform_fee_company_percent   number  optional    

optional Platform fee percentage charged to companies on each milestone (0-100). Example: 10

platform_fee_expert_percent   number  optional    

optional Platform fee percentage deducted from expert payout per milestone (0-100). Example: 5

is_enabled   boolean  optional    

optional Whether commission is applied. Set to false to turn commission off entirely. Example: true

Admin Dashboard

Get admin dashboard summary: totals and recent projects, experts, companies.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/dashboard" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/dashboard"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Dashboard data retrieved successfully",
    "data": {
        "total_projects": 100,
        "total_companies": 50,
        "total_experts": 200,
        "recent_projects": [],
        "recent_experts": [],
        "recent_companies": []
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

GET api/v1/admin/dashboard

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Admin Dispute Categories

List all dispute categories (admin).

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/dispute-categories" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/dispute-categories"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

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

{
    "success": false,
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/admin/dispute-categories

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Store a new dispute category.

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/admin/dispute-categories" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"b\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/dispute-categories"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "b"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/admin/dispute-categories

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

Must not be greater than 255 characters. Example: b

Show a single dispute category.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/dispute-categories/16" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/dispute-categories/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

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

{
    "success": false,
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/admin/dispute-categories/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The ID of the dispute category. Example: 16

Update a dispute category.

requires authentication

Example request:
curl --request PUT \
    "https://industry-tuner-api.test/api/v1/admin/dispute-categories/16" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"b\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/dispute-categories/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "b"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

PUT api/v1/admin/dispute-categories/{id}

PATCH api/v1/admin/dispute-categories/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The ID of the dispute category. Example: 16

Body Parameters

name   string     

Must not be greater than 255 characters. Example: b

Delete a dispute category.

requires authentication

Example request:
curl --request DELETE \
    "https://industry-tuner-api.test/api/v1/admin/dispute-categories/16" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/dispute-categories/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/admin/dispute-categories/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The ID of the dispute category. Example: 16

Admin Disputes

List all disputes (admin).

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/disputes" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/disputes"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

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

{
    "success": false,
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/admin/disputes

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Show a single dispute (admin).

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/disputes/16" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/disputes/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

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

{
    "success": false,
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/admin/disputes/{dispute_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

dispute_id   integer     

The ID of the dispute. Example: 16

Mark a dispute as solved (set status to completed or ongoing).

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/admin/disputes/16/mark-solved" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"status\": \"completed\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/disputes/16/mark-solved"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "status": "completed"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Request      

POST api/v1/admin/disputes/{dispute_id}/mark-solved

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

dispute_id   integer     

The ID of the dispute. Example: 16

Body Parameters

status   string     

Example: completed

Must be one of:
  • ongoing
  • completed

Admin Expert Milestone Payments

List milestone payments to be done for experts (company has paid; optionally filter by expert/project).

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/expert-milestone-payments?expert_id=2&project_id=1&per_page=15" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/expert-milestone-payments"
);

const params = {
    "expert_id": "2",
    "project_id": "1",
    "per_page": "15",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Expert milestone payments retrieved successfully",
    "data": {
        "data": []
    }
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

GET api/v1/admin/expert-milestone-payments

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

expert_id   integer  optional    

optional Filter by expert (awarded user) ID. Example: 2

project_id   integer  optional    

optional Filter by project ID. Example: 1

per_page   integer  optional    

optional Per page (1-100). Example: 15

Mark expert payment as done (payment mode + upload receipt).

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/admin/expert-milestone-payments/16/mark-paid" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "payment_mode=paypal"\
    --form "receipt=@C:\Users\AMITB\AppData\Local\Temp\php4824.tmp" 
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/expert-milestone-payments/16/mark-paid"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('payment_mode', 'paypal');
body.append('receipt', document.querySelector('input[name="receipt"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Expert payment marked as done",
    "data": {}
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (404):


{
    "success": false,
    "message": "Milestone not found."
}
 

Example response (422):


{
    "success": false,
    "message": "Company has not paid this milestone yet."
}
 

Example response (422):


{
    "success": false,
    "message": "Expert payment for this milestone is already marked as done."
}
 

Request      

POST api/v1/admin/expert-milestone-payments/{milestone_payment}/mark-paid

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

URL Parameters

milestone_payment   integer     

Example: 16

Body Parameters

payment_mode   string     

paypal or bank_transfer. Example: paypal

receipt   file     

Payment receipt (jpeg, jpg, png, pdf, max 5MB). Example: C:\Users\AMITB\AppData\Local\Temp\php4824.tmp

Admin Expert Projects

List all proposals submitted by an expert.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/experts/1/proposals?per_page=15" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/experts/1/proposals"
);

const params = {
    "per_page": "15",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Proposals retrieved successfully",
    "data": {
        "data": []
    }
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (404):


{
    "success": false,
    "message": "User is not an expert."
}
 

Request      

GET api/v1/admin/experts/{expert_id}/proposals

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

expert_id   integer     

The ID of the expert. Example: 1

expert   integer     

The expert (user) ID. Example: 2

Query Parameters

per_page   integer  optional    

optional Per page (1-100). Example: 15

List all awarded projects for an expert (projects where this expert was awarded and accepted).

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/experts/1/awarded-projects?per_page=15" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/experts/1/awarded-projects"
);

const params = {
    "per_page": "15",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Awarded projects retrieved successfully",
    "data": {
        "data": []
    }
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (404):


{
    "success": false,
    "message": "User is not an expert."
}
 

Request      

GET api/v1/admin/experts/{expert_id}/awarded-projects

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

expert_id   integer     

The ID of the expert. Example: 1

expert   integer     

The expert (user) ID. Example: 2

Query Parameters

per_page   integer  optional    

optional Per page (1-100). Example: 15

List all completed projects for an expert (awarded projects with status completed).

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/experts/1/completed-projects?per_page=15" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/experts/1/completed-projects"
);

const params = {
    "per_page": "15",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Completed projects retrieved successfully",
    "data": {
        "data": []
    }
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (404):


{
    "success": false,
    "message": "User is not an expert."
}
 

Request      

GET api/v1/admin/experts/{expert_id}/completed-projects

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

expert_id   integer     

The ID of the expert. Example: 1

expert   integer     

The expert (user) ID. Example: 2

Query Parameters

per_page   integer  optional    

optional Per page (1-100). Example: 15

Admin FAQ Management

Company FAQs

Get all company FAQs.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/company-faqs" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/company-faqs"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Company FAQs retrieved",
    "data": [
        {
            "id": 1,
            "heading": "Question 1",
            "description": "Answer 1",
            "order": 0,
            "created_at": "2024-01-01T00:00:00+00:00",
            "updated_at": "2024-01-01T00:00:00+00:00"
        }
    ]
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

GET api/v1/admin/company-faqs

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Create a new company FAQ.

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/admin/company-faqs" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"heading\": \"How do I get started?\",
    \"description\": \"You can get started by creating an account.\",
    \"order\": 0
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/company-faqs"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "heading": "How do I get started?",
    "description": "You can get started by creating an account.",
    "order": 0
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (201):


{
    "success": true,
    "message": "Company FAQ created",
    "data": {
        "id": 1,
        "heading": "How do I get started?",
        "description": "You can get started by creating an account.",
        "order": 0,
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "heading": [
            "The heading field is required."
        ]
    }
}
 

Request      

POST api/v1/admin/company-faqs

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

heading   string     

The FAQ heading. Example: How do I get started?

description   string     

The FAQ description/answer. Example: You can get started by creating an account.

order   integer  optional    

optional The display order. Example: 0

Get a single company FAQ.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/company-faqs/1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/company-faqs/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Company FAQ retrieved",
    "data": {
        "id": 1,
        "heading": "Question 1",
        "description": "Answer 1",
        "order": 0,
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (404):


{
    "success": false,
    "message": "Company FAQ not found"
}
 

Request      

GET api/v1/admin/company-faqs/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The ID of the FAQ. Example: 1

Update a company FAQ.

requires authentication

Example request:
curl --request PUT \
    "https://industry-tuner-api.test/api/v1/admin/company-faqs/1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"heading\": \"How do I get started?\",
    \"description\": \"You can get started by creating an account.\",
    \"order\": 0
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/company-faqs/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "heading": "How do I get started?",
    "description": "You can get started by creating an account.",
    "order": 0
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Company FAQ updated",
    "data": {
        "id": 1,
        "heading": "How do I get started?",
        "description": "You can get started by creating an account.",
        "order": 0,
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (404):


{
    "success": false,
    "message": "Company FAQ not found"
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "heading": [
            "The heading field is required."
        ]
    }
}
 

Request      

PUT api/v1/admin/company-faqs/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The ID of the FAQ. Example: 1

Body Parameters

heading   string  optional    

optional The FAQ heading. Example: How do I get started?

description   string  optional    

optional The FAQ description/answer. Example: You can get started by creating an account.

order   integer  optional    

optional The display order. Example: 0

Delete a company FAQ.

requires authentication

Example request:
curl --request DELETE \
    "https://industry-tuner-api.test/api/v1/admin/company-faqs/1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/company-faqs/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Company FAQ deleted",
    "data": null
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (404):


{
    "success": false,
    "message": "Company FAQ not found"
}
 

Request      

DELETE api/v1/admin/company-faqs/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The ID of the FAQ. Example: 1

Expert FAQs

Get all expert FAQs.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/expert-faqs" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/expert-faqs"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Expert FAQs retrieved",
    "data": [
        {
            "id": 1,
            "heading": "Question 1",
            "description": "Answer 1",
            "order": 0,
            "created_at": "2024-01-01T00:00:00+00:00",
            "updated_at": "2024-01-01T00:00:00+00:00"
        }
    ]
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

GET api/v1/admin/expert-faqs

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Create a new expert FAQ.

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/admin/expert-faqs" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"heading\": \"How do I get started?\",
    \"description\": \"You can get started by creating an account.\",
    \"order\": 0
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/expert-faqs"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "heading": "How do I get started?",
    "description": "You can get started by creating an account.",
    "order": 0
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (201):


{
    "success": true,
    "message": "Expert FAQ created",
    "data": {
        "id": 1,
        "heading": "How do I get started?",
        "description": "You can get started by creating an account.",
        "order": 0,
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "heading": [
            "The heading field is required."
        ]
    }
}
 

Request      

POST api/v1/admin/expert-faqs

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

heading   string     

The FAQ heading. Example: How do I get started?

description   string     

The FAQ description/answer. Example: You can get started by creating an account.

order   integer  optional    

optional The display order. Example: 0

Get a single expert FAQ.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/expert-faqs/1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/expert-faqs/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Expert FAQ retrieved",
    "data": {
        "id": 1,
        "heading": "Question 1",
        "description": "Answer 1",
        "order": 0,
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (404):


{
    "success": false,
    "message": "Expert FAQ not found"
}
 

Request      

GET api/v1/admin/expert-faqs/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The ID of the FAQ. Example: 1

Update an expert FAQ.

requires authentication

Example request:
curl --request PUT \
    "https://industry-tuner-api.test/api/v1/admin/expert-faqs/1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"heading\": \"How do I get started?\",
    \"description\": \"You can get started by creating an account.\",
    \"order\": 0
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/expert-faqs/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "heading": "How do I get started?",
    "description": "You can get started by creating an account.",
    "order": 0
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Expert FAQ updated",
    "data": {
        "id": 1,
        "heading": "How do I get started?",
        "description": "You can get started by creating an account.",
        "order": 0,
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (404):


{
    "success": false,
    "message": "Expert FAQ not found"
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "heading": [
            "The heading field is required."
        ]
    }
}
 

Request      

PUT api/v1/admin/expert-faqs/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The ID of the FAQ. Example: 1

Body Parameters

heading   string  optional    

optional The FAQ heading. Example: How do I get started?

description   string  optional    

optional The FAQ description/answer. Example: You can get started by creating an account.

order   integer  optional    

optional The display order. Example: 0

Delete an expert FAQ.

requires authentication

Example request:
curl --request DELETE \
    "https://industry-tuner-api.test/api/v1/admin/expert-faqs/1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/expert-faqs/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Expert FAQ deleted",
    "data": null
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (404):


{
    "success": false,
    "message": "Expert FAQ not found"
}
 

Request      

DELETE api/v1/admin/expert-faqs/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The ID of the FAQ. Example: 1

Admin Home Page

Get current home page content.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/home-page" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/home-page"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Home page content retrieved successfully",
    "data": {
        "id": 1,
        "section1": {
            "hero_headline": "Welcome",
            "hero_description": "Description",
            "hero_image": "http://localhost/images/hero.jpg"
        },
        "section2": {
            "headline": "Section 2"
        },
        "section3": {
            "headline": "Section 3",
            "description": "Description",
            "button_name": "Click",
            "button_url": "https://example.com",
            "image": "http://localhost/images/section3.jpg"
        },
        "section4": {
            "headline": "Section 4",
            "options": [
                {
                    "image": "http://localhost/images/option1.jpg",
                    "title": "Option 1",
                    "description": "Description 1"
                }
            ]
        },
        "section5": {
            "steps": [
                {
                    "title": "Step 1",
                    "description": "Description 1"
                }
            ]
        },
        "section6": {
            "headline": "Section 6",
            "button_name": "Click",
            "button_url": "https://example.com",
            "background_image": "http://localhost/images/bg.jpg"
        },
        "section7": {
            "headline": "Section 7",
            "description": "Description"
        },
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

GET api/v1/admin/home-page

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Update home page content.

requires authentication

Example request:
curl --request PUT \
    "https://industry-tuner-api.test/api/v1/admin/home-page" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "hero_headline=Welcome to Our Platform"\
    --form "hero_description=Connect with industry experts"\
    --form "section2_headline=Our Services"\
    --form "section3_headline=Get Started"\
    --form "section3_description=Join us today"\
    --form "section3_button_name=Sign Up"\
    --form "section3_button_url=https://example.com/signup"\
    --form "section4_headline=Features"\
    --form "section4_options[]=architecto"\
    --form "section5_steps[]=architecto"\
    --form "section6_headline=Ready to Start?"\
    --form "section6_button_name=Get Started"\
    --form "section6_button_url=https://example.com/start"\
    --form "section7_headline=About Us"\
    --form "section7_description=We are a leading platform"\
    --form "hero_image=@C:\Users\AMITB\AppData\Local\Temp\php5541.tmp" \
    --form "section3_image=@C:\Users\AMITB\AppData\Local\Temp\php5542.tmp" \
    --form "section4_image=@C:\Users\AMITB\AppData\Local\Temp\php5544.tmp" \
    --form "section6_background_image=@C:\Users\AMITB\AppData\Local\Temp\php5545.tmp" 
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/home-page"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('hero_headline', 'Welcome to Our Platform');
body.append('hero_description', 'Connect with industry experts');
body.append('section2_headline', 'Our Services');
body.append('section3_headline', 'Get Started');
body.append('section3_description', 'Join us today');
body.append('section3_button_name', 'Sign Up');
body.append('section3_button_url', 'https://example.com/signup');
body.append('section4_headline', 'Features');
body.append('section4_options[]', 'architecto');
body.append('section5_steps[]', 'architecto');
body.append('section6_headline', 'Ready to Start?');
body.append('section6_button_name', 'Get Started');
body.append('section6_button_url', 'https://example.com/start');
body.append('section7_headline', 'About Us');
body.append('section7_description', 'We are a leading platform');
body.append('hero_image', document.querySelector('input[name="hero_image"]').files[0]);
body.append('section3_image', document.querySelector('input[name="section3_image"]').files[0]);
body.append('section4_image', document.querySelector('input[name="section4_image"]').files[0]);
body.append('section6_background_image', document.querySelector('input[name="section6_background_image"]').files[0]);

fetch(url, {
    method: "PUT",
    headers,
    body,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Home page content updated successfully",
    "data": {
        "id": 1,
        "section1": {
            "hero_headline": "Welcome",
            "hero_description": "Description",
            "hero_image": "http://localhost/images/hero.jpg"
        },
        "section2": {
            "headline": "Section 2"
        },
        "section3": {
            "headline": "Section 3",
            "description": "Description",
            "button_name": "Click",
            "button_url": "https://example.com",
            "image": "http://localhost/images/section3.jpg"
        },
        "section4": {
            "headline": "Section 4",
            "options": [
                {
                    "image": "http://localhost/images/option1.jpg",
                    "title": "Option 1",
                    "description": "Description 1"
                }
            ]
        },
        "section5": {
            "steps": [
                {
                    "title": "Step 1",
                    "description": "Description 1"
                }
            ]
        },
        "section6": {
            "headline": "Section 6",
            "button_name": "Click",
            "button_url": "https://example.com",
            "background_image": "http://localhost/images/bg.jpg"
        },
        "section7": {
            "headline": "Section 7",
            "description": "Description"
        },
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "hero_headline": [
            "The hero headline field is required."
        ]
    }
}
 

Request      

PUT api/v1/admin/home-page

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

Body Parameters

hero_headline   string  optional    

optional Hero headline. Example: Welcome to Our Platform

hero_description   string  optional    

optional Hero description. Example: Connect with industry experts

hero_image   file  optional    

optional Hero image (max 5MB, jpeg/png/jpg/gif/webp). Example: C:\Users\AMITB\AppData\Local\Temp\php5541.tmp

section2_headline   string  optional    

optional Section 2 headline. Example: Our Services

section3_headline   string  optional    

optional Section 3 headline. Example: Get Started

section3_description   string  optional    

optional Section 3 description. Example: Join us today

section3_button_name   string  optional    

optional Section 3 button name. Example: Sign Up

section3_button_url   string  optional    

optional Section 3 button URL. Example: https://example.com/signup

section3_image   file  optional    

optional Section 3 image (max 5MB, jpeg/png/jpg/gif/webp). Example: C:\Users\AMITB\AppData\Local\Temp\php5542.tmp

section4_headline   string  optional    

optional Section 4 headline. Example: Features

section4_options   string[]  optional    

optional Section 4 options array.

image   file  optional    

optional Option image (max 5MB, jpeg/png/jpg/gif/webp). Example: C:\Users\AMITB\AppData\Local\Temp\php5543.tmp

title   string     

Option title. Example: Feature 1

description   string     

Option description. Example: Description of feature

section4_image   file  optional    

optional Section 4 image (max 5MB, jpeg/png/jpg/gif/webp). Example: C:\Users\AMITB\AppData\Local\Temp\php5544.tmp

section5_steps   string[]  optional    

optional Section 5 steps array (must have exactly 5 steps).

title   string     

Step title. Example: Step 1

description   string     

Step description. Example: Description of step

section6_headline   string  optional    

optional Section 6 headline. Example: Ready to Start?

section6_button_name   string  optional    

optional Section 6 button name. Example: Get Started

section6_button_url   string  optional    

optional Section 6 button URL. Example: https://example.com/start

section6_background_image   file  optional    

optional Section 6 background image (max 5MB, jpeg/png/jpg/gif/webp). Example: C:\Users\AMITB\AppData\Local\Temp\php5545.tmp

section7_headline   string  optional    

optional Section 7 headline. Example: About Us

section7_description   string  optional    

optional Section 7 description. Example: We are a leading platform

Update home page content.

requires authentication

Example request:
curl --request PATCH \
    "https://industry-tuner-api.test/api/v1/admin/home-page" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "hero_headline=Welcome to Our Platform"\
    --form "hero_description=Connect with industry experts"\
    --form "section2_headline=Our Services"\
    --form "section3_headline=Get Started"\
    --form "section3_description=Join us today"\
    --form "section3_button_name=Sign Up"\
    --form "section3_button_url=https://example.com/signup"\
    --form "section4_headline=Features"\
    --form "section4_options[]=architecto"\
    --form "section5_steps[]=architecto"\
    --form "section6_headline=Ready to Start?"\
    --form "section6_button_name=Get Started"\
    --form "section6_button_url=https://example.com/start"\
    --form "section7_headline=About Us"\
    --form "section7_description=We are a leading platform"\
    --form "hero_image=@C:\Users\AMITB\AppData\Local\Temp\php5559.tmp" \
    --form "section3_image=@C:\Users\AMITB\AppData\Local\Temp\php555A.tmp" \
    --form "section4_image=@C:\Users\AMITB\AppData\Local\Temp\php555C.tmp" \
    --form "section6_background_image=@C:\Users\AMITB\AppData\Local\Temp\php555D.tmp" 
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/home-page"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('hero_headline', 'Welcome to Our Platform');
body.append('hero_description', 'Connect with industry experts');
body.append('section2_headline', 'Our Services');
body.append('section3_headline', 'Get Started');
body.append('section3_description', 'Join us today');
body.append('section3_button_name', 'Sign Up');
body.append('section3_button_url', 'https://example.com/signup');
body.append('section4_headline', 'Features');
body.append('section4_options[]', 'architecto');
body.append('section5_steps[]', 'architecto');
body.append('section6_headline', 'Ready to Start?');
body.append('section6_button_name', 'Get Started');
body.append('section6_button_url', 'https://example.com/start');
body.append('section7_headline', 'About Us');
body.append('section7_description', 'We are a leading platform');
body.append('hero_image', document.querySelector('input[name="hero_image"]').files[0]);
body.append('section3_image', document.querySelector('input[name="section3_image"]').files[0]);
body.append('section4_image', document.querySelector('input[name="section4_image"]').files[0]);
body.append('section6_background_image', document.querySelector('input[name="section6_background_image"]').files[0]);

fetch(url, {
    method: "PATCH",
    headers,
    body,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Home page content updated successfully",
    "data": {
        "id": 1,
        "section1": {
            "hero_headline": "Welcome",
            "hero_description": "Description",
            "hero_image": "http://localhost/images/hero.jpg"
        },
        "section2": {
            "headline": "Section 2"
        },
        "section3": {
            "headline": "Section 3",
            "description": "Description",
            "button_name": "Click",
            "button_url": "https://example.com",
            "image": "http://localhost/images/section3.jpg"
        },
        "section4": {
            "headline": "Section 4",
            "options": [
                {
                    "image": "http://localhost/images/option1.jpg",
                    "title": "Option 1",
                    "description": "Description 1"
                }
            ]
        },
        "section5": {
            "steps": [
                {
                    "title": "Step 1",
                    "description": "Description 1"
                }
            ]
        },
        "section6": {
            "headline": "Section 6",
            "button_name": "Click",
            "button_url": "https://example.com",
            "background_image": "http://localhost/images/bg.jpg"
        },
        "section7": {
            "headline": "Section 7",
            "description": "Description"
        },
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "hero_headline": [
            "The hero headline field is required."
        ]
    }
}
 

Request      

PATCH api/v1/admin/home-page

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

Body Parameters

hero_headline   string  optional    

optional Hero headline. Example: Welcome to Our Platform

hero_description   string  optional    

optional Hero description. Example: Connect with industry experts

hero_image   file  optional    

optional Hero image (max 5MB, jpeg/png/jpg/gif/webp). Example: C:\Users\AMITB\AppData\Local\Temp\php5559.tmp

section2_headline   string  optional    

optional Section 2 headline. Example: Our Services

section3_headline   string  optional    

optional Section 3 headline. Example: Get Started

section3_description   string  optional    

optional Section 3 description. Example: Join us today

section3_button_name   string  optional    

optional Section 3 button name. Example: Sign Up

section3_button_url   string  optional    

optional Section 3 button URL. Example: https://example.com/signup

section3_image   file  optional    

optional Section 3 image (max 5MB, jpeg/png/jpg/gif/webp). Example: C:\Users\AMITB\AppData\Local\Temp\php555A.tmp

section4_headline   string  optional    

optional Section 4 headline. Example: Features

section4_options   string[]  optional    

optional Section 4 options array.

image   file  optional    

optional Option image (max 5MB, jpeg/png/jpg/gif/webp). Example: C:\Users\AMITB\AppData\Local\Temp\php555B.tmp

title   string     

Option title. Example: Feature 1

description   string     

Option description. Example: Description of feature

section4_image   file  optional    

optional Section 4 image (max 5MB, jpeg/png/jpg/gif/webp). Example: C:\Users\AMITB\AppData\Local\Temp\php555C.tmp

section5_steps   string[]  optional    

optional Section 5 steps array (must have exactly 5 steps).

title   string     

Step title. Example: Step 1

description   string     

Step description. Example: Description of step

section6_headline   string  optional    

optional Section 6 headline. Example: Ready to Start?

section6_button_name   string  optional    

optional Section 6 button name. Example: Get Started

section6_button_url   string  optional    

optional Section 6 button URL. Example: https://example.com/start

section6_background_image   file  optional    

optional Section 6 background image (max 5MB, jpeg/png/jpg/gif/webp). Example: C:\Users\AMITB\AppData\Local\Temp\php555D.tmp

section7_headline   string  optional    

optional Section 7 headline. Example: About Us

section7_description   string  optional    

optional Section 7 description. Example: We are a leading platform

Admin Milestone Payments

List all milestone payments (paid by companies) with optional filters.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/milestone-payments?project_id=1&company_id=1&per_page=15" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/milestone-payments"
);

const params = {
    "project_id": "1",
    "company_id": "1",
    "per_page": "15",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Milestone payments retrieved successfully",
    "data": {
        "data": []
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

GET api/v1/admin/milestone-payments

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

project_id   integer  optional    

optional Filter by project ID. Example: 1

company_id   integer  optional    

optional Filter by company (project owner) user ID. Example: 1

per_page   integer  optional    

optional Per page (1-100). Example: 15

Admin Policies

Get privacy policy.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/policies/privacy-policy" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/policies/privacy-policy"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Privacy policy retrieved successfully",
    "data": {
        "id": 1,
        "type": "privacy_policy",
        "content": "Privacy policy content here...",
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

GET api/v1/admin/policies/privacy-policy

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Get terms & conditions.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/policies/terms-conditions" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/policies/terms-conditions"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Terms & conditions retrieved successfully",
    "data": {
        "id": 2,
        "type": "terms_conditions",
        "content": "Terms & conditions content here...",
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

GET api/v1/admin/policies/terms-conditions

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Get refund & cancellation policy.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/policies/refund-cancellation" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/policies/refund-cancellation"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Refund & cancellation policy retrieved successfully",
    "data": {
        "id": 3,
        "type": "refund_cancellation",
        "content": "Refund & cancellation policy content here...",
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

GET api/v1/admin/policies/refund-cancellation

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Update privacy policy.

requires authentication

Example request:
curl --request PUT \
    "https://industry-tuner-api.test/api/v1/admin/policies/privacy-policy" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"content\": \"This is the privacy policy content...\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/policies/privacy-policy"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "content": "This is the privacy policy content..."
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Privacy policy updated successfully",
    "data": {
        "id": 1,
        "type": "privacy_policy",
        "content": "Updated privacy policy content...",
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "content": [
            "The content field is required."
        ]
    }
}
 

Request      

PUT api/v1/admin/policies/privacy-policy

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

content   string     

The privacy policy content. Example: This is the privacy policy content...

Update privacy policy.

requires authentication

Example request:
curl --request PATCH \
    "https://industry-tuner-api.test/api/v1/admin/policies/privacy-policy" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"content\": \"This is the privacy policy content...\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/policies/privacy-policy"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "content": "This is the privacy policy content..."
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Privacy policy updated successfully",
    "data": {
        "id": 1,
        "type": "privacy_policy",
        "content": "Updated privacy policy content...",
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "content": [
            "The content field is required."
        ]
    }
}
 

Request      

PATCH api/v1/admin/policies/privacy-policy

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

content   string     

The privacy policy content. Example: This is the privacy policy content...

Update terms & conditions.

requires authentication

Example request:
curl --request PUT \
    "https://industry-tuner-api.test/api/v1/admin/policies/terms-conditions" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"content\": \"This is the terms & conditions content...\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/policies/terms-conditions"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "content": "This is the terms & conditions content..."
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Terms & conditions updated successfully",
    "data": {
        "id": 2,
        "type": "terms_conditions",
        "content": "Updated terms & conditions content...",
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "content": [
            "The content field is required."
        ]
    }
}
 

Request      

PUT api/v1/admin/policies/terms-conditions

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

content   string     

The terms & conditions content. Example: This is the terms & conditions content...

Update terms & conditions.

requires authentication

Example request:
curl --request PATCH \
    "https://industry-tuner-api.test/api/v1/admin/policies/terms-conditions" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"content\": \"This is the terms & conditions content...\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/policies/terms-conditions"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "content": "This is the terms & conditions content..."
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Terms & conditions updated successfully",
    "data": {
        "id": 2,
        "type": "terms_conditions",
        "content": "Updated terms & conditions content...",
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "content": [
            "The content field is required."
        ]
    }
}
 

Request      

PATCH api/v1/admin/policies/terms-conditions

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

content   string     

The terms & conditions content. Example: This is the terms & conditions content...

Update refund & cancellation policy.

requires authentication

Example request:
curl --request PUT \
    "https://industry-tuner-api.test/api/v1/admin/policies/refund-cancellation" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"content\": \"This is the refund & cancellation policy content...\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/policies/refund-cancellation"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "content": "This is the refund & cancellation policy content..."
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Refund & cancellation policy updated successfully",
    "data": {
        "id": 3,
        "type": "refund_cancellation",
        "content": "Updated refund & cancellation policy content...",
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "content": [
            "The content field is required."
        ]
    }
}
 

Request      

PUT api/v1/admin/policies/refund-cancellation

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

content   string     

The refund & cancellation policy content. Example: This is the refund & cancellation policy content...

Update refund & cancellation policy.

requires authentication

Example request:
curl --request PATCH \
    "https://industry-tuner-api.test/api/v1/admin/policies/refund-cancellation" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"content\": \"This is the refund & cancellation policy content...\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/policies/refund-cancellation"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "content": "This is the refund & cancellation policy content..."
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Refund & cancellation policy updated successfully",
    "data": {
        "id": 3,
        "type": "refund_cancellation",
        "content": "Updated refund & cancellation policy content...",
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "content": [
            "The content field is required."
        ]
    }
}
 

Request      

PATCH api/v1/admin/policies/refund-cancellation

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

content   string     

The refund & cancellation policy content. Example: This is the refund & cancellation policy content...

Admin Projects

List all projects for admin (optionally filter by company_id).

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/projects?company_id=1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/projects"
);

const params = {
    "company_id": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Projects retrieved successfully",
    "data": {
        "data": [],
        "meta": {}
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

GET api/v1/admin/projects

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

company_id   integer  optional    

optional Filter by company (user) ID. Example: 1

Get full project details for admin: project, company, all proposals, milestones with payment status.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/projects/16" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/projects/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Project details retrieved successfully",
    "data": {
        "project": {},
        "company": {},
        "proposals": [],
        "milestones": []
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (404):


{
    "success": false,
    "message": "Project not found."
}
 

Request      

GET api/v1/admin/projects/{project_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 16

Admin Site Settings

Get current site settings.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/site-settings" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/site-settings"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Site settings retrieved successfully",
    "data": {
        "id": 1,
        "favicon": "http://localhost/favicon.ico",
        "logo": "http://localhost/logos/logo.png",
        "footer_logo": "http://localhost/logos/footer-logo.png",
        "footer_description": "Company description",
        "address": "123 Main St",
        "email": "info@example.com",
        "phone": "1234567890",
        "phone_country_code": "+1",
        "facebook_url": "https://facebook.com/company",
        "instagram_url": "https://instagram.com/company",
        "linkedin_url": "https://linkedin.com/company",
        "copyright": "© 2024 Company",
        "header_image": "http://localhost/images/header.jpg",
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

GET api/v1/admin/site-settings

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Update site settings.

requires authentication

Example request:
curl --request PUT \
    "https://industry-tuner-api.test/api/v1/admin/site-settings" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "footer_description=Company description"\
    --form "address=123 Main St, City, State"\
    --form "email=info@example.com"\
    --form "phone=1234567890"\
    --form "phone_country_code=+1"\
    --form "facebook_url=https://facebook.com/company"\
    --form "instagram_url=https://instagram.com/company"\
    --form "linkedin_url=https://linkedin.com/company"\
    --form "copyright=© 2024 Company"\
    --form "favicon=@C:\Users\AMITB\AppData\Local\Temp\php577F.tmp" \
    --form "logo=@C:\Users\AMITB\AppData\Local\Temp\php5780.tmp" \
    --form "footer_logo=@C:\Users\AMITB\AppData\Local\Temp\php5781.tmp" \
    --form "header_image=@C:\Users\AMITB\AppData\Local\Temp\php5792.tmp" 
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/site-settings"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('footer_description', 'Company description');
body.append('address', '123 Main St, City, State');
body.append('email', 'info@example.com');
body.append('phone', '1234567890');
body.append('phone_country_code', '+1');
body.append('facebook_url', 'https://facebook.com/company');
body.append('instagram_url', 'https://instagram.com/company');
body.append('linkedin_url', 'https://linkedin.com/company');
body.append('copyright', '© 2024 Company');
body.append('favicon', document.querySelector('input[name="favicon"]').files[0]);
body.append('logo', document.querySelector('input[name="logo"]').files[0]);
body.append('footer_logo', document.querySelector('input[name="footer_logo"]').files[0]);
body.append('header_image', document.querySelector('input[name="header_image"]').files[0]);

fetch(url, {
    method: "PUT",
    headers,
    body,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Site settings updated successfully",
    "data": {
        "id": 1,
        "favicon": "http://localhost/favicon.ico",
        "logo": "http://localhost/logos/logo.png",
        "footer_logo": "http://localhost/logos/footer-logo.png",
        "footer_description": "Company description",
        "address": "123 Main St",
        "email": "info@example.com",
        "phone": "1234567890",
        "phone_country_code": "+1",
        "facebook_url": "https://facebook.com/company",
        "instagram_url": "https://instagram.com/company",
        "linkedin_url": "https://linkedin.com/company",
        "copyright": "© 2024 Company",
        "header_image": "http://localhost/images/header.jpg",
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "email": [
            "The email must be a valid email address."
        ]
    }
}
 

Request      

PUT api/v1/admin/site-settings

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

Body Parameters

favicon   file  optional    

optional Favicon file (max 2MB, ico/png/jpg/jpeg). Example: C:\Users\AMITB\AppData\Local\Temp\php577F.tmp

logo   file  optional    

optional Logo file (max 2MB, jpeg/png/jpg/gif). Example: C:\Users\AMITB\AppData\Local\Temp\php5780.tmp

footer_logo   file  optional    

optional Footer logo file (max 2MB, jpeg/png/jpg/gif). Example: C:\Users\AMITB\AppData\Local\Temp\php5781.tmp

footer_description   string  optional    

optional Footer description. Example: Company description

address   string  optional    

optional Address. Example: 123 Main St, City, State

email   string  optional    

optional Email address. Example: info@example.com

phone   string  optional    

optional Phone number. Example: 1234567890

phone_country_code   string  optional    

optional Phone country code. Example: +1

facebook_url   string  optional    

optional Facebook URL. Example: https://facebook.com/company

instagram_url   string  optional    

optional Instagram URL. Example: https://instagram.com/company

linkedin_url   string  optional    

optional LinkedIn URL. Example: https://linkedin.com/company

copyright   string  optional    

optional Copyright text. Example: © 2024 Company

header_image   file  optional    

optional Header image file (max 2MB, jpeg/png/jpg/gif). Example: C:\Users\AMITB\AppData\Local\Temp\php5792.tmp

Update site settings.

requires authentication

Example request:
curl --request PATCH \
    "https://industry-tuner-api.test/api/v1/admin/site-settings" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "footer_description=Company description"\
    --form "address=123 Main St, City, State"\
    --form "email=info@example.com"\
    --form "phone=1234567890"\
    --form "phone_country_code=+1"\
    --form "facebook_url=https://facebook.com/company"\
    --form "instagram_url=https://instagram.com/company"\
    --form "linkedin_url=https://linkedin.com/company"\
    --form "copyright=© 2024 Company"\
    --form "favicon=@C:\Users\AMITB\AppData\Local\Temp\php5797.tmp" \
    --form "logo=@C:\Users\AMITB\AppData\Local\Temp\php5798.tmp" \
    --form "footer_logo=@C:\Users\AMITB\AppData\Local\Temp\php5799.tmp" \
    --form "header_image=@C:\Users\AMITB\AppData\Local\Temp\php579A.tmp" 
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/site-settings"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('footer_description', 'Company description');
body.append('address', '123 Main St, City, State');
body.append('email', 'info@example.com');
body.append('phone', '1234567890');
body.append('phone_country_code', '+1');
body.append('facebook_url', 'https://facebook.com/company');
body.append('instagram_url', 'https://instagram.com/company');
body.append('linkedin_url', 'https://linkedin.com/company');
body.append('copyright', '© 2024 Company');
body.append('favicon', document.querySelector('input[name="favicon"]').files[0]);
body.append('logo', document.querySelector('input[name="logo"]').files[0]);
body.append('footer_logo', document.querySelector('input[name="footer_logo"]').files[0]);
body.append('header_image', document.querySelector('input[name="header_image"]').files[0]);

fetch(url, {
    method: "PATCH",
    headers,
    body,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Site settings updated successfully",
    "data": {
        "id": 1,
        "favicon": "http://localhost/favicon.ico",
        "logo": "http://localhost/logos/logo.png",
        "footer_logo": "http://localhost/logos/footer-logo.png",
        "footer_description": "Company description",
        "address": "123 Main St",
        "email": "info@example.com",
        "phone": "1234567890",
        "phone_country_code": "+1",
        "facebook_url": "https://facebook.com/company",
        "instagram_url": "https://instagram.com/company",
        "linkedin_url": "https://linkedin.com/company",
        "copyright": "© 2024 Company",
        "header_image": "http://localhost/images/header.jpg",
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "email": [
            "The email must be a valid email address."
        ]
    }
}
 

Request      

PATCH api/v1/admin/site-settings

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

Body Parameters

favicon   file  optional    

optional Favicon file (max 2MB, ico/png/jpg/jpeg). Example: C:\Users\AMITB\AppData\Local\Temp\php5797.tmp

logo   file  optional    

optional Logo file (max 2MB, jpeg/png/jpg/gif). Example: C:\Users\AMITB\AppData\Local\Temp\php5798.tmp

footer_logo   file  optional    

optional Footer logo file (max 2MB, jpeg/png/jpg/gif). Example: C:\Users\AMITB\AppData\Local\Temp\php5799.tmp

footer_description   string  optional    

optional Footer description. Example: Company description

address   string  optional    

optional Address. Example: 123 Main St, City, State

email   string  optional    

optional Email address. Example: info@example.com

phone   string  optional    

optional Phone number. Example: 1234567890

phone_country_code   string  optional    

optional Phone country code. Example: +1

facebook_url   string  optional    

optional Facebook URL. Example: https://facebook.com/company

instagram_url   string  optional    

optional Instagram URL. Example: https://instagram.com/company

linkedin_url   string  optional    

optional LinkedIn URL. Example: https://linkedin.com/company

copyright   string  optional    

optional Copyright text. Example: © 2024 Company

header_image   file  optional    

optional Header image file (max 2MB, jpeg/png/jpg/gif). Example: C:\Users\AMITB\AppData\Local\Temp\php579A.tmp

Admin Subscription Configuration

Get subscription configuration(s).

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/subscription-config?role=architecto" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/subscription-config"
);

const params = {
    "role": "architecto",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Subscription configuration retrieved",
    "data": {
        "role": "company",
        "price": 9999,
        "currency": "INR",
        "validity_type": "lifetime",
        "validity_value": null
    }
}
 

Example response (200):


{
    "success": true,
    "message": "Subscription configurations retrieved",
    "data": [
        {
            "role": "company",
            "price": 9999,
            "currency": "INR",
            "validity_type": "lifetime",
            "validity_value": null
        },
        {
            "role": "expert",
            "price": 4999,
            "currency": "INR",
            "validity_type": "lifetime",
            "validity_value": null
        }
    ]
}
 

Example response (200):


{
    "success": true,
    "message": "No subscription configuration found",
    "data": null
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

GET api/v1/admin/subscription-config

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

role   string  optional    

optional The role to get configuration for (company or expert). If not provided, returns all configurations. Example: architecto

Create or update subscription configuration.

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/admin/subscription-config" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"role\": \"company\",
    \"price\": 9999,
    \"currency\": \"INR\",
    \"validity_type\": \"lifetime\",
    \"validity_value\": null
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/subscription-config"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "role": "company",
    "price": 9999,
    "currency": "INR",
    "validity_type": "lifetime",
    "validity_value": null
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Subscription configuration saved",
    "data": {
        "role": "company",
        "price": 9999,
        "currency": "INR",
        "validity_type": "lifetime",
        "validity_value": null
    }
}
 

Example response (200):


{
    "success": true,
    "message": "Subscription configuration saved",
    "data": {
        "role": "expert",
        "price": 5000,
        "currency": "INR",
        "validity_type": "months",
        "validity_value": 12
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "price": [
            "The price field is required."
        ]
    }
}
 

Request      

POST api/v1/admin/subscription-config

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

role   string     

The role for this subscription plan (company or expert). Example: company

price   number     

The subscription price. Example: 9999

currency   string     

The currency code (e.g., INR, USD). Example: INR

validity_type   string     

The validity type: lifetime, days, months, or years. Example: lifetime

validity_value   integer  optional    

nullable The validity value (required if validity_type is not lifetime).

Admin User Management

Get list of all registered companies with subscription status and profile data.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/companies" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/companies"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Companies retrieved successfully",
    "data": [
        {
            "id": 1,
            "name": "Company Name",
            "company_name": "Company Name",
            "email": "company@example.com",
            "email_verified_at": "2024-01-01T00:00:00+00:00",
            "has_subscription": true,
            "subscription": {
                "id": 1,
                "status": "active",
                "lifetime": true,
                "starts_at": "2024-01-01T00:00:00+00:00",
                "ends_at": null,
                "created_at": "2024-01-01T00:00:00+00:00",
                "updated_at": "2024-01-01T00:00:00+00:00"
            },
            "profile": {
                "id": 1,
                "user_id": 1,
                "company_name": "Company Name",
                "email": "company@example.com",
                "address_line_1": "123 Main St",
                "country_id": 1,
                "state_id": 1,
                "city_id": 1,
                "zip_postal_code": "12345",
                "phone": "1234567890",
                "company_logo": "http://localhost/logos/image.jpg",
                "created_at": "2024-01-01T00:00:00+00:00",
                "updated_at": "2024-01-01T00:00:00+00:00"
            },
            "created_at": "2024-01-01T00:00:00+00:00",
            "updated_at": "2024-01-01T00:00:00+00:00"
        }
    ]
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

GET api/v1/admin/companies

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Get list of all registered experts with subscription status, payment details, and profile data.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/experts" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/experts"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Experts retrieved successfully",
    "data": [
        {
            "id": 2,
            "name": "John Doe",
            "first_name": "John",
            "last_name": "Doe",
            "email": "expert@example.com",
            "email_verified_at": "2024-01-01T00:00:00+00:00",
            "has_subscription": false,
            "subscription": null,
            "payment_details": {
                "id": 1,
                "user_id": 2,
                "payment_method": "paypal",
                "paypal_email": "expert@example.com",
                "country": null,
                "state": null,
                "city": null,
                "zip_postal_code": null,
                "address": null,
                "bank_name": null,
                "swift_code_or_ifsc": null,
                "created_at": "2024-01-01T00:00:00+00:00",
                "updated_at": "2024-01-01T00:00:00+00:00"
            },
            "profile": {
                "id": 1,
                "user_id": 2,
                "first_name": "John",
                "last_name": "Doe",
                "email": "expert@example.com",
                "designation_id": 1,
                "experience": 5,
                "bio": "Expert in software development",
                "phone": "1234567890",
                "address_line_1": "123 Main St",
                "country_id": 1,
                "state_id": 1,
                "city_id": 1,
                "zip_postal_code": "12345",
                "profile_image": "http://localhost/profiles/image.jpg",
                "created_at": "2024-01-01T00:00:00+00:00",
                "updated_at": "2024-01-01T00:00:00+00:00"
            },
            "created_at": "2024-01-01T00:00:00+00:00",
            "updated_at": "2024-01-01T00:00:00+00:00"
        }
    ]
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

GET api/v1/admin/experts

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Authentication

User Registration & Login

Register a new user (expert or company).

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/auth/register" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"user_type\": \"expert\",
    \"email\": \"john.doe@example.com\",
    \"password\": \"password123\",
    \"confirm_password\": \"password123\",
    \"agree_terms\": true,
    \"first_name\": \"John\",
    \"last_name\": \"Doe\",
    \"company_name\": \"Acme Corp\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/auth/register"
);

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

let body = {
    "user_type": "expert",
    "email": "john.doe@example.com",
    "password": "password123",
    "confirm_password": "password123",
    "agree_terms": true,
    "first_name": "John",
    "last_name": "Doe",
    "company_name": "Acme Corp"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (201):


{
    "success": true,
    "message": "Registration successful. Please verify your email.",
    "data": []
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "email": [
            "The email has already been taken."
        ]
    }
}
 

Request      

POST api/v1/auth/register

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

user_type   string     

The type of user. Must be either "expert" or "company". Example: expert

email   string     

The user's email address. Must be unique. Example: john.doe@example.com

password   string     

The user's password. Must be at least 8 characters. Example: password123

confirm_password   string     

Password confirmation. Must match password. Example: password123

agree_terms   boolean     

Whether the user agrees to the terms. Must be true. Example: true

first_name   string  optional    

required_if:user_type,expert First name (required for experts). Example: John

last_name   string  optional    

required_if:user_type,expert Last name (required for experts). Example: Doe

company_name   string  optional    

required_if:user_type,company Company name (required for companies). Example: Acme Corp

Login user (expert or company).

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/auth/login" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"john.doe@example.com\",
    \"password\": \"password123\",
    \"user_type\": \"expert\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/auth/login"
);

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

let body = {
    "email": "john.doe@example.com",
    "password": "password123",
    "user_type": "expert"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Login successful",
    "data": {
        "token": "1|abcdefghijklmnopqrstuvwxyz1234567890",
        "user": {
            "id": 1,
            "name": "John Doe",
            "first_name": "John",
            "last_name": "Doe",
            "email": "john.doe@example.com",
            "email_verified_at": "2024-01-01T00:00:00+00:00",
            "roles": [
                "expert"
            ],
            "created_at": "2024-01-01T00:00:00+00:00",
            "updated_at": "2024-01-01T00:00:00+00:00"
        },
        "role": "expert",
        "subscription": {
            "id": 1,
            "status": "active",
            "lifetime": true,
            "starts_at": "2024-01-01T00:00:00+00:00",
            "ends_at": null,
            "created_at": "2024-01-01T00:00:00+00:00",
            "updated_at": "2024-01-01T00:00:00+00:00"
        }
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Invalid credentials"
}
 

Example response (403):


{
    "success": false,
    "message": "Admin users cannot login through this endpoint. Please use the admin login."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "email": [
            "The email field is required."
        ]
    }
}
 

Request      

POST api/v1/auth/login

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

email   string     

The user's email address. Example: john.doe@example.com

password   string     

The user's password. Example: password123

user_type   string  optional    

optional The type of user. Must be either "expert" or "company". If not provided, will be auto-detected from user's role. Example: expert

Logout user.

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/auth/logout" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/auth/logout"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Logged out successfully",
    "data": []
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Request      

POST api/v1/auth/logout

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Password Management

Send password reset link.

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/auth/forgot-password" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"john.doe@example.com\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/auth/forgot-password"
);

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

let body = {
    "email": "john.doe@example.com"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Password reset link sent to your email.",
    "data": []
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "email": [
            "The email field is required."
        ]
    }
}
 

Request      

POST api/v1/auth/forgot-password

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

email   string     

The user's email address. Example: john.doe@example.com

Reset password.

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/auth/reset-password" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"token\": \"abc123def456ghi789\",
    \"email\": \"john.doe@example.com\",
    \"password\": \"newpassword123\",
    \"password_confirmation\": \"newpassword123\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/auth/reset-password"
);

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

let body = {
    "token": "abc123def456ghi789",
    "email": "john.doe@example.com",
    "password": "newpassword123",
    "password_confirmation": "newpassword123"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Password reset successful.",
    "data": []
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "token": [
            "The token field is required."
        ]
    }
}
 

Request      

POST api/v1/auth/reset-password

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

token   string     

The password reset token received via email. Example: abc123def456ghi789

email   string     

The user's email address. Example: john.doe@example.com

password   string     

The new password. Must be at least 8 characters. Example: newpassword123

password_confirmation   string     

Password confirmation. Must match password. Example: newpassword123

Change password for authenticated user.

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/auth/change-password" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"current_password\": \"oldpassword123\",
    \"password\": \"newpassword123\",
    \"password_confirmation\": \"newpassword123\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/auth/change-password"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "current_password": "oldpassword123",
    "password": "newpassword123",
    "password_confirmation": "newpassword123"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Password changed successfully.",
    "data": []
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Only expert and company users can change their password."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "current_password": [
            "The current password is incorrect."
        ]
    }
}
 

Request      

POST api/v1/auth/change-password

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

current_password   string     

The user's current password. Example: oldpassword123

password   string     

The new password. Must be at least 8 characters. Example: newpassword123

password_confirmation   string     

Password confirmation. Must match password. Example: newpassword123

Email Verification

Verify email.

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/auth/verify-email/1/abc123def456ghi789" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/auth/verify-email/1/abc123def456ghi789"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "User email verified successfully.",
    "data": []
}
 

Example response (403):


{
    "success": false,
    "message": "Invalid verification link"
}
 

Request      

GET api/v1/auth/verify-email/{id}/{hash}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The user ID. Example: 1

hash   string     

The email verification hash. Example: abc123def456ghi789

Resend email verification notification.

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/auth/resend-verification?email=john.doe%40example.com" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"gbailey@example.net\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/auth/resend-verification"
);

const params = {
    "email": "john.doe@example.com",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

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

let body = {
    "email": "gbailey@example.net"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Verification email sent successfully.",
    "data": []
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "email": [
            "The email field is required."
        ]
    }
}
 

Request      

GET api/v1/auth/resend-verification

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

email   string     

The user's email address. Example: john.doe@example.com

Body Parameters

email   string     

Must be a valid email address. The email of an existing record in the users table. Example: gbailey@example.net

Admin Authentication

Login admin user.

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/admin/auth/login" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"admin@example.com\",
    \"password\": \"adminpassword123\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/auth/login"
);

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

let body = {
    "email": "admin@example.com",
    "password": "adminpassword123"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Login successful",
    "data": {
        "token": "1|abcdefghijklmnopqrstuvwxyz1234567890",
        "user": {
            "id": 1,
            "name": "Admin User",
            "first_name": "Admin",
            "last_name": "User",
            "email": "admin@example.com",
            "email_verified_at": "2024-01-01T00:00:00+00:00",
            "roles": [
                "admin"
            ],
            "created_at": "2024-01-01T00:00:00+00:00",
            "updated_at": "2024-01-01T00:00:00+00:00"
        },
        "role": "admin"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Invalid credentials"
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "email": [
            "The email field is required."
        ]
    }
}
 

Request      

POST api/v1/admin/auth/login

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

email   string     

The admin's email address. Example: admin@example.com

password   string     

The admin's password. Example: adminpassword123

Logout admin user.

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/admin/auth/logout" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/auth/logout"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Logged out successfully",
    "data": []
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

POST api/v1/admin/auth/logout

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Company Profile

Get the current company's profile.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/company/profile" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/company/profile"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Profile retrieved successfully",
    "data": {
        "id": 1,
        "user_id": 1,
        "company_name": "Acme Corp",
        "email": "company@example.com",
        "address_line_1": "123 Main St",
        "country_id": 1,
        "state_id": 1,
        "city_id": 1,
        "zip_postal_code": "12345",
        "phone": "1234567890",
        "company_logo": "http://localhost/storage/logos/image.jpg",
        "created_at": "2026-01-15T10:00:00+00:00",
        "updated_at": "2026-01-15T10:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Only companies can access this endpoint."
}
 

Request      

GET api/v1/company/profile

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Update or create the company's profile.

requires authentication

Example request:
curl --request PUT \
    "https://industry-tuner-api.test/api/v1/company/profile" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "company_name=Acme Corporation"\
    --form "email=company@example.com"\
    --form "address_line_1=123 Main Street"\
    --form "address_line_2=Suite 100"\
    --form "landmark=Near Central Park"\
    --form "country_id=1"\
    --form "state_id=1"\
    --form "city_id=1"\
    --form "zip_postal_code=12345"\
    --form "phone=1234567890"\
    --form "phone_country_code_id=1"\
    --form "company_logo=@C:\Users\AMITB\AppData\Local\Temp\php4CDA.tmp" 
const url = new URL(
    "https://industry-tuner-api.test/api/v1/company/profile"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('company_name', 'Acme Corporation');
body.append('email', 'company@example.com');
body.append('address_line_1', '123 Main Street');
body.append('address_line_2', 'Suite 100');
body.append('landmark', 'Near Central Park');
body.append('country_id', '1');
body.append('state_id', '1');
body.append('city_id', '1');
body.append('zip_postal_code', '12345');
body.append('phone', '1234567890');
body.append('phone_country_code_id', '1');
body.append('company_logo', document.querySelector('input[name="company_logo"]').files[0]);

fetch(url, {
    method: "PUT",
    headers,
    body,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Profile updated successfully",
    "data": {
        "id": 1,
        "user_id": 1,
        "company_name": "Acme Corp",
        "email": "company@example.com",
        "address_line_1": "123 Main St",
        "country_id": 1,
        "state_id": 1,
        "city_id": 1,
        "zip_postal_code": "12345",
        "phone": "1234567890",
        "company_logo": "http://localhost/storage/logos/image.jpg",
        "created_at": "2026-01-15T10:00:00+00:00",
        "updated_at": "2026-01-15T10:00:00+00:00"
    }
}
 

Example response (201):


{
    "success": true,
    "message": "Profile created successfully",
    "data": {
        "id": 1,
        "user_id": 1,
        "company_name": "Acme Corp",
        "email": "company@example.com",
        "address_line_1": "123 Main St",
        "country_id": 1,
        "state_id": 1,
        "city_id": 1,
        "zip_postal_code": "12345",
        "phone": "1234567890",
        "company_logo": null,
        "created_at": "2026-01-15T10:00:00+00:00",
        "updated_at": "2026-01-15T10:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Only companies can access this endpoint."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "email": [
            "The email has already been taken."
        ]
    }
}
 

Request      

PUT api/v1/company/profile

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

Body Parameters

company_name   string  optional    

optional Company name. Example: Acme Corporation

email   string  optional    

optional Email address. Example: company@example.com

address_line_1   string  optional    

optional Address line 1. Example: 123 Main Street

address_line_2   string  optional    

optional Address line 2. Example: Suite 100

landmark   string  optional    

optional Landmark. Example: Near Central Park

country_id   integer  optional    

optional Country ID. Example: 1

state_id   integer  optional    

optional State ID. Example: 1

city_id   integer  optional    

optional City ID. Example: 1

zip_postal_code   string  optional    

optional ZIP/Postal code. Example: 12345

phone   string  optional    

optional Phone number. Example: 1234567890

phone_country_code_id   integer  optional    

optional Phone country code ID. Example: 1

company_logo   file  optional    

optional Company logo file (max 2MB, jpeg/png/jpg/gif). Example: C:\Users\AMITB\AppData\Local\Temp\php4CDA.tmp

Contact

Store a new contact form submission.

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/contact" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"John Doe\",
    \"email\": \"john@example.com\",
    \"phone\": \"+1234567890\",
    \"message\": \"Hello, I would like to know more about your services.\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/contact"
);

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

let body = {
    "name": "John Doe",
    "email": "john@example.com",
    "phone": "+1234567890",
    "message": "Hello, I would like to know more about your services."
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Contact form submitted successfully",
    "data": {
        "id": 1,
        "name": "John Doe",
        "email": "john@example.com",
        "phone": "+1234567890",
        "message": "Hello, I would like to know more about your services.",
        "created_at": "2024-01-11T16:00:00+00:00",
        "updated_at": "2024-01-11T16:00:00+00:00"
    }
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "name": [
            "Name is required."
        ],
        "email": [
            "Email is required."
        ]
    }
}
 

Request      

POST api/v1/contact

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

The name of the contact. Example: John Doe

email   string     

The email address of the contact. Example: john@example.com

phone   string  optional    

optional The phone number of the contact. Example: +1234567890

message   string     

The message from the contact. Example: Hello, I would like to know more about your services.

Get list of all contact form submissions (Admin only).

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/contacts" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/contacts"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Contacts retrieved successfully",
    "data": [
        {
            "id": 1,
            "name": "John Doe",
            "email": "john@example.com",
            "phone": "+1234567890",
            "message": "Hello, I would like to know more about your services.",
            "created_at": "2024-01-11T16:00:00+00:00",
            "updated_at": "2024-01-11T16:00:00+00:00"
        }
    ]
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

GET api/v1/admin/contacts

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Delete a contact form submission (Admin only).

requires authentication

Example request:
curl --request DELETE \
    "https://industry-tuner-api.test/api/v1/admin/contacts/1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/contacts/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Contact deleted successfully",
    "data": null
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (404):


{
    "success": false,
    "message": "Contact not found."
}
 

Request      

DELETE api/v1/admin/contacts/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The ID of the contact to delete. Example: 1

Designation

Get list of all designations (Public endpoint for frontend users).

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/designations?is_active=1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/designations"
);

const params = {
    "is_active": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Designations retrieved successfully",
    "data": [
        {
            "id": 1,
            "name": "Software Engineer",
            "description": "Develops software applications",
            "is_active": true,
            "created_at": "2024-01-14 11:32:19",
            "updated_at": "2024-01-14 11:32:19"
        }
    ]
}
 

Request      

GET api/v1/designations

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

is_active   boolean  optional    

Filter by active status. Example: true

Get list of all designations (Admin only).

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/designations?is_active=1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/designations"
);

const params = {
    "is_active": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Designations retrieved successfully",
    "data": [
        {
            "id": 1,
            "name": "Software Engineer",
            "description": "Develops software applications",
            "is_active": true,
            "created_at": "2024-01-14 11:32:19",
            "updated_at": "2024-01-14 11:32:19"
        }
    ]
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

GET api/v1/admin/designations

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

is_active   boolean  optional    

Filter by active status. Example: true

Store a new designation (Admin only).

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/admin/designations" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Software Engineer\",
    \"description\": \"Develops software applications\",
    \"is_active\": true
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/designations"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Software Engineer",
    "description": "Develops software applications",
    "is_active": true
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (201):


{
    "success": true,
    "message": "Designation created successfully",
    "data": {
        "id": 1,
        "name": "Software Engineer",
        "description": "Develops software applications",
        "is_active": true,
        "created_at": "2024-01-14 11:32:19",
        "updated_at": "2024-01-14 11:32:19"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "name": [
            "Name is required."
        ]
    }
}
 

Request      

POST api/v1/admin/designations

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

name   string     

The name of the designation. Example: Software Engineer

description   string  optional    

optional The description of the designation. Example: Develops software applications

is_active   boolean  optional    

optional Whether the designation is active. Defaults to true. Example: true

Get a specific designation (Admin only).

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/designations/1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/designations/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Designation retrieved successfully",
    "data": {
        "id": 1,
        "name": "Software Engineer",
        "description": "Develops software applications",
        "is_active": true,
        "created_at": "2024-01-14 11:32:19",
        "updated_at": "2024-01-14 11:32:19"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (404):


{
    "success": false,
    "message": "Designation not found."
}
 

Request      

GET api/v1/admin/designations/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The ID of the designation. Example: 1

Update a designation (Admin only).

requires authentication

Example request:
curl --request PUT \
    "https://industry-tuner-api.test/api/v1/admin/designations/1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Senior Software Engineer\",
    \"description\": \"Develops and maintains software applications\",
    \"is_active\": true
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/designations/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Senior Software Engineer",
    "description": "Develops and maintains software applications",
    "is_active": true
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Designation updated successfully",
    "data": {
        "id": 1,
        "name": "Senior Software Engineer",
        "description": "Develops and maintains software applications",
        "is_active": true,
        "created_at": "2024-01-14 11:32:19",
        "updated_at": "2024-01-14 11:33:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (404):


{
    "success": false,
    "message": "Designation not found."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "name": [
            "Name is required."
        ]
    }
}
 

Request      

PUT api/v1/admin/designations/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The ID of the designation. Example: 1

Body Parameters

name   string     

The name of the designation. Example: Senior Software Engineer

description   string  optional    

optional The description of the designation. Example: Develops and maintains software applications

is_active   boolean  optional    

optional Whether the designation is active. Example: true

Delete a designation (Admin only).

requires authentication

Example request:
curl --request DELETE \
    "https://industry-tuner-api.test/api/v1/admin/designations/1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/designations/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Designation deleted successfully",
    "data": null
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (404):


{
    "success": false,
    "message": "Designation not found."
}
 

Request      

DELETE api/v1/admin/designations/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The ID of the designation to delete. Example: 1

Dispute Categories

List dispute categories (public - for dropdown when raising dispute).

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/dispute-categories" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/dispute-categories"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):

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

{
    "success": true,
    "message": "Dispute categories retrieved successfully",
    "data": []
}
 

Request      

GET api/v1/dispute-categories

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Disputes

Get form data for raising a dispute: dispute categories and eligible projects.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/disputes/form-data" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/disputes/form-data"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

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

{
    "success": false,
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/disputes/form-data

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

List disputes for the logged-in company or expert.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/disputes" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/disputes"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

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

{
    "success": false,
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/disputes

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Store a new dispute.

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/disputes" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "subject=b"\
    --form "dispute_category_id=16"\
    --form "project_id=16"\
    --form "description=Eius et animi quos velit et."\
    --form "files[]=@C:\Users\AMITB\AppData\Local\Temp\php53EF.tmp" 
const url = new URL(
    "https://industry-tuner-api.test/api/v1/disputes"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('subject', 'b');
body.append('dispute_category_id', '16');
body.append('project_id', '16');
body.append('description', 'Eius et animi quos velit et.');
body.append('files[]', document.querySelector('input[name="files[]"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());

Request      

POST api/v1/disputes

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

Body Parameters

subject   string     

Must not be greater than 255 characters. Example: b

dispute_category_id   integer     

The id of an existing record in the dispute_categories table. Example: 16

project_id   integer     

The id of an existing record in the projects table. Example: 16

description   string     

Example: Eius et animi quos velit et.

files   file[]  optional    

Must be a file. Must not be greater than 10240 kilobytes.

Show a single dispute.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/disputes/16" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/disputes/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (401):

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

{
    "success": false,
    "message": "Unauthenticated."
}
 

Request      

GET api/v1/disputes/{dispute_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

dispute_id   integer     

The ID of the dispute. Example: 16

Update a dispute (only ongoing disputes).

requires authentication

Example request:
curl --request PUT \
    "https://industry-tuner-api.test/api/v1/disputes/16" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "subject=b"\
    --form "dispute_category_id=16"\
    --form "project_id=16"\
    --form "description=Eius et animi quos velit et."\
    --form "files[]=@C:\Users\AMITB\AppData\Local\Temp\php5410.tmp" 
const url = new URL(
    "https://industry-tuner-api.test/api/v1/disputes/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('subject', 'b');
body.append('dispute_category_id', '16');
body.append('project_id', '16');
body.append('description', 'Eius et animi quos velit et.');
body.append('files[]', document.querySelector('input[name="files[]"]').files[0]);

fetch(url, {
    method: "PUT",
    headers,
    body,
}).then(response => response.json());

Request      

PUT api/v1/disputes/{dispute_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

URL Parameters

dispute_id   integer     

The ID of the dispute. Example: 16

Body Parameters

subject   string  optional    

Must not be greater than 255 characters. Example: b

dispute_category_id   integer  optional    

The id of an existing record in the dispute_categories table. Example: 16

project_id   integer  optional    

The id of an existing record in the projects table. Example: 16

description   string  optional    

Example: Eius et animi quos velit et.

files   file[]  optional    

Must be a file. Must not be greater than 10240 kilobytes.

Update a dispute (only ongoing disputes).

requires authentication

Example request:
curl --request PATCH \
    "https://industry-tuner-api.test/api/v1/disputes/16" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "subject=b"\
    --form "dispute_category_id=16"\
    --form "project_id=16"\
    --form "description=Eius et animi quos velit et."\
    --form "files[]=@C:\Users\AMITB\AppData\Local\Temp\php5420.tmp" 
const url = new URL(
    "https://industry-tuner-api.test/api/v1/disputes/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('subject', 'b');
body.append('dispute_category_id', '16');
body.append('project_id', '16');
body.append('description', 'Eius et animi quos velit et.');
body.append('files[]', document.querySelector('input[name="files[]"]').files[0]);

fetch(url, {
    method: "PATCH",
    headers,
    body,
}).then(response => response.json());

Request      

PATCH api/v1/disputes/{dispute_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

URL Parameters

dispute_id   integer     

The ID of the dispute. Example: 16

Body Parameters

subject   string  optional    

Must not be greater than 255 characters. Example: b

dispute_category_id   integer  optional    

The id of an existing record in the dispute_categories table. Example: 16

project_id   integer  optional    

The id of an existing record in the projects table. Example: 16

description   string  optional    

Example: Eius et animi quos velit et.

files   file[]  optional    

Must be a file. Must not be greater than 10240 kilobytes.

Delete a dispute (only ongoing disputes).

requires authentication

Example request:
curl --request DELETE \
    "https://industry-tuner-api.test/api/v1/disputes/16" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/disputes/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Request      

DELETE api/v1/disputes/{dispute_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

dispute_id   integer     

The ID of the dispute. Example: 16

Expert Payment Details

Get the current expert's payment details.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/expert/payment-details" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/expert/payment-details"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Payment details retrieved successfully",
    "data": {
        "id": 1,
        "user_id": 1,
        "payment_method": "paypal",
        "paypal_email": "expert@example.com",
        "country_id": null,
        "state_id": null,
        "city_id": null,
        "zip_postal_code": null,
        "address": null,
        "bank_name": null,
        "swift_code_or_ifsc": null,
        "country": null,
        "state": null,
        "city": null,
        "created_at": "2026-01-14T12:00:00+00:00",
        "updated_at": "2026-01-14T12:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Only experts can access this endpoint."
}
 

Request      

GET api/v1/expert/payment-details

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Update or create the expert's payment details.

requires authentication

Example request:
curl --request PUT \
    "https://industry-tuner-api.test/api/v1/expert/payment-details" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"payment_method\": \"paypal\",
    \"paypal_email\": \"expert@example.com\",
    \"country_id\": 1,
    \"state_id\": 1,
    \"city_id\": 1,
    \"zip_postal_code\": \"90001\",
    \"address\": \"123 Main Street\",
    \"bank_name\": \"Bank of America\",
    \"swift_code_or_ifsc\": \"BOFAUS3N\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/expert/payment-details"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "payment_method": "paypal",
    "paypal_email": "expert@example.com",
    "country_id": 1,
    "state_id": 1,
    "city_id": 1,
    "zip_postal_code": "90001",
    "address": "123 Main Street",
    "bank_name": "Bank of America",
    "swift_code_or_ifsc": "BOFAUS3N"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Payment details updated successfully",
    "data": {
        "id": 1,
        "user_id": 1,
        "payment_method": "paypal",
        "paypal_email": "expert@example.com",
        "country": null,
        "state": null,
        "city": null,
        "zip_postal_code": null,
        "address": null,
        "bank_name": null,
        "swift_code_or_ifsc": null,
        "created_at": "2026-01-14T12:00:00+00:00",
        "updated_at": "2026-01-14T12:00:00+00:00"
    }
}
 

Example response (201):


{
    "success": true,
    "message": "Payment details created successfully",
    "data": {
        "id": 1,
        "user_id": 1,
        "payment_method": "bank_transfer",
        "paypal_email": null,
        "country_id": 1,
        "state_id": 1,
        "city_id": 1,
        "zip_postal_code": "90001",
        "address": "123 Main Street",
        "bank_name": "Bank of America",
        "swift_code_or_ifsc": "BOFAUS3N",
        "country": {
            "id": 1,
            "name": "United States"
        },
        "state": {
            "id": 1,
            "name": "California"
        },
        "city": {
            "id": 1,
            "name": "Los Angeles"
        },
        "created_at": "2026-01-14T12:00:00+00:00",
        "updated_at": "2026-01-14T12:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Only experts can access this endpoint."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "payment_method": [
            "The payment method field is required."
        ]
    }
}
 

Request      

PUT api/v1/expert/payment-details

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

payment_method   string     

The payment method. Must be either "bank_transfer" or "paypal". Example: paypal

paypal_email   string  optional    

required_if:payment_method,paypal The PayPal email address. Example: expert@example.com

country_id   integer  optional    

required_if:payment_method,bank_transfer The country ID. Example: 1

state_id   integer  optional    

required_if:payment_method,bank_transfer The state ID. Example: 1

city_id   integer  optional    

required_if:payment_method,bank_transfer The city ID. Example: 1

zip_postal_code   string  optional    

required_if:payment_method,bank_transfer The ZIP/Postal code. Example: 90001

address   string  optional    

required_if:payment_method,bank_transfer The address. Example: 123 Main Street

bank_name   string  optional    

required_if:payment_method,bank_transfer The bank name. Example: Bank of America

swift_code_or_ifsc   string  optional    

required_if:payment_method,bank_transfer The SWIFT code or IFSC code. Example: BOFAUS3N

Expert Profile

Get the current expert's profile.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/expert/profile" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/expert/profile"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Profile retrieved successfully",
    "data": {
        "id": 1,
        "user_id": 1,
        "first_name": "John",
        "last_name": "Doe",
        "email": "expert@example.com",
        "designation_id": 1,
        "experience": 5,
        "bio": "Expert in software development",
        "phone": "1234567890",
        "address_line_1": "123 Main St",
        "country_id": 1,
        "state_id": 1,
        "city_id": 1,
        "zip_postal_code": "12345",
        "profile_image": "http://localhost/storage/profiles/image.jpg",
        "created_at": "2026-01-15T05:14:18+00:00",
        "updated_at": "2026-01-15T05:14:18+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Only experts can access this endpoint."
}
 

Request      

GET api/v1/expert/profile

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Update or create the expert's profile.

requires authentication

Example request:
curl --request PUT \
    "https://industry-tuner-api.test/api/v1/expert/profile" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "first_name=John"\
    --form "last_name=Doe"\
    --form "email=expert@example.com"\
    --form "designation_id=1"\
    --form "experience=5"\
    --form "bio=Expert in software development"\
    --form "phone=1234567890"\
    --form "phone_country_code_id=1"\
    --form "address_line_1=123 Main Street"\
    --form "address_line_2=Apt 4B"\
    --form "landmark=Near Central Park"\
    --form "country_id=1"\
    --form "state_id=1"\
    --form "city_id=1"\
    --form "zip_postal_code=12345"\
    --form "profile_image=@C:\Users\AMITB\AppData\Local\Temp\php5480.tmp" 
const url = new URL(
    "https://industry-tuner-api.test/api/v1/expert/profile"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('first_name', 'John');
body.append('last_name', 'Doe');
body.append('email', 'expert@example.com');
body.append('designation_id', '1');
body.append('experience', '5');
body.append('bio', 'Expert in software development');
body.append('phone', '1234567890');
body.append('phone_country_code_id', '1');
body.append('address_line_1', '123 Main Street');
body.append('address_line_2', 'Apt 4B');
body.append('landmark', 'Near Central Park');
body.append('country_id', '1');
body.append('state_id', '1');
body.append('city_id', '1');
body.append('zip_postal_code', '12345');
body.append('profile_image', document.querySelector('input[name="profile_image"]').files[0]);

fetch(url, {
    method: "PUT",
    headers,
    body,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Profile updated successfully",
    "data": {
        "id": 1,
        "user_id": 1,
        "first_name": "John",
        "last_name": "Doe",
        "email": "expert@example.com",
        "designation_id": 1,
        "experience": 5,
        "bio": "Expert in software development",
        "phone": "1234567890",
        "address_line_1": "123 Main St",
        "country_id": 1,
        "state_id": 1,
        "city_id": 1,
        "zip_postal_code": "12345",
        "profile_image": "http://localhost/storage/profiles/image.jpg",
        "created_at": "2026-01-15T05:14:18+00:00",
        "updated_at": "2026-01-15T05:14:18+00:00"
    }
}
 

Example response (201):


{
    "success": true,
    "message": "Profile created successfully",
    "data": {
        "id": 1,
        "user_id": 1,
        "first_name": "John",
        "last_name": "Doe",
        "email": "expert@example.com",
        "designation_id": 1,
        "experience": 5,
        "bio": "Expert in software development",
        "phone": "1234567890",
        "address_line_1": "123 Main St",
        "country_id": 1,
        "state_id": 1,
        "city_id": 1,
        "zip_postal_code": "12345",
        "profile_image": null,
        "created_at": "2026-01-15T05:14:18+00:00",
        "updated_at": "2026-01-15T05:14:18+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Only experts can access this endpoint."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "email": [
            "The email has already been taken."
        ]
    }
}
 

Request      

PUT api/v1/expert/profile

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

Body Parameters

first_name   string  optional    

optional First name. Example: John

last_name   string  optional    

optional Last name. Example: Doe

email   string  optional    

optional Email address. Example: expert@example.com

designation_id   integer  optional    

optional Designation ID. Example: 1

experience   integer  optional    

optional Experience in years. Example: 5

bio   string  optional    

optional Bio/Description. Example: Expert in software development

phone   string  optional    

optional Phone number. Example: 1234567890

phone_country_code_id   integer  optional    

optional Phone country code ID. Example: 1

address_line_1   string  optional    

optional Address line 1. Example: 123 Main Street

address_line_2   string  optional    

optional Address line 2. Example: Apt 4B

landmark   string  optional    

optional Landmark. Example: Near Central Park

country_id   integer  optional    

optional Country ID. Example: 1

state_id   integer  optional    

optional State ID. Example: 1

city_id   integer  optional    

optional City ID. Example: 1

zip_postal_code   string  optional    

optional ZIP/Postal code. Example: 12345

profile_image   file  optional    

optional Profile image file (max 2MB, jpeg/png/jpg/gif). Example: C:\Users\AMITB\AppData\Local\Temp\php5480.tmp

Industry Type

Get list of all industry types (Public endpoint for frontend users).

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/industry-types?is_active=1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/industry-types"
);

const params = {
    "is_active": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Industry types retrieved successfully",
    "data": [
        {
            "id": 1,
            "name": "Technology",
            "description": "Technology industry",
            "image": "http://localhost/industry-types/tech.jpg",
            "is_active": true,
            "created_at": "2024-01-16 03:26:06",
            "updated_at": "2024-01-16 03:26:06"
        }
    ]
}
 

Request      

GET api/v1/industry-types

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

is_active   boolean  optional    

Filter by active status. Example: true

Get list of all industry types (Admin only).

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/industry-types?is_active=1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/industry-types"
);

const params = {
    "is_active": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Industry types retrieved successfully",
    "data": [
        {
            "id": 1,
            "name": "Technology",
            "description": "Technology industry",
            "image": "http://localhost/industry-types/tech.jpg",
            "is_active": true,
            "created_at": "2024-01-16 03:26:06",
            "updated_at": "2024-01-16 03:26:06"
        }
    ]
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

GET api/v1/admin/industry-types

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

is_active   boolean  optional    

Filter by active status. Example: true

Store a new industry type (Admin only).

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/admin/industry-types" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "name=Technology"\
    --form "description=Technology industry"\
    --form "is_active=1"\
    --form "image=@C:\Users\AMITB\AppData\Local\Temp\php557E.tmp" 
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/industry-types"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('name', 'Technology');
body.append('description', 'Technology industry');
body.append('is_active', '1');
body.append('image', document.querySelector('input[name="image"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());

Example response (201):


{
    "success": true,
    "message": "Industry type created successfully",
    "data": {
        "id": 1,
        "name": "Technology",
        "description": "Technology industry",
        "image": "http://localhost/industry-types/tech.jpg",
        "is_active": true,
        "created_at": "2024-01-16 03:26:06",
        "updated_at": "2024-01-16 03:26:06"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "name": [
            "Name is required."
        ]
    }
}
 

Request      

POST api/v1/admin/industry-types

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

Body Parameters

name   string     

The name of the industry type. Example: Technology

description   string  optional    

optional The description of the industry type. Example: Technology industry

image   file  optional    

optional Industry type image (max 2MB, jpeg/png/jpg/gif). Example: C:\Users\AMITB\AppData\Local\Temp\php557E.tmp

is_active   boolean  optional    

optional Whether the industry type is active. Defaults to true. Example: true

Update an industry type (Admin only).

requires authentication

Example request:
curl --request PUT \
    "https://industry-tuner-api.test/api/v1/admin/industry-types/1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "name=Information Technology"\
    --form "description=Information Technology industry"\
    --form "is_active=1"\
    --form "image=@C:\Users\AMITB\AppData\Local\Temp\php5580.tmp" 
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/industry-types/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('name', 'Information Technology');
body.append('description', 'Information Technology industry');
body.append('is_active', '1');
body.append('image', document.querySelector('input[name="image"]').files[0]);

fetch(url, {
    method: "PUT",
    headers,
    body,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Industry type updated successfully",
    "data": {
        "id": 1,
        "name": "Information Technology",
        "description": "Information Technology industry",
        "image": "http://localhost/industry-types/tech.jpg",
        "is_active": true,
        "created_at": "2024-01-16 03:26:06",
        "updated_at": "2024-01-16 03:27:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (404):


{
    "success": false,
    "message": "Industry type not found."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "name": [
            "Name is required."
        ]
    }
}
 

Request      

PUT api/v1/admin/industry-types/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

URL Parameters

id   integer     

The ID of the industry type. Example: 1

Body Parameters

name   string     

The name of the industry type. Example: Information Technology

description   string  optional    

optional The description of the industry type. Example: Information Technology industry

image   file  optional    

optional Industry type image (max 2MB, jpeg/png/jpg/gif). Example: C:\Users\AMITB\AppData\Local\Temp\php5580.tmp

is_active   boolean  optional    

optional Whether the industry type is active. Example: true

Delete an industry type (Admin only).

requires authentication

Example request:
curl --request DELETE \
    "https://industry-tuner-api.test/api/v1/admin/industry-types/1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/industry-types/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Industry type deleted successfully",
    "data": null
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (404):


{
    "success": false,
    "message": "Industry type not found."
}
 

Request      

DELETE api/v1/admin/industry-types/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The ID of the industry type to delete. Example: 1

Location

Get list of all active countries.

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/location/countries" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/location/countries"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Countries retrieved successfully",
    "data": [
        {
            "id": 1,
            "name": "United States",
            "code": "US",
            "code3": "USA",
            "is_active": true,
            "sort_order": 0
        }
    ]
}
 

Request      

GET api/v1/location/countries

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Get list of all active states for a specific country.

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/location/countries/architecto/states" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/location/countries/architecto/states"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "States retrieved successfully",
    "data": [
        {
            "id": 1,
            "country_id": 1,
            "name": "California",
            "code": "CA",
            "is_active": true,
            "sort_order": 0
        }
    ]
}
 

Example response (404):


{
    "success": false,
    "message": "Country not found."
}
 

Request      

GET api/v1/location/countries/{countryId}/states

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

countryId   string     

Example: architecto

country_id   integer     

The ID of the country. Example: 1

Get list of all active cities for a specific state.

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/location/states/architecto/cities" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/location/states/architecto/cities"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Cities retrieved successfully",
    "data": [
        {
            "id": 1,
            "state_id": 1,
            "name": "Los Angeles",
            "is_active": true,
            "sort_order": 0
        }
    ]
}
 

Example response (404):


{
    "success": false,
    "message": "State not found."
}
 

Request      

GET api/v1/location/states/{stateId}/cities

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

stateId   string     

Example: architecto

state_id   integer     

The ID of the state. Example: 1

Get list of all phone country codes.

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/location/phone-country-codes?country_id=1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/location/phone-country-codes"
);

const params = {
    "country_id": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Phone country codes retrieved successfully",
    "data": [
        {
            "id": 1,
            "phone_code": "+1"
        },
        {
            "id": 2,
            "phone_code": "+91"
        }
    ]
}
 

Request      

GET api/v1/location/phone-country-codes

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

country_id   integer  optional    

optional Filter phone codes by country ID. Example: 1

Milestone Payments

List milestone payments for an awarded project (expert only – the awarded expert).

requires authentication

Shows expert_payout (milestone amount minus platform fee). Payment status is set by admin when paying manually.

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/project/16/expert-milestones" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/16/expert-milestones"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Milestones retrieved successfully",
    "data": {
        "milestones": []
    }
}
 

Example response (403):


{
    "success": false,
    "message": "You can only view milestones for projects you are awarded on."
}
 

Example response (422):


{
    "success": false,
    "message": "Project must be awarded before viewing milestones."
}
 

Request      

GET api/v1/project/{project_id}/expert-milestones

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 16

List milestone payments for an awarded project (company only).

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/project/16/milestones" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/16/milestones"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Milestones retrieved successfully",
    "data": {
        "milestones": [],
        "project_total_cost": 1000,
        "allocated_amount": 0,
        "remaining_amount": 1000
    }
}
 

Example response (403):


{
    "success": false,
    "message": "You can only manage milestones for your own awarded projects."
}
 

Example response (422):


{
    "success": false,
    "message": "Project must be awarded to an expert before adding milestones."
}
 

Request      

GET api/v1/project/{project_id}/milestones

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 16

Add a milestone payment. Sum of all milestone amounts must not exceed project total cost.

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/project/16/milestones" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"Design approval\",
    \"description\": \"Final design sign-off\",
    \"amount\": 500,
    \"milestone_completion_date\": \"2026-03-01\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/16/milestones"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "Design approval",
    "description": "Final design sign-off",
    "amount": 500,
    "milestone_completion_date": "2026-03-01"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (201):


{
    "success": true,
    "message": "Milestone added successfully",
    "data": {
        "milestone": {},
        "remaining_amount": 500
    }
}
 

Example response (422):


{
    "success": false,
    "message": "Milestone total would exceed project cost. Remaining amount: 500.00"
}
 

Request      

POST api/v1/project/{project_id}/milestones

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 16

Body Parameters

name   string     

Milestone name. Example: Design approval

description   string  optional    

optional Description. Example: Final design sign-off

amount   number     

Amount for this milestone. Example: 500

milestone_completion_date   date     

Completion date (today or future). Example: 2026-03-01

Create Stripe checkout session to pay for a milestone. Redirect user to checkout_url; on success Stripe webhook marks milestone completed.

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/project/16/milestones/16/create-checkout-session" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/16/milestones/16/create-checkout-session"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Checkout session created",
    "data": {
        "checkout_url": "https://checkout.stripe.com/...",
        "session_id": "cs_xxx",
        "amount": 500,
        "currency": "USD"
    }
}
 

Example response (403):


{
    "success": false,
    "message": "You can only manage milestones for your own awarded projects."
}
 

Example response (422):


{
    "success": false,
    "message": "This milestone has already been paid and completed."
}
 

Request      

POST api/v1/project/{project_id}/milestones/{milestone_id}/create-checkout-session

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 16

milestone_id   integer     

The ID of the milestone. Example: 16

Update a milestone payment. Total of all milestones must not exceed project cost.

requires authentication

Example request:
curl --request PUT \
    "https://industry-tuner-api.test/api/v1/project/16/milestones/16" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"architecto\",
    \"description\": \"Eius et animi quos velit et.\",
    \"amount\": 4326.41688,
    \"milestone_completion_date\": \"architecto\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/16/milestones/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "architecto",
    "description": "Eius et animi quos velit et.",
    "amount": 4326.41688,
    "milestone_completion_date": "architecto"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Milestone updated successfully",
    "data": {
        "milestone": {},
        "remaining_amount": 0
    }
}
 

Example response (422):


{
    "success": false,
    "message": "Milestone total would exceed project cost. Max allowed for this milestone: 500.00"
}
 

Request      

PUT api/v1/project/{project_id}/milestones/{milestone_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 16

milestone_id   integer     

The ID of the milestone. Example: 16

Body Parameters

name   string  optional    

optional Milestone name. Example: architecto

description   string  optional    

optional Description. Example: Eius et animi quos velit et.

amount   number  optional    

optional Amount. Example: 4326.41688

milestone_completion_date   date  optional    

optional Completion date. Example: architecto

Update a milestone payment. Total of all milestones must not exceed project cost.

requires authentication

Example request:
curl --request PATCH \
    "https://industry-tuner-api.test/api/v1/project/16/milestones/16" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"name\": \"architecto\",
    \"description\": \"Eius et animi quos velit et.\",
    \"amount\": 4326.41688,
    \"milestone_completion_date\": \"architecto\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/16/milestones/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "name": "architecto",
    "description": "Eius et animi quos velit et.",
    "amount": 4326.41688,
    "milestone_completion_date": "architecto"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Milestone updated successfully",
    "data": {
        "milestone": {},
        "remaining_amount": 0
    }
}
 

Example response (422):


{
    "success": false,
    "message": "Milestone total would exceed project cost. Max allowed for this milestone: 500.00"
}
 

Request      

PATCH api/v1/project/{project_id}/milestones/{milestone_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 16

milestone_id   integer     

The ID of the milestone. Example: 16

Body Parameters

name   string  optional    

optional Milestone name. Example: architecto

description   string  optional    

optional Description. Example: Eius et animi quos velit et.

amount   number  optional    

optional Amount. Example: 4326.41688

milestone_completion_date   date  optional    

optional Completion date. Example: architecto

Delete a milestone payment.

requires authentication

Example request:
curl --request DELETE \
    "https://industry-tuner-api.test/api/v1/project/16/milestones/16" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/16/milestones/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Milestone deleted successfully",
    "data": {
        "remaining_amount": 1000
    }
}
 

Example response (404):


{
    "success": false,
    "message": "Milestone not found"
}
 

Request      

DELETE api/v1/project/{project_id}/milestones/{milestone_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 16

milestone_id   integer     

The ID of the milestone. Example: 16

Projects

List all projects for the logged-in company (draft, published, cancelled).

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/project/my-projects" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/my-projects"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Company projects retrieved successfully",
    "data": [
        {
            "id": 1,
            "user_id": 1,
            "status": "draft",
            "industry_type_id": 1,
            "industry_type": {
                "id": 1,
                "name": "Technology"
            },
            "requirement_title": "Need a Laravel Developer",
            "requirement_type": "Development",
            "requirement_details": "We need an experienced Laravel developer",
            "experience_level_years": 5,
            "project_type": "hourly",
            "estimated_hours": 40,
            "rate": "50.00",
            "amount": null,
            "questions": [],
            "created_at": "2026-01-16T10:00:00+00:00",
            "updated_at": "2026-01-16T10:00:00+00:00"
        }
    ]
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Only companies can view their projects."
}
 

Request      

GET api/v1/project/my-projects

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Get a single project for the logged-in company (any status: draft, published, cancelled).

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/project/my-projects/16" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/my-projects/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Project retrieved successfully",
    "data": {
        "id": 1,
        "user_id": 1,
        "status": "draft",
        "industry_type_id": 1,
        "industry_type": {
            "id": 1,
            "name": "Technology"
        },
        "requirement_title": "Need a Laravel Developer",
        "requirement_type": "Development",
        "requirement_details": "We need an experienced Laravel developer",
        "experience_level_years": 5,
        "project_type": "hourly",
        "estimated_hours": 40,
        "rate": "50.00",
        "amount": null,
        "questions": [],
        "created_at": "2026-01-16T10:00:00+00:00",
        "updated_at": "2026-01-16T10:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "You can only view your own projects."
}
 

Example response (404):


{
    "success": false,
    "message": "Project not found"
}
 

Request      

GET api/v1/project/my-projects/{project_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 16

project   integer     

The ID of the project. Example: 1

Create a new project.

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/project" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"industry_type_id\": 1,
    \"requirement_type_id\": 16,
    \"requirement_title\": \"Need a Laravel Developer\",
    \"requirement_details\": \"We need an experienced Laravel developer for our project.\",
    \"experience_level_years\": 5,
    \"project_type\": \"hourly\",
    \"estimated_hours\": 40,
    \"rate\": \"50.00\",
    \"amount\": \"2000.00\",
    \"is_close_bidding\": false,
    \"questions\": [
        \"architecto\"
    ],
    \"requirement_type\": \"Development\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "industry_type_id": 1,
    "requirement_type_id": 16,
    "requirement_title": "Need a Laravel Developer",
    "requirement_details": "We need an experienced Laravel developer for our project.",
    "experience_level_years": 5,
    "project_type": "hourly",
    "estimated_hours": 40,
    "rate": "50.00",
    "amount": "2000.00",
    "is_close_bidding": false,
    "questions": [
        "architecto"
    ],
    "requirement_type": "Development"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (201):


{
    "success": true,
    "message": "Project created successfully",
    "data": {
        "id": 1,
        "user_id": 1,
        "industry_type_id": 1,
        "requirement_title": "Need a Laravel Developer",
        "requirement_type": "Development",
        "requirement_details": "We need an experienced Laravel developer",
        "experience_level_years": 5,
        "project_type": "hourly",
        "estimated_hours": 40,
        "rate": "50.00",
        "amount": null,
        "questions": [],
        "created_at": "2026-01-16T10:00:00+00:00",
        "updated_at": "2026-01-16T10:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Only companies can create projects."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "industry_type_id": [
            "The industry type id field is required."
        ]
    }
}
 

Request      

POST api/v1/project

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

industry_type_id   integer     

The ID of the industry type. Example: 1

requirement_type_id   integer     

The id of an existing record in the requirement_types table. Example: 16

requirement_title   string     

The title of the requirement. Example: Need a Laravel Developer

requirement_details   string     

Detailed description of the requirement. Example: We need an experienced Laravel developer for our project.

experience_level_years   integer     

Required experience in years. Example: 5

project_type   string     

The type of project. Must be "hourly" or "fixed". Example: hourly

estimated_hours   integer  optional    

required_if:project_type,hourly Estimated hours for hourly projects. Example: 40

rate   numeric  optional    

required_if:project_type,hourly Rate per hour for hourly projects. Example: 50.00

amount   numeric  optional    

required_if:project_type,fixed Total amount for fixed projects. Example: 2000.00

is_close_bidding   boolean  optional    

optional When true, project is not shown publicly and no proposal submission. Example: false

questions   string[]  optional    

optional Array of questions for proposal submission.

question_type   string     

Type of question: "descriptive", "multi_selection", or "single_selection". Example: descriptive

question   string     

The question text. Example: What is your approach to this project?

options   string[]  optional    

required_if:questions[].question_type,multi_selection,required_if:questions[].question_type,single_selection Array of options for selection type questions.

order   integer  optional    

optional Order of the question. Example: 1

requirement_type   string     

The type of requirement. Example: Development

Update an existing project.

requires authentication

Example request:
curl --request PUT \
    "https://industry-tuner-api.test/api/v1/project/16" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"industry_type_id\": 1,
    \"requirement_type_id\": 16,
    \"requirement_title\": \"Need a Laravel Developer\",
    \"requirement_details\": \"We need an experienced Laravel developer for our project.\",
    \"experience_level_years\": 5,
    \"project_type\": \"hourly\",
    \"estimated_hours\": 40,
    \"rate\": \"50.00\",
    \"amount\": \"2000.00\",
    \"is_close_bidding\": false,
    \"questions\": [
        \"architecto\"
    ],
    \"requirement_type\": \"Development\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "industry_type_id": 1,
    "requirement_type_id": 16,
    "requirement_title": "Need a Laravel Developer",
    "requirement_details": "We need an experienced Laravel developer for our project.",
    "experience_level_years": 5,
    "project_type": "hourly",
    "estimated_hours": 40,
    "rate": "50.00",
    "amount": "2000.00",
    "is_close_bidding": false,
    "questions": [
        "architecto"
    ],
    "requirement_type": "Development"
};

fetch(url, {
    method: "PUT",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Project updated successfully",
    "data": {
        "id": 1,
        "user_id": 1,
        "status": "draft",
        "industry_type_id": 1,
        "requirement_title": "Need a Laravel Developer",
        "requirement_type": "Development",
        "requirement_details": "We need an experienced Laravel developer",
        "experience_level_years": 5,
        "project_type": "hourly",
        "estimated_hours": 40,
        "rate": "50.00",
        "amount": null,
        "questions": [],
        "created_at": "2026-01-16T10:00:00+00:00",
        "updated_at": "2026-01-16T10:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "You can only edit projects that are in draft mode."
}
 

Example response (404):


{
    "success": false,
    "message": "Project not found"
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "industry_type_id": [
            "The industry type id field is required."
        ]
    }
}
 

Request      

PUT api/v1/project/{project_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 16

Body Parameters

industry_type_id   integer  optional    

optional The ID of the industry type. Example: 1

requirement_type_id   integer  optional    

The id of an existing record in the requirement_types table. Example: 16

requirement_title   string  optional    

optional The title of the requirement. Example: Need a Laravel Developer

requirement_details   string  optional    

optional Detailed description of the requirement. Example: We need an experienced Laravel developer for our project.

experience_level_years   integer  optional    

optional Required experience in years. Example: 5

project_type   string  optional    

optional The type of project. Must be "hourly" or "fixed". Example: hourly

estimated_hours   integer  optional    

required_if:project_type,hourly Estimated hours for hourly projects. Example: 40

rate   numeric  optional    

required_if:project_type,hourly Rate per hour for hourly projects. Example: 50.00

amount   numeric  optional    

required_if:project_type,fixed Total amount for fixed projects. Example: 2000.00

is_close_bidding   boolean  optional    

optional When true, project is not shown publicly and no proposal submission. Example: false

questions   string[]  optional    

optional Array of questions for proposal submission.

question_type   string     

Type of question: "descriptive", "multi_selection", or "single_selection". Example: descriptive

question   string     

The question text. Example: What is your approach to this project?

options   string[]  optional    

required_if:questions[].question_type,multi_selection,required_if:questions[].question_type,single_selection Array of options for selection type questions.

order   integer  optional    

optional Order of the question. Example: 1

requirement_type   string  optional    

optional The type of requirement. Example: Development

Update an existing project.

requires authentication

Example request:
curl --request PATCH \
    "https://industry-tuner-api.test/api/v1/project/16" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"industry_type_id\": 1,
    \"requirement_type_id\": 16,
    \"requirement_title\": \"Need a Laravel Developer\",
    \"requirement_details\": \"We need an experienced Laravel developer for our project.\",
    \"experience_level_years\": 5,
    \"project_type\": \"hourly\",
    \"estimated_hours\": 40,
    \"rate\": \"50.00\",
    \"amount\": \"2000.00\",
    \"is_close_bidding\": false,
    \"questions\": [
        \"architecto\"
    ],
    \"requirement_type\": \"Development\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "industry_type_id": 1,
    "requirement_type_id": 16,
    "requirement_title": "Need a Laravel Developer",
    "requirement_details": "We need an experienced Laravel developer for our project.",
    "experience_level_years": 5,
    "project_type": "hourly",
    "estimated_hours": 40,
    "rate": "50.00",
    "amount": "2000.00",
    "is_close_bidding": false,
    "questions": [
        "architecto"
    ],
    "requirement_type": "Development"
};

fetch(url, {
    method: "PATCH",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Project updated successfully",
    "data": {
        "id": 1,
        "user_id": 1,
        "status": "draft",
        "industry_type_id": 1,
        "requirement_title": "Need a Laravel Developer",
        "requirement_type": "Development",
        "requirement_details": "We need an experienced Laravel developer",
        "experience_level_years": 5,
        "project_type": "hourly",
        "estimated_hours": 40,
        "rate": "50.00",
        "amount": null,
        "questions": [],
        "created_at": "2026-01-16T10:00:00+00:00",
        "updated_at": "2026-01-16T10:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "You can only edit projects that are in draft mode."
}
 

Example response (404):


{
    "success": false,
    "message": "Project not found"
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "industry_type_id": [
            "The industry type id field is required."
        ]
    }
}
 

Request      

PATCH api/v1/project/{project_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 16

Body Parameters

industry_type_id   integer  optional    

optional The ID of the industry type. Example: 1

requirement_type_id   integer  optional    

The id of an existing record in the requirement_types table. Example: 16

requirement_title   string  optional    

optional The title of the requirement. Example: Need a Laravel Developer

requirement_details   string  optional    

optional Detailed description of the requirement. Example: We need an experienced Laravel developer for our project.

experience_level_years   integer  optional    

optional Required experience in years. Example: 5

project_type   string  optional    

optional The type of project. Must be "hourly" or "fixed". Example: hourly

estimated_hours   integer  optional    

required_if:project_type,hourly Estimated hours for hourly projects. Example: 40

rate   numeric  optional    

required_if:project_type,hourly Rate per hour for hourly projects. Example: 50.00

amount   numeric  optional    

required_if:project_type,fixed Total amount for fixed projects. Example: 2000.00

is_close_bidding   boolean  optional    

optional When true, project is not shown publicly and no proposal submission. Example: false

questions   string[]  optional    

optional Array of questions for proposal submission.

question_type   string     

Type of question: "descriptive", "multi_selection", or "single_selection". Example: descriptive

question   string     

The question text. Example: What is your approach to this project?

options   string[]  optional    

required_if:questions[].question_type,multi_selection,required_if:questions[].question_type,single_selection Array of options for selection type questions.

order   integer  optional    

optional Order of the question. Example: 1

requirement_type   string  optional    

optional The type of requirement. Example: Development

Publish a draft project.

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/project/16/publish" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/16/publish"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Project published successfully",
    "data": {
        "id": 1,
        "user_id": 1,
        "status": "published",
        "industry_type_id": 1,
        "requirement_title": "Need a Laravel Developer",
        "requirement_type": "Development",
        "requirement_details": "We need an experienced Laravel developer",
        "experience_level_years": 5,
        "project_type": "hourly",
        "estimated_hours": 40,
        "rate": "50.00",
        "amount": null,
        "questions": [],
        "created_at": "2026-01-16T10:00:00+00:00",
        "updated_at": "2026-01-16T10:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "You can only publish your own projects."
}
 

Example response (404):


{
    "success": false,
    "message": "Project not found"
}
 

Example response (422):


{
    "success": false,
    "message": "Project is already published."
}
 

Request      

POST api/v1/project/{project_id}/publish

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 16

Cancel a project.

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/project/16/cancel" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/16/cancel"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Project cancelled successfully",
    "data": {
        "id": 1,
        "user_id": 1,
        "status": "cancelled",
        "industry_type_id": 1,
        "requirement_title": "Need a Laravel Developer",
        "requirement_type": "Development",
        "requirement_details": "We need an experienced Laravel developer",
        "experience_level_years": 5,
        "project_type": "hourly",
        "estimated_hours": 40,
        "rate": "50.00",
        "amount": null,
        "questions": [],
        "created_at": "2026-01-16T10:00:00+00:00",
        "updated_at": "2026-01-16T10:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "You can only cancel your own projects."
}
 

Example response (404):


{
    "success": false,
    "message": "Project not found"
}
 

Example response (422):


{
    "success": false,
    "message": "Project is already cancelled."
}
 

Request      

POST api/v1/project/{project_id}/cancel

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 16

Close bidding on a project. Project is hidden from public listing and single view; no proposal submission.

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/project/16/close-bidding" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/16/close-bidding"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Bidding closed successfully",
    "data": {}
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "You can only manage your own projects."
}
 

Example response (422):


{
    "success": false,
    "message": "Bidding is already closed for this project."
}
 

Request      

POST api/v1/project/{project_id}/close-bidding

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 16

project   integer     

The ID of the project. Example: 1

Open bidding on a project. Project is visible publicly and can receive proposals (if published and not awarded).

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/project/16/open-bidding" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/16/open-bidding"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Bidding opened successfully",
    "data": {}
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "You can only manage your own projects."
}
 

Example response (422):


{
    "success": false,
    "message": "Bidding is already open for this project."
}
 

Request      

POST api/v1/project/{project_id}/open-bidding

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 16

project   integer     

The ID of the project. Example: 1

Delete a project completely.

requires authentication

Example request:
curl --request DELETE \
    "https://industry-tuner-api.test/api/v1/project/16" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Project deleted successfully"
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "You can only delete your own projects."
}
 

Example response (404):


{
    "success": false,
    "message": "Project not found"
}
 

Request      

DELETE api/v1/project/{project_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 16

Submit a review for the expert who worked on this completed project.

requires authentication

Only the owning company can submit one review per project after completion.

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/project/16/review-expert" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"rating\": 5,
    \"message\": \"Great work and communication throughout the project.\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/16/review-expert"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "rating": 5,
    "message": "Great work and communication throughout the project."
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (201):


{
    "success": true,
    "message": "Review submitted successfully",
    "data": {
        "id": 1,
        "project_id": 1,
        "expert_id": 2,
        "company_id": 1,
        "rating": 5,
        "message": "Great work",
        "created_at": "2026-03-12T10:00:00+00:00"
    }
}
 

Example response (403):


{
    "success": false,
    "message": "You can only review your own completed projects."
}
 

Example response (422):


{
    "success": false,
    "message": "Project must be completed and awarded before reviewing."
}
 

Request      

POST api/v1/project/{project_id}/review-expert

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 16

Body Parameters

rating   integer     

Rating between 1 and 5. Example: 5

message   string  optional    

optional Review message. Example: Great work and communication throughout the project.

List all published projects that are open for proposals (excludes close-bid and awarded projects).

Close-bid projects and awarded projects are not returned. Each project includes is_awarded and is_close_bidding.

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/project" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Published projects retrieved successfully",
    "data": [
        {
            "id": 1,
            "user_id": 1,
            "status": "published",
            "industry_type_id": 1,
            "industry_type": {
                "id": 1,
                "name": "Technology"
            },
            "requirement_title": "Need a Laravel Developer",
            "is_awarded": false,
            "questions": [],
            "created_at": "2026-01-16T10:00:00+00:00",
            "updated_at": "2026-01-16T10:00:00+00:00"
        }
    ]
}
 

Request      

GET api/v1/project

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

List all published projects for a specific industry type (excludes close-bid and awarded projects).

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/project/industry-type/1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/industry-type/1"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Published projects retrieved successfully",
    "data": [
        {
            "id": 1,
            "user_id": 1,
            "status": "published",
            "industry_type_id": 1,
            "industry_type": {
                "id": 1,
                "name": "Technology"
            },
            "requirement_title": "Need a Laravel Developer",
            "is_awarded": false,
            "questions": [],
            "created_at": "2026-01-16T10:00:00+00:00",
            "updated_at": "2026-01-16T10:00:00+00:00"
        }
    ]
}
 

Example response (404):


{
    "success": false,
    "message": "Industry type not found"
}
 

Request      

GET api/v1/project/industry-type/{industry_type_id}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

industry_type_id   integer     

The ID of the industry type. Example: 1

Get a single published project by ID.

Close-bid projects return 404 (no public view). Response includes is_awarded and is_close_bidding.

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/project/16" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/16"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Project retrieved successfully",
    "data": {
        "id": 1,
        "user_id": 1,
        "status": "published",
        "industry_type_id": 1,
        "industry_type": {
            "id": 1,
            "name": "Technology"
        },
        "requirement_title": "Need a Laravel Developer",
        "is_awarded": false,
        "questions": [],
        "created_at": "2026-01-16T10:00:00+00:00",
        "updated_at": "2026-01-16T10:00:00+00:00"
    }
}
 

Example response (404):


{
    "success": false,
    "message": "Project not found"
}
 

Request      

GET api/v1/project/{project_id}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 16

project   integer     

The ID of the project. Example: 1

Proposals

List all projects the logged-in expert has submitted a proposal to.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/project/my-applied-projects" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/my-applied-projects"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Projects you applied to retrieved successfully",
    "data": [
        {
            "id": 1,
            "user_id": 1,
            "status": "published",
            "industry_type_id": 1,
            "industry_type": {
                "id": 1,
                "name": "Technology"
            },
            "requirement_title": "Need a Laravel Developer",
            "requirement_type": "Development",
            "requirement_details": "We need an experienced Laravel developer",
            "experience_level_years": 5,
            "project_type": "hourly",
            "estimated_hours": 40,
            "rate": "50.00",
            "amount": null,
            "questions": [],
            "created_at": "2026-01-16T10:00:00+00:00",
            "updated_at": "2026-01-16T10:00:00+00:00"
        }
    ]
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Only experts can view projects they have applied to."
}
 

Request      

GET api/v1/project/my-applied-projects

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Get a single project the logged-in expert has submitted a proposal to.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/project/my-applied-projects/16" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/my-applied-projects/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Project retrieved successfully",
    "data": {
        "id": 1,
        "user_id": 1,
        "status": "published",
        "industry_type_id": 1,
        "industry_type": {
            "id": 1,
            "name": "Technology"
        },
        "requirement_title": "Need a Laravel Developer",
        "requirement_type": "Development",
        "requirement_details": "We need an experienced Laravel developer",
        "experience_level_years": 5,
        "project_type": "hourly",
        "estimated_hours": 40,
        "rate": "50.00",
        "amount": null,
        "questions": [],
        "created_at": "2026-01-16T10:00:00+00:00",
        "updated_at": "2026-01-16T10:00:00+00:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Only experts can view projects they have applied to."
}
 

Example response (404):


{
    "success": false,
    "message": "Project not found or you have not applied to this project."
}
 

Request      

GET api/v1/project/my-applied-projects/{project_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 16

project   integer     

The ID of the project. Example: 1

List proposals for the authenticated user.

requires authentication

Experts: proposals they submitted. Companies: not used; use indexByProject for their project's proposals.

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/project/proposals" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/proposals"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Proposals retrieved successfully",
    "data": []
}
 

Request      

GET api/v1/project/proposals

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Show a single proposal. Visible to the expert who submitted it or the company that owns the project.

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/project/proposal/16" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/proposal/16"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Proposal retrieved successfully",
    "data": {}
}
 

Example response (404):


{
    "success": false,
    "message": "Proposal not found"
}
 

Request      

GET api/v1/project/proposal/{proposal_id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

proposal_id   integer     

The ID of the proposal. Example: 16

Award the project to an expert (company only - project owner).

requires authentication

Sets the proposal as "pending" until the expert accepts or declines.

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/project/proposal/16/award" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/proposal/16/award"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Project awarded to expert successfully. Waiting for expert response."
}
 

Example response (403):


{
    "success": false,
    "message": "You can only award proposals for your own projects."
}
 

Example response (422):


{
    "success": false,
    "message": "This project has already been awarded to an expert."
}
 

Request      

POST api/v1/project/proposal/{proposal_id}/award

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

proposal_id   integer     

The ID of the proposal. Example: 16

Expert accepts the award. Project is then awarded to this expert and proposal submission is closed.

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/project/proposal/16/accept-award" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/proposal/16/accept-award"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "You have accepted the award. The project is now awarded to you."
}
 

Example response (403):


{
    "success": false,
    "message": "Only the expert who received the award can accept it."
}
 

Example response (422):


{
    "success": false,
    "message": "This proposal is not pending your response."
}
 

Request      

POST api/v1/project/proposal/{proposal_id}/accept-award

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

proposal_id   integer     

The ID of the proposal. Example: 16

Expert declines the award. Proposal submission for the project continues; company can see the decline.

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/project/proposal/16/decline-award" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/proposal/16/decline-award"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "You have declined the award."
}
 

Example response (403):


{
    "success": false,
    "message": "Only the expert who received the award can decline it."
}
 

Example response (422):


{
    "success": false,
    "message": "This proposal is not pending your response."
}
 

Request      

POST api/v1/project/proposal/{proposal_id}/decline-award

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

proposal_id   integer     

The ID of the proposal. Example: 16

Get proposal form data for a project (when expert clicks "Apply now").

requires authentication

Returns project details and questions so the frontend can render the proposal form.

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/project/16/proposal-form" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/16/proposal-form"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Proposal form retrieved successfully",
    "data": {
        "project": {},
        "questions": [],
        "already_submitted": false
    }
}
 

Example response (403):


{
    "success": false,
    "message": "Only published projects can receive proposals."
}
 

Request      

GET api/v1/project/{project_id}/proposal-form

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 16

List proposals for a project (company only - project owner).

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/project/16/proposals" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/16/proposals"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Proposals retrieved successfully",
    "data": []
}
 

Example response (403):


{
    "success": false,
    "message": "You can only view proposals for your own projects."
}
 

Request      

GET api/v1/project/{project_id}/proposals

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 16

Submit a proposal for a published project.

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/project/16/proposal" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"heading\": \"My approach to your Laravel project\",
    \"cover_letter\": \"I have 5 years of experience...\",
    \"work_samples\": [
        \"architecto\"
    ],
    \"question_answers\": [
        \"architecto\"
    ],
    \"estimated_total_hours\": 40,
    \"estimated_rate\": 50,
    \"estimated_amount\": 2000
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/project/16/proposal"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "heading": "My approach to your Laravel project",
    "cover_letter": "I have 5 years of experience...",
    "work_samples": [
        "architecto"
    ],
    "question_answers": [
        "architecto"
    ],
    "estimated_total_hours": 40,
    "estimated_rate": 50,
    "estimated_amount": 2000
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (201):


{
    "success": true,
    "message": "Proposal submitted successfully",
    "data": {}
}
 

Example response (403):


{
    "success": false,
    "message": "Only experts can submit proposals."
}
 

Example response (422):


{
    "success": false,
    "message": "You have already submitted a proposal for this project."
}
 

Request      

POST api/v1/project/{project_id}/proposal

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

project_id   integer     

The ID of the project. Example: 16

Body Parameters

heading   string     

Proposal heading. Example: My approach to your Laravel project

cover_letter   string     

Cover letter. Example: I have 5 years of experience...

work_samples   string[]  optional    

optional Work samples (pdf, video, link, image).

type   string     

One of: pdf, video, link, image. Example: architecto

value   string     

for type=link. URL. Example: https://example.com/portfolio

title   string  optional    

optional Title for the sample. Example: architecto

order   integer  optional    

optional Display order. Example: 16

file   file     

for type=pdf|video|image. File upload. Example: C:\Users\AMITB\AppData\Local\Temp\php563D.tmp

question_answers   string[]     

Answers to all project questions.

project_question_id   integer     

Project question ID. Example: 16

answer   string|array     

Answer (text, single option, or array for multi_selection). Example: architecto

estimated_total_hours   integer  optional    

required_if:project_type,hourly Total hours (hourly projects). Example: 40

estimated_rate   number  optional    

required_if:project_type,hourly Rate per hour (hourly projects). Example: 50

estimated_amount   number  optional    

required_if:project_type,fixed Total price (fixed projects). Example: 2000

Public About Page

Get public about page content.

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/about-page" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/about-page"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "About page content retrieved successfully",
    "data": {
        "id": 1,
        "page_title": "About Us",
        "side_image": "http://localhost/images/about/side.jpg",
        "heading": "Welcome",
        "description": "Description",
        "our_mission_text": "Mission text",
        "our_vision_text": "Vision text",
        "our_values_text": "Values text",
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Request      

GET api/v1/about-page

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Public Blogs

Blog Categories

Get active blog categories with blog counts.

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/blog-categories" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/blog-categories"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Blog categories retrieved",
    "data": [
        {
            "id": 1,
            "name": "Technology",
            "is_active": true,
            "blogs_count": 3,
            "created_at": "2026-01-21T12:00:00+00:00",
            "updated_at": "2026-01-21T12:00:00+00:00"
        }
    ]
}
 

Request      

GET api/v1/blog-categories

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Show a single active category.

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/blog-categories/1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/blog-categories/1"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Blog category retrieved",
    "data": {
        "id": 1,
        "name": "Technology",
        "is_active": true,
        "blogs_count": 3,
        "created_at": "2026-01-21T12:00:00+00:00",
        "updated_at": "2026-01-21T12:00:00+00:00"
    }
}
 

Example response (404):


{
    "success": false,
    "message": "Blog category not found"
}
 

Request      

GET api/v1/blog-categories/{id}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The category ID. Example: 1

Blogs

List active blogs with optional category filter.

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/blogs?category_id=2" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/blogs"
);

const params = {
    "category_id": "2",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Blogs retrieved",
    "data": [
        {
            "id": 1,
            "name": "Launch Update",
            "blog_category_id": 2,
            "category": {
                "id": 2,
                "name": "News",
                "is_active": true,
                "blogs_count": 1
            },
            "thumbnail_image": "https://cdn/img.png",
            "description": "...",
            "share_facebook": true,
            "share_twitter": false,
            "share_linkedin": true,
            "is_active": true,
            "sections": [
                {
                    "id": 1,
                    "heading": "Intro",
                    "description": "...",
                    "image": null,
                    "position": "left",
                    "button_name": null,
                    "button_url": null,
                    "order": 0
                }
            ],
            "created_at": "2026-01-21T12:00:00+00:00",
            "updated_at": "2026-01-21T12:00:00+00:00"
        }
    ]
}
 

Request      

GET api/v1/blogs

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

category_id   integer  optional    

optional Filter by category ID. Example: 2

Show a single active blog.

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/blogs/launch-update" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/blogs/launch-update"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Blog retrieved",
    "data": {
        "id": 1,
        "name": "Launch Update",
        "slug": "launch-update",
        "blog_category_id": 2,
        "category": {
            "id": 2,
            "name": "News",
            "is_active": true,
            "blogs_count": 1
        },
        "thumbnail_image": "https://cdn/img.png",
        "description": "...",
        "share_facebook": true,
        "share_twitter": false,
        "share_linkedin": true,
        "is_active": true,
        "sections": [
            {
                "id": 1,
                "heading": "Intro",
                "description": "...",
                "image": null,
                "position": "left",
                "button_name": null,
                "button_url": null,
                "order": 0
            }
        ],
        "created_at": "2026-01-21T12:00:00+00:00",
        "updated_at": "2026-01-21T12:00:00+00:00"
    }
}
 

Example response (404):


{
    "success": false,
    "message": "Blog not found"
}
 

Request      

GET api/v1/blogs/{slug}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

slug   string     

Blog slug. Example: launch-update

Public Company

List all companies in the system (public endpoint).

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/company" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/company"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Companies retrieved successfully",
    "data": [
        {
            "id": 1,
            "name": "Company Name",
            "company_name": "Company Name",
            "email": "company@example.com",
            "profile": {
                "id": 1,
                "company_name": "Company Name",
                "company_logo": "http://localhost/logos/image.jpg",
                "address_line_1": "123 Main St",
                "country": {
                    "id": 1,
                    "name": "India"
                },
                "state": {
                    "id": 1,
                    "name": "State"
                },
                "city": {
                    "id": 1,
                    "name": "City"
                }
            },
            "created_at": "2024-01-01T00:00:00+00:00"
        }
    ]
}
 

Request      

GET api/v1/company

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Check if the given email exists in the system as a company.

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/company/check-email?email=company%40example.com" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"email\": \"gbailey@example.net\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/company/check-email"
);

const params = {
    "email": "company@example.com",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

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

let body = {
    "email": "gbailey@example.net"
};

fetch(url, {
    method: "GET",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "OK",
    "data": {
        "exists": true
    }
}
 

Example response (200):


{
    "success": true,
    "message": "OK",
    "data": {
        "exists": false
    }
}
 

Example response (422):


{
    "success": false,
    "message": "The given data was invalid.",
    "errors": {
        "email": [
            "The email field is required."
        ]
    }
}
 

Request      

GET api/v1/company/check-email

POST api/v1/company/check-email

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

email   string     

The email address to check. Example: company@example.com

Body Parameters

email   string     

Must be a valid email address. Must not be greater than 255 characters. Example: gbailey@example.net

Public Expert

List all experts in the system (public endpoint).

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/expert" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/expert"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Experts retrieved successfully",
    "data": [
        {
            "id": 1,
            "name": "John Doe",
            "first_name": "John",
            "last_name": "Doe",
            "email": "expert@example.com",
            "profile": {
                "id": 1,
                "designation": {
                    "id": 1,
                    "name": "Developer"
                },
                "experience": 5,
                "bio": "Expert in software development",
                "profile_image": "http://localhost/profiles/image.jpg",
                "country": {
                    "id": 1,
                    "name": "India"
                }
            },
            "created_at": "2024-01-01T00:00:00+00:00"
        }
    ]
}
 

Request      

GET api/v1/expert

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Get a single expert by ID (public endpoint).

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/expert/1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/expert/1"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Expert retrieved successfully",
    "data": {
        "id": 1,
        "name": "John Doe",
        "first_name": "John",
        "last_name": "Doe",
        "email": "expert@example.com",
        "profile": {
            "id": 1,
            "designation": {
                "id": 1,
                "name": "Developer"
            },
            "experience": 5,
            "bio": "Expert in software development",
            "profile_image": "http://localhost/profiles/image.jpg",
            "country": {
                "id": 1,
                "name": "India"
            }
        },
        "created_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (404):


{
    "success": false,
    "message": "Expert not found."
}
 

Request      

GET api/v1/expert/{id}

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The expert user ID. Example: 1

Public FAQs

Company FAQs

Get all company FAQs (Public).

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/faq/company" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/faq/company"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Company FAQs retrieved",
    "data": [
        {
            "id": 1,
            "heading": "Question 1",
            "description": "Answer 1",
            "order": 0,
            "created_at": "2024-01-01T00:00:00+00:00",
            "updated_at": "2024-01-01T00:00:00+00:00"
        }
    ]
}
 

Request      

GET api/v1/faq/company

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Expert FAQs

Get all expert FAQs (Public).

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/faq/expert" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/faq/expert"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Expert FAQs retrieved",
    "data": [
        {
            "id": 1,
            "heading": "Question 1",
            "description": "Answer 1",
            "order": 0,
            "created_at": "2024-01-01T00:00:00+00:00",
            "updated_at": "2024-01-01T00:00:00+00:00"
        }
    ]
}
 

Request      

GET api/v1/faq/expert

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Public Home Page

Get public home page content.

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/home-page" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/home-page"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Home page content retrieved successfully",
    "data": {
        "id": 1,
        "section1": {
            "hero_headline": "Welcome",
            "hero_description": "Description",
            "hero_image": "http://localhost/images/hero.jpg"
        },
        "section2": {
            "headline": "Section 2"
        },
        "section3": {
            "headline": "Section 3",
            "description": "Description",
            "button_name": "Click",
            "button_url": "https://example.com",
            "image": "http://localhost/images/section3.jpg"
        },
        "section4": {
            "headline": "Section 4",
            "options": [
                {
                    "image": "http://localhost/images/option1.jpg",
                    "title": "Option 1",
                    "description": "Description 1"
                }
            ]
        },
        "section5": {
            "steps": [
                {
                    "title": "Step 1",
                    "description": "Description 1"
                }
            ]
        },
        "section6": {
            "headline": "Section 6",
            "button_name": "Click",
            "button_url": "https://example.com",
            "background_image": "http://localhost/images/bg.jpg"
        },
        "section7": {
            "headline": "Section 7",
            "description": "Description"
        },
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Request      

GET api/v1/home-page

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Public Policies

Get privacy policy.

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/policies/privacy-policy" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/policies/privacy-policy"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Privacy policy retrieved successfully",
    "data": {
        "id": 1,
        "type": "privacy_policy",
        "content": "Privacy policy content here...",
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Request      

GET api/v1/policies/privacy-policy

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Get terms & conditions.

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/policies/terms-conditions" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/policies/terms-conditions"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Terms & conditions retrieved successfully",
    "data": {
        "id": 2,
        "type": "terms_conditions",
        "content": "Terms & conditions content here...",
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Request      

GET api/v1/policies/terms-conditions

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Get refund & cancellation policy.

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/policies/refund-cancellation" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/policies/refund-cancellation"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Refund & cancellation policy retrieved successfully",
    "data": {
        "id": 3,
        "type": "refund_cancellation",
        "content": "Refund & cancellation policy content here...",
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Request      

GET api/v1/policies/refund-cancellation

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Public Site Settings

Get public site settings.

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/site-settings" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/site-settings"
);

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Site settings retrieved successfully",
    "data": {
        "id": 1,
        "favicon": "http://localhost/favicon.ico",
        "logo": "http://localhost/logos/logo.png",
        "footer_logo": "http://localhost/logos/footer-logo.png",
        "footer_description": "Company description",
        "address": "123 Main St",
        "email": "info@example.com",
        "phone": "1234567890",
        "phone_country_code": "+1",
        "facebook_url": "https://facebook.com/company",
        "instagram_url": "https://instagram.com/company",
        "linkedin_url": "https://linkedin.com/company",
        "copyright": "© 2024 Company",
        "header_image": "http://localhost/images/header.jpg",
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Request      

GET api/v1/site-settings

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Requirement Type

Get list of all requirement types (Public endpoint for frontend users).

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/requirement-types?is_active=1" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/requirement-types"
);

const params = {
    "is_active": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Requirement types retrieved successfully",
    "data": [
        {
            "id": 1,
            "name": "Consulting",
            "description": "Consulting requirement",
            "image": "http://localhost/requirement-types/consulting.jpg",
            "is_active": true,
            "created_at": "2024-01-16 03:26:06",
            "updated_at": "2024-01-16 03:26:06"
        }
    ]
}
 

Request      

GET api/v1/requirement-types

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

is_active   boolean  optional    

Filter by active status. Example: true

Get list of all requirement types (Admin only).

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/admin/requirement-types?is_active=1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/requirement-types"
);

const params = {
    "is_active": "1",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Requirement types retrieved successfully",
    "data": [
        {
            "id": 1,
            "name": "Consulting",
            "description": "Consulting requirement",
            "image": "http://localhost/requirement-types/consulting.jpg",
            "is_active": true,
            "created_at": "2024-01-16 03:26:06",
            "updated_at": "2024-01-16 03:26:06"
        }
    ]
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Request      

GET api/v1/admin/requirement-types

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

is_active   boolean  optional    

Filter by active status. Example: true

Store a new requirement type (Admin only).

requires authentication

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/admin/requirement-types" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "name=Consulting"\
    --form "description=Consulting requirement"\
    --form "is_active=1"\
    --form "image=@C:\Users\AMITB\AppData\Local\Temp\php572A.tmp" 
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/requirement-types"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('name', 'Consulting');
body.append('description', 'Consulting requirement');
body.append('is_active', '1');
body.append('image', document.querySelector('input[name="image"]').files[0]);

fetch(url, {
    method: "POST",
    headers,
    body,
}).then(response => response.json());

Example response (201):


{
    "success": true,
    "message": "Requirement type created successfully",
    "data": {
        "id": 1,
        "name": "Consulting",
        "description": "Consulting requirement",
        "image": "http://localhost/requirement-types/consulting.jpg",
        "is_active": true,
        "created_at": "2024-01-16 03:26:06",
        "updated_at": "2024-01-16 03:26:06"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "name": [
            "Name is required."
        ]
    }
}
 

Request      

POST api/v1/admin/requirement-types

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

Body Parameters

name   string     

The name of the requirement type. Example: Consulting

description   string  optional    

optional The description of the requirement type. Example: Consulting requirement

image   file  optional    

optional Requirement type image (max 2MB, jpeg/png/jpg/gif). Example: C:\Users\AMITB\AppData\Local\Temp\php572A.tmp

is_active   boolean  optional    

optional Whether the requirement type is active. Defaults to true. Example: true

Update a requirement type (Admin only).

requires authentication

Example request:
curl --request PUT \
    "https://industry-tuner-api.test/api/v1/admin/requirement-types/1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: multipart/form-data" \
    --header "Accept: application/json" \
    --form "name=Consulting"\
    --form "description=Consulting requirement"\
    --form "is_active=1"\
    --form "image=@C:\Users\AMITB\AppData\Local\Temp\php573C.tmp" 
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/requirement-types/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "multipart/form-data",
    "Accept": "application/json",
};

const body = new FormData();
body.append('name', 'Consulting');
body.append('description', 'Consulting requirement');
body.append('is_active', '1');
body.append('image', document.querySelector('input[name="image"]').files[0]);

fetch(url, {
    method: "PUT",
    headers,
    body,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Requirement type updated successfully",
    "data": {
        "id": 1,
        "name": "Consulting",
        "description": "Consulting requirement",
        "image": "http://localhost/requirement-types/consulting.jpg",
        "is_active": true,
        "created_at": "2024-01-16 03:26:06",
        "updated_at": "2024-01-16 03:27:00"
    }
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (404):


{
    "success": false,
    "message": "Requirement type not found."
}
 

Example response (422):


{
    "success": false,
    "message": "Validation failed",
    "errors": {
        "name": [
            "Name is required."
        ]
    }
}
 

Request      

PUT api/v1/admin/requirement-types/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: multipart/form-data

Accept        

Example: application/json

URL Parameters

id   integer     

The ID of the requirement type. Example: 1

Body Parameters

name   string     

The name of the requirement type. Example: Consulting

description   string  optional    

optional The description of the requirement type. Example: Consulting requirement

image   file  optional    

optional Requirement type image (max 2MB, jpeg/png/jpg/gif). Example: C:\Users\AMITB\AppData\Local\Temp\php573C.tmp

is_active   boolean  optional    

optional Whether the requirement type is active. Example: true

Delete a requirement type (Admin only).

requires authentication

Example request:
curl --request DELETE \
    "https://industry-tuner-api.test/api/v1/admin/requirement-types/1" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/admin/requirement-types/1"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "DELETE",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Requirement type deleted successfully",
    "data": null
}
 

Example response (401):


{
    "success": false,
    "message": "Unauthenticated"
}
 

Example response (403):


{
    "success": false,
    "message": "Unauthorized. Admin role required."
}
 

Example response (404):


{
    "success": false,
    "message": "Requirement type not found."
}
 

Request      

DELETE api/v1/admin/requirement-types/{id}

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

URL Parameters

id   integer     

The ID of the requirement type to delete. Example: 1

Subscription

User Subscription

Get current subscription status for authenticated user (company or expert).

requires authentication

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/subscription/subscription" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/subscription/subscription"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Subscription retrieved successfully",
    "data": {
        "id": 1,
        "status": "active",
        "lifetime": true,
        "starts_at": "2024-01-01T00:00:00+00:00",
        "ends_at": null,
        "created_at": "2024-01-01T00:00:00+00:00",
        "updated_at": "2024-01-01T00:00:00+00:00"
    }
}
 

Example response (404):


{
    "success": false,
    "message": "No subscription found",
    "data": null
}
 

Request      

GET api/v1/subscription/subscription

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Create Stripe checkout session for subscription.

requires authentication

This endpoint creates a checkout session in Stripe and returns the checkout URL which the frontend should redirect to. Works for both company and expert users.

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/subscription/create-checkout-session" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/subscription/create-checkout-session"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Checkout session created successfully",
    "data": {
        "checkout_url": "https://checkout.stripe.com/...",
        "session_id": "cs_xxx",
        "amount": 9999,
        "currency": "INR"
    }
}
 

Example response (400):


{
    "success": false,
    "message": "Subscription configuration not found. Please contact administrator."
}
 

Example response (400):


{
    "success": false,
    "message": "Subscription is only available for company or expert users."
}
 

Example response (403):


{
    "success": false,
    "message": "You already have an active subscription."
}
 

Request      

POST api/v1/subscription/create-checkout-session

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Create Stripe payment intent for subscription.

requires authentication

This endpoint creates a payment intent in Stripe and returns the client secret which is used by the frontend to complete the payment. Works for both company and expert users.

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/subscription/create-payment-intent" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/subscription/create-payment-intent"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Payment intent created successfully",
    "data": {
        "client_secret": "pi_xxx_secret_xxx",
        "payment_intent_id": "pi_xxx",
        "amount": 9999,
        "currency": "INR"
    }
}
 

Example response (400):


{
    "success": false,
    "message": "Subscription configuration not found. Please contact administrator."
}
 

Example response (400):


{
    "success": false,
    "message": "Subscription is only available for company or expert users."
}
 

Example response (403):


{
    "success": false,
    "message": "You already have an active subscription."
}
 

Request      

POST api/v1/subscription/create-payment-intent

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Confirm payment and activate subscription.

requires authentication

This endpoint confirms the payment intent and activates the subscription if payment is successful. The subscription is also activated via webhook for reliability, but this provides immediate feedback. Works for both company and expert users.

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/subscription/confirm-payment" \
    --header "Authorization: Bearer {YOUR_AUTH_TOKEN}" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json" \
    --data "{
    \"payment_intent_id\": \"pi_xxx\"
}"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/subscription/confirm-payment"
);

const headers = {
    "Authorization": "Bearer {YOUR_AUTH_TOKEN}",
    "Content-Type": "application/json",
    "Accept": "application/json",
};

let body = {
    "payment_intent_id": "pi_xxx"
};

fetch(url, {
    method: "POST",
    headers,
    body: JSON.stringify(body),
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Payment confirmed successfully",
    "data": {
        "status": "succeeded",
        "subscription_activated": true
    }
}
 

Example response (400):


{
    "success": false,
    "message": "Payment not found."
}
 

Example response (400):


{
    "success": false,
    "message": "Failed to confirm payment: ..."
}
 

Request      

POST api/v1/subscription/confirm-payment

Headers

Authorization        

Example: Bearer {YOUR_AUTH_TOKEN}

Content-Type        

Example: application/json

Accept        

Example: application/json

Body Parameters

payment_intent_id   string     

The Stripe payment intent ID. Example: pi_xxx

Stripe Webhook

Handle Stripe webhook events.

This endpoint receives webhook events from Stripe and processes them. It handles payment_intent.succeeded and payment_intent.payment_failed events.

Example request:
curl --request POST \
    "https://industry-tuner-api.test/api/v1/stripe/webhook" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/stripe/webhook"
);

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


fetch(url, {
    method: "POST",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Webhook processed successfully"
}
 

Example response (400):


{
    "success": false,
    "message": "Invalid webhook signature."
}
 

Request      

POST api/v1/stripe/webhook

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Subscription Configuration

Get subscription configuration (Public).

Example request:
curl --request GET \
    --get "https://industry-tuner-api.test/api/v1/subscription/subscription-config?role=architecto" \
    --header "Content-Type: application/json" \
    --header "Accept: application/json"
const url = new URL(
    "https://industry-tuner-api.test/api/v1/subscription/subscription-config"
);

const params = {
    "role": "architecto",
};
Object.keys(params)
    .forEach(key => url.searchParams.append(key, params[key]));

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


fetch(url, {
    method: "GET",
    headers,
}).then(response => response.json());

Example response (200):


{
    "success": true,
    "message": "Subscription configuration retrieved",
    "data": {
        "role": "company",
        "price": 9999,
        "currency": "INR",
        "validity_type": "lifetime",
        "validity_value": null
    }
}
 

Example response (200):


{
    "success": true,
    "message": "Subscription configurations retrieved",
    "data": [
        {
            "role": "company",
            "price": 9999,
            "currency": "INR",
            "validity_type": "lifetime",
            "validity_value": null
        },
        {
            "role": "expert",
            "price": 4999,
            "currency": "INR",
            "validity_type": "lifetime",
            "validity_value": null
        }
    ]
}
 

Example response (200):


{
    "success": true,
    "message": "No subscription configuration found",
    "data": null
}
 

Request      

GET api/v1/subscription/subscription-config

Headers

Content-Type        

Example: application/json

Accept        

Example: application/json

Query Parameters

role   string  optional    

optional The role to get configuration for (company or expert). If not provided, returns all configurations. Example: architecto