POST/api/v1/storefront/projects/{project_slug}/authors
Create Author
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
Request body · AuthorCreate| Field | Type | | Description |
|---|
| account_id | string (nullable) | optional | — |
| display_name | string | required | — |
| slug | string | required | — |
| bio | string (nullable) | optional | — |
| title | string (nullable) | optional | — |
| avatar_file_id | integer (nullable) | optional | — |
| social_links | object | optional | — |
Response 201 · AuthorRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| account_id | string (nullable) | optional | — |
| display_name | string | required | — |
| slug | string | required | — |
| bio | string (nullable) | optional | — |
| title | string (nullable) | optional | — |
| avatar_file | FileOut (nullable) | optional | — |
| social_links | object | required | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
Example requestcurl -X POST "https://api.webtools.ng/api/v1/storefront/projects/your-project/authors" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "display_name": "…", "slug": "…" }'
PATCH/api/v1/storefront/projects/{project_slug}/authors/{author_slug}
Update Author
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
| author_slug | string | path | Required. |
Request body · AuthorUpdate| Field | Type | | Description |
|---|
| account_id | string (nullable) | optional | — |
| display_name | string (nullable) | optional | — |
| slug | string (nullable) | optional | — |
| bio | string (nullable) | optional | — |
| title | string (nullable) | optional | — |
| avatar_file_id | integer (nullable) | optional | — |
| social_links | object (nullable) | optional | — |
Response 200 · AuthorRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| account_id | string (nullable) | optional | — |
| display_name | string | required | — |
| slug | string | required | — |
| bio | string (nullable) | optional | — |
| title | string (nullable) | optional | — |
| avatar_file | FileOut (nullable) | optional | — |
| social_links | object | required | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
Example requestcurl -X PATCH "https://api.webtools.ng/api/v1/storefront/projects/your-project/authors/{author_slug}" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "account_id": "…", "display_name": "…", "slug": "…", "bio": "…", "title": "…", "avatar_file_id": 0 }'
POST/api/v1/storefront/projects/{project_slug}/blog-categories
Create Blog Category
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
Request body · BlogCategoryCreate| Field | Type | | Description |
|---|
| name | string | required | — |
| slug | string | required | — |
| description | string (nullable) | optional | — |
| seo_title | string (nullable) | optional | — |
| seo_description | string (nullable) | optional | — |
| canonical_url | string (nullable) | optional | — |
| og_image_file_id | integer (nullable) | optional | — |
Response 201 · BlogCategoryRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| name | string | required | — |
| slug | string | required | — |
| description | string (nullable) | optional | — |
| seo | SeoRead | required | Nested SEO metadata for API read responses. |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
Example requestcurl -X POST "https://api.webtools.ng/api/v1/storefront/projects/your-project/blog-categories" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "name": "…", "slug": "…" }'
PATCH/api/v1/storefront/projects/{project_slug}/blog-categories/{category_slug}
Update Blog Category
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
| category_slug | string | path | Required. |
Request body · BlogCategoryUpdate| Field | Type | | Description |
|---|
| name | string (nullable) | optional | — |
| slug | string (nullable) | optional | — |
| description | string (nullable) | optional | — |
| seo_title | string (nullable) | optional | — |
| seo_description | string (nullable) | optional | — |
| canonical_url | string (nullable) | optional | — |
| og_image_file_id | integer (nullable) | optional | — |
Response 200 · BlogCategoryRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| name | string | required | — |
| slug | string | required | — |
| description | string (nullable) | optional | — |
| seo | SeoRead | required | Nested SEO metadata for API read responses. |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
Example requestcurl -X PATCH "https://api.webtools.ng/api/v1/storefront/projects/your-project/blog-categories/{category_slug}" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "name": "…", "slug": "…", "description": "…", "seo_title": "…", "seo_description": "…", "canonical_url": "…" }'
POST/api/v1/storefront/projects/{project_slug}/crm/companies
Create Crm Company
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
Request body · CrmCompanyCreate| Field | Type | | Description |
|---|
| name | string | required | — |
| website | string (nullable) | optional | — |
| industry | string (nullable) | optional | — |
| phone_number | string (nullable) | optional | — |
| email | string<email> (nullable) | optional | — |
| address | string (nullable) | optional | — |
| notes | string (nullable) | optional | — |
Response 201 · CrmCompanyRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| name | string | required | — |
| website | string (nullable) | optional | — |
| industry | string (nullable) | optional | — |
| phone_number | string (nullable) | optional | — |
| email | string (nullable) | optional | — |
| address | string (nullable) | optional | — |
| notes | string (nullable) | optional | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
Example requestcurl -X POST "https://api.webtools.ng/api/v1/storefront/projects/your-project/crm/companies" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "name": "…" }'
PATCH/api/v1/storefront/projects/{project_slug}/crm/companies/{company_id}
Update Crm Company
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
| company_id | string | path | Required. |
Request body · CrmCompanyUpdate| Field | Type | | Description |
|---|
| name | string (nullable) | optional | — |
| website | string (nullable) | optional | — |
| industry | string (nullable) | optional | — |
| phone_number | string (nullable) | optional | — |
| email | string<email> (nullable) | optional | — |
| address | string (nullable) | optional | — |
| notes | string (nullable) | optional | — |
Response 200 · CrmCompanyRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| name | string | required | — |
| website | string (nullable) | optional | — |
| industry | string (nullable) | optional | — |
| phone_number | string (nullable) | optional | — |
| email | string (nullable) | optional | — |
| address | string (nullable) | optional | — |
| notes | string (nullable) | optional | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
Example requestcurl -X PATCH "https://api.webtools.ng/api/v1/storefront/projects/your-project/crm/companies/{company_id}" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "name": "…", "website": "…", "industry": "…", "phone_number": "…", "email": "…", "address": "…" }'
POST/api/v1/storefront/projects/{project_slug}/crm/contacts
Create Crm Contact
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
Request body · CrmContactCreate| Field | Type | | Description |
|---|
| first_name | string | required | — |
| last_name | string (nullable) | optional | — |
| email | string<email> (nullable) | optional | — |
| phone_number | string (nullable) | optional | — |
| job_title | string (nullable) | optional | — |
| company_id | string (nullable) | optional | — |
| source | CrmContactSource | optional | — |
| status | CrmContactStatus | optional | — |
| assigned_to_account_id | string (nullable) | optional | — |
| customer_id | string (nullable) | optional | — |
| subscriber_id | string (nullable) | optional | — |
| source_query_id | string (nullable) | optional | — |
| notes | string (nullable) | optional | — |
Response 201 · CrmContactRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| first_name | string | required | — |
| last_name | string (nullable) | optional | — |
| email | string (nullable) | optional | — |
| phone_number | string (nullable) | optional | — |
| job_title | string (nullable) | optional | — |
| company_id | string (nullable) | optional | — |
| company_name | string (nullable) | optional | — |
| source | CrmContactSource | required | — |
| status | CrmContactStatus | required | — |
| assigned_to_account_id | string (nullable) | optional | — |
| customer_id | string (nullable) | optional | — |
| subscriber_id | string (nullable) | optional | — |
| source_query_id | string (nullable) | optional | — |
| notes | string (nullable) | optional | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
Example requestcurl -X POST "https://api.webtools.ng/api/v1/storefront/projects/your-project/crm/contacts" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "first_name": "…" }'
PATCH/api/v1/storefront/projects/{project_slug}/crm/contacts/{contact_id}
Update Crm Contact
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
| contact_id | string | path | Required. |
Request body · CrmContactUpdate| Field | Type | | Description |
|---|
| first_name | string (nullable) | optional | — |
| last_name | string (nullable) | optional | — |
| email | string<email> (nullable) | optional | — |
| phone_number | string (nullable) | optional | — |
| job_title | string (nullable) | optional | — |
| company_id | string (nullable) | optional | — |
| source | CrmContactSource (nullable) | optional | — |
| status | CrmContactStatus (nullable) | optional | — |
| assigned_to_account_id | string (nullable) | optional | — |
| customer_id | string (nullable) | optional | — |
| subscriber_id | string (nullable) | optional | — |
| source_query_id | string (nullable) | optional | — |
| notes | string (nullable) | optional | — |
Response 200 · CrmContactRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| first_name | string | required | — |
| last_name | string (nullable) | optional | — |
| email | string (nullable) | optional | — |
| phone_number | string (nullable) | optional | — |
| job_title | string (nullable) | optional | — |
| company_id | string (nullable) | optional | — |
| company_name | string (nullable) | optional | — |
| source | CrmContactSource | required | — |
| status | CrmContactStatus | required | — |
| assigned_to_account_id | string (nullable) | optional | — |
| customer_id | string (nullable) | optional | — |
| subscriber_id | string (nullable) | optional | — |
| source_query_id | string (nullable) | optional | — |
| notes | string (nullable) | optional | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
Example requestcurl -X PATCH "https://api.webtools.ng/api/v1/storefront/projects/your-project/crm/contacts/{contact_id}" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "first_name": "…", "last_name": "…", "email": "…", "phone_number": "…", "job_title": "…", "company_id": "…" }'
POST/api/v1/storefront/projects/{project_slug}/crm/opportunities
Create Crm Opportunity
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
Request body · CrmOpportunityCreate| Field | Type | | Description |
|---|
| title | string | required | — |
| contact_id | string (nullable) | optional | — |
| company_id | string (nullable) | optional | — |
| service_id | string (nullable) | optional | — |
| pipeline_id | string (nullable) | optional | — |
| stage_id | string (nullable) | optional | — |
| value_minor | integer | optional | — |
| currency | string (nullable) | optional | — |
| source | CrmOpportunitySource | optional | — |
| assigned_to_account_id | string (nullable) | optional | — |
| source_query_id | string (nullable) | optional | — |
| expected_close_date | string<date> (nullable) | optional | — |
Response 201 · CrmOpportunityRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| title | string | required | — |
| contact_id | string (nullable) | optional | — |
| contact_name | string (nullable) | optional | — |
| company_id | string (nullable) | optional | — |
| company_name | string (nullable) | optional | — |
| service_id | string (nullable) | optional | — |
| service_name | string (nullable) | optional | — |
| pipeline_id | string | required | — |
| stage_id | string | required | — |
| stage_name | string (nullable) | optional | — |
| stage_type | CrmStageType (nullable) | optional | — |
| value_minor | integer | required | — |
| currency | string | required | — |
| source | CrmOpportunitySource | required | — |
| assigned_to_account_id | string (nullable) | optional | — |
| source_query_id | string (nullable) | optional | — |
| expected_close_date | string<date> (nullable) | optional | — |
| won_at | string<date-time> (nullable) | optional | — |
| lost_at | string<date-time> (nullable) | optional | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
Example requestcurl -X POST "https://api.webtools.ng/api/v1/storefront/projects/your-project/crm/opportunities" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "title": "…" }'
PATCH/api/v1/storefront/projects/{project_slug}/crm/opportunities/{opportunity_id}
Update Crm Opportunity
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
| opportunity_id | string | path | Required. |
Request body · CrmOpportunityUpdate| Field | Type | | Description |
|---|
| title | string (nullable) | optional | — |
| contact_id | string (nullable) | optional | — |
| company_id | string (nullable) | optional | — |
| service_id | string (nullable) | optional | — |
| pipeline_id | string (nullable) | optional | — |
| stage_id | string (nullable) | optional | — |
| value_minor | integer (nullable) | optional | — |
| currency | string (nullable) | optional | — |
| source | CrmOpportunitySource (nullable) | optional | — |
| assigned_to_account_id | string (nullable) | optional | — |
| source_query_id | string (nullable) | optional | — |
| expected_close_date | string<date> (nullable) | optional | — |
Response 200 · CrmOpportunityRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| title | string | required | — |
| contact_id | string (nullable) | optional | — |
| contact_name | string (nullable) | optional | — |
| company_id | string (nullable) | optional | — |
| company_name | string (nullable) | optional | — |
| service_id | string (nullable) | optional | — |
| service_name | string (nullable) | optional | — |
| pipeline_id | string | required | — |
| stage_id | string | required | — |
| stage_name | string (nullable) | optional | — |
| stage_type | CrmStageType (nullable) | optional | — |
| value_minor | integer | required | — |
| currency | string | required | — |
| source | CrmOpportunitySource | required | — |
| assigned_to_account_id | string (nullable) | optional | — |
| source_query_id | string (nullable) | optional | — |
| expected_close_date | string<date> (nullable) | optional | — |
| won_at | string<date-time> (nullable) | optional | — |
| lost_at | string<date-time> (nullable) | optional | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
Example requestcurl -X PATCH "https://api.webtools.ng/api/v1/storefront/projects/your-project/crm/opportunities/{opportunity_id}" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "title": "…", "contact_id": "…", "company_id": "…", "service_id": "…", "pipeline_id": "…", "stage_id": "…" }'
POST/api/v1/storefront/projects/{project_slug}/landing-pages
Create Landing Page
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
Request body · LandingPageCreate| Field | Type | | Description |
|---|
| name | string | required | — |
| slug | string | required | — |
| description | string (nullable) | optional | — |
| display_order | integer | optional | — |
| status | LandingPageStatus | optional | — |
| seo_title | string (nullable) | optional | — |
| seo_description | string (nullable) | optional | — |
| canonical_url | string (nullable) | optional | — |
| og_image_file_id | integer (nullable) | optional | — |
| theme | object (nullable) | optional | — |
| blocks | LandingPageBlockWrite[] | optional | — |
Response 201 · LandingPageRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| name | string | required | — |
| slug | string | required | — |
| description | string (nullable) | optional | — |
| status | LandingPageStatus | required | — |
| display_order | integer | required | — |
| theme | object | optional | — |
| published_at | string<date-time> (nullable) | optional | — |
| archived_at | string<date-time> (nullable) | optional | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
| seo | SeoRead | required | Nested SEO metadata for API read responses. |
| blocks | LandingPageBlockRead[] | optional | — |
| created_by_id | string (nullable) | optional | — |
| updated_by_id | string (nullable) | optional | — |
Example requestcurl -X POST "https://api.webtools.ng/api/v1/storefront/projects/your-project/landing-pages" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "name": "…", "slug": "…" }'
PATCH/api/v1/storefront/projects/{project_slug}/landing-pages/{page_slug}
Update Landing Page
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
| page_slug | string | path | Required. |
Request body · LandingPageUpdate| Field | Type | | Description |
|---|
| name | string (nullable) | optional | — |
| slug | string (nullable) | optional | — |
| description | string (nullable) | optional | — |
| display_order | integer (nullable) | optional | — |
| status | LandingPageStatus (nullable) | optional | — |
| seo_title | string (nullable) | optional | — |
| seo_description | string (nullable) | optional | — |
| canonical_url | string (nullable) | optional | — |
| og_image_file_id | integer (nullable) | optional | — |
| theme | object (nullable) | optional | — |
| blocks | LandingPageBlockWrite[] (nullable) | optional | — |
Response 200 · LandingPageRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| name | string | required | — |
| slug | string | required | — |
| description | string (nullable) | optional | — |
| status | LandingPageStatus | required | — |
| display_order | integer | required | — |
| theme | object | optional | — |
| published_at | string<date-time> (nullable) | optional | — |
| archived_at | string<date-time> (nullable) | optional | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
| seo | SeoRead | required | Nested SEO metadata for API read responses. |
| blocks | LandingPageBlockRead[] | optional | — |
| created_by_id | string (nullable) | optional | — |
| updated_by_id | string (nullable) | optional | — |
Example requestcurl -X PATCH "https://api.webtools.ng/api/v1/storefront/projects/your-project/landing-pages/{page_slug}" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "name": "…", "slug": "…", "description": "…", "display_order": 0, "status": "…", "seo_title": "…" }'
POST/api/v1/storefront/projects/{project_slug}/landing-pages/{page_slug}/duplicate
Duplicate Landing Page
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
| page_slug | string | path | Required. |
Response 201 · LandingPageRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| name | string | required | — |
| slug | string | required | — |
| description | string (nullable) | optional | — |
| status | LandingPageStatus | required | — |
| display_order | integer | required | — |
| theme | object | optional | — |
| published_at | string<date-time> (nullable) | optional | — |
| archived_at | string<date-time> (nullable) | optional | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
| seo | SeoRead | required | Nested SEO metadata for API read responses. |
| blocks | LandingPageBlockRead[] | optional | — |
| created_by_id | string (nullable) | optional | — |
| updated_by_id | string (nullable) | optional | — |
Example requestcurl -X POST "https://api.webtools.ng/api/v1/storefront/projects/your-project/landing-pages/{page_slug}/duplicate" \
-H "X-Project-Key: wt_pk_your_key"
POST/api/v1/storefront/projects/{project_slug}/landing-pages/{page_slug}/entries
Create Landing Page Entry
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
| page_slug | string | path | Required. |
Request body · LandingPageEntryCreate| Field | Type | | Description |
|---|
| name | string | required | — |
| slug | string | required | — |
| excerpt | string (nullable) | optional | — |
| display_order | integer | optional | — |
| status | LandingPageStatus | optional | — |
| seo_title | string (nullable) | optional | — |
| seo_description | string (nullable) | optional | — |
| canonical_url | string (nullable) | optional | — |
| og_image_file_id | integer (nullable) | optional | — |
| theme | object (nullable) | optional | — |
| blocks | object | optional | — |
Response 201 · LandingPageEntryRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| landing_page_id | string | required | — |
| name | string | required | — |
| slug | string | required | — |
| excerpt | string (nullable) | optional | — |
| status | LandingPageStatus | required | — |
| display_order | integer | required | — |
| theme_overrides | object | optional | — |
| published_at | string<date-time> (nullable) | optional | — |
| archived_at | string<date-time> (nullable) | optional | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
| theme | object | optional | — |
| seo | SeoRead | required | Nested SEO metadata for API read responses. |
| blocks | EntryBlockRead[] | optional | — |
| created_by_id | string (nullable) | optional | — |
| updated_by_id | string (nullable) | optional | — |
Example requestcurl -X POST "https://api.webtools.ng/api/v1/storefront/projects/your-project/landing-pages/{page_slug}/entries" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "name": "…", "slug": "…" }'
PATCH/api/v1/storefront/projects/{project_slug}/landing-pages/{page_slug}/entries/{entry_slug}
Update Landing Page Entry
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
| page_slug | string | path | Required. |
| entry_slug | string | path | Required. |
Request body · LandingPageEntryUpdate| Field | Type | | Description |
|---|
| name | string (nullable) | optional | — |
| slug | string (nullable) | optional | — |
| excerpt | string (nullable) | optional | — |
| display_order | integer (nullable) | optional | — |
| status | LandingPageStatus (nullable) | optional | — |
| seo_title | string (nullable) | optional | — |
| seo_description | string (nullable) | optional | — |
| canonical_url | string (nullable) | optional | — |
| og_image_file_id | integer (nullable) | optional | — |
| theme | object (nullable) | optional | — |
| blocks | object (nullable) | optional | — |
Response 200 · LandingPageEntryRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| landing_page_id | string | required | — |
| name | string | required | — |
| slug | string | required | — |
| excerpt | string (nullable) | optional | — |
| status | LandingPageStatus | required | — |
| display_order | integer | required | — |
| theme_overrides | object | optional | — |
| published_at | string<date-time> (nullable) | optional | — |
| archived_at | string<date-time> (nullable) | optional | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
| theme | object | optional | — |
| seo | SeoRead | required | Nested SEO metadata for API read responses. |
| blocks | EntryBlockRead[] | optional | — |
| created_by_id | string (nullable) | optional | — |
| updated_by_id | string (nullable) | optional | — |
Example requestcurl -X PATCH "https://api.webtools.ng/api/v1/storefront/projects/your-project/landing-pages/{page_slug}/entries/{entry_slug}" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "name": "…", "slug": "…", "excerpt": "…", "display_order": 0, "status": "…", "seo_title": "…" }'
POST/api/v1/storefront/projects/{project_slug}/landing-pages/{page_slug}/entries/{entry_slug}/duplicate
Duplicate Landing Page Entry
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
| page_slug | string | path | Required. |
| entry_slug | string | path | Required. |
Response 201 · LandingPageEntryRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| landing_page_id | string | required | — |
| name | string | required | — |
| slug | string | required | — |
| excerpt | string (nullable) | optional | — |
| status | LandingPageStatus | required | — |
| display_order | integer | required | — |
| theme_overrides | object | optional | — |
| published_at | string<date-time> (nullable) | optional | — |
| archived_at | string<date-time> (nullable) | optional | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
| theme | object | optional | — |
| seo | SeoRead | required | Nested SEO metadata for API read responses. |
| blocks | EntryBlockRead[] | optional | — |
| created_by_id | string (nullable) | optional | — |
| updated_by_id | string (nullable) | optional | — |
Example requestcurl -X POST "https://api.webtools.ng/api/v1/storefront/projects/your-project/landing-pages/{page_slug}/entries/{entry_slug}/duplicate" \
-H "X-Project-Key: wt_pk_your_key"
POST/api/v1/storefront/projects/{project_slug}/media
Upload Media
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
Request body · Body_upload_media_api_v1_storefront_projects__project_slug__media_post| Field | Type | | Description |
|---|
| file | string<binary> (nullable) | optional | — |
| file_asset_id | integer (nullable) | optional | — |
| alt_text | string (nullable) | optional | — |
| caption | string (nullable) | optional | — |
| description | string (nullable) | optional | — |
| aspect_ratio | string (nullable) | optional | — |
Response 201 · MediaAssetRead| Field | Type | | Description |
|---|
| id | string | required | — |
| file_asset_id | integer | required | — |
| project_id | string | required | — |
| alt_text | string (nullable) | optional | — |
| caption | string (nullable) | optional | — |
| description | string (nullable) | optional | — |
| url | string (nullable) | optional | — |
| key | string | required | — |
| content_type | string (nullable) | optional | — |
| file_size | integer (nullable) | optional | — |
| aspect_ratio | string (nullable) | optional | — |
| uploaded_by_id | string (nullable) | optional | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
Example requestcurl -X POST "https://api.webtools.ng/api/v1/storefront/projects/your-project/media" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "file": "…", "file_asset_id": 0, "alt_text": "…", "caption": "…", "description": "…", "aspect_ratio": "…" }'
POST/api/v1/storefront/projects/{project_slug}/past-works
Create Past Work
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
Request body · PastWorkCreate| Field | Type | | Description |
|---|
| title | string | required | — |
| slug | string | required | — |
| excerpt | string (nullable) | optional | — |
| description_html | string | required | — |
| client_name | string (nullable) | optional | — |
| industry | string (nullable) | optional | — |
| project_url | string (nullable) | optional | — |
| location | string (nullable) | optional | — |
| started_at | string<date-time> (nullable) | optional | — |
| completed_at | string<date-time> (nullable) | optional | — |
| status | PastWorkStatus | optional | — |
| is_featured | boolean | optional | — |
| display_order | integer | optional | — |
| seo_title | string (nullable) | optional | — |
| seo_description | string (nullable) | optional | — |
| featured_media_id | string (nullable) | optional | — |
Response 201 · PastWorkRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| title | string | required | — |
| slug | string | required | — |
| excerpt | string (nullable) | optional | — |
| client_name | string (nullable) | optional | — |
| industry | string (nullable) | optional | — |
| location | string (nullable) | optional | — |
| status | PastWorkStatus | required | — |
| is_featured | boolean | required | — |
| display_order | integer | required | — |
| featured_media_id | string (nullable) | optional | — |
| featured_media | PastWorkMediaRead (nullable) | optional | — |
| views | integer | optional | — |
| published_at | string<date-time> (nullable) | optional | — |
| archived_at | string<date-time> (nullable) | optional | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
| description_html | string | required | — |
| project_url | string (nullable) | optional | — |
| started_at | string<date-time> (nullable) | optional | — |
| completed_at | string<date-time> (nullable) | optional | — |
| seo | SeoRead | required | Nested SEO metadata for API read responses. |
| gallery | PastWorkMediaRead[] | optional | — |
| created_by_id | string (nullable) | optional | — |
| updated_by_id | string (nullable) | optional | — |
Example requestcurl -X POST "https://api.webtools.ng/api/v1/storefront/projects/your-project/past-works" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "title": "…", "slug": "…", "description_html": "…" }'
PATCH/api/v1/storefront/projects/{project_slug}/past-works/{past_work_slug}
Update Past Work
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
| past_work_slug | string | path | Required. |
Request body · PastWorkUpdate| Field | Type | | Description |
|---|
| title | string (nullable) | optional | — |
| slug | string (nullable) | optional | — |
| excerpt | string (nullable) | optional | — |
| description_html | string (nullable) | optional | — |
| client_name | string (nullable) | optional | — |
| industry | string (nullable) | optional | — |
| project_url | string (nullable) | optional | — |
| location | string (nullable) | optional | — |
| started_at | string<date-time> (nullable) | optional | — |
| completed_at | string<date-time> (nullable) | optional | — |
| status | PastWorkStatus (nullable) | optional | — |
| is_featured | boolean (nullable) | optional | — |
| display_order | integer (nullable) | optional | — |
| seo_title | string (nullable) | optional | — |
| seo_description | string (nullable) | optional | — |
| featured_media_id | string (nullable) | optional | — |
Response 200 · PastWorkRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| title | string | required | — |
| slug | string | required | — |
| excerpt | string (nullable) | optional | — |
| client_name | string (nullable) | optional | — |
| industry | string (nullable) | optional | — |
| location | string (nullable) | optional | — |
| status | PastWorkStatus | required | — |
| is_featured | boolean | required | — |
| display_order | integer | required | — |
| featured_media_id | string (nullable) | optional | — |
| featured_media | PastWorkMediaRead (nullable) | optional | — |
| views | integer | optional | — |
| published_at | string<date-time> (nullable) | optional | — |
| archived_at | string<date-time> (nullable) | optional | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
| description_html | string | required | — |
| project_url | string (nullable) | optional | — |
| started_at | string<date-time> (nullable) | optional | — |
| completed_at | string<date-time> (nullable) | optional | — |
| seo | SeoRead | required | Nested SEO metadata for API read responses. |
| gallery | PastWorkMediaRead[] | optional | — |
| created_by_id | string (nullable) | optional | — |
| updated_by_id | string (nullable) | optional | — |
Example requestcurl -X PATCH "https://api.webtools.ng/api/v1/storefront/projects/your-project/past-works/{past_work_slug}" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "title": "…", "slug": "…", "excerpt": "…", "description_html": "…", "client_name": "…", "industry": "…" }'
POST/api/v1/storefront/projects/{project_slug}/past-works/{past_work_slug}/duplicate
Duplicate Past Work
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
| past_work_slug | string | path | Required. |
Response 201 · PastWorkRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| title | string | required | — |
| slug | string | required | — |
| excerpt | string (nullable) | optional | — |
| client_name | string (nullable) | optional | — |
| industry | string (nullable) | optional | — |
| location | string (nullable) | optional | — |
| status | PastWorkStatus | required | — |
| is_featured | boolean | required | — |
| display_order | integer | required | — |
| featured_media_id | string (nullable) | optional | — |
| featured_media | PastWorkMediaRead (nullable) | optional | — |
| views | integer | optional | — |
| published_at | string<date-time> (nullable) | optional | — |
| archived_at | string<date-time> (nullable) | optional | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
| description_html | string | required | — |
| project_url | string (nullable) | optional | — |
| started_at | string<date-time> (nullable) | optional | — |
| completed_at | string<date-time> (nullable) | optional | — |
| seo | SeoRead | required | Nested SEO metadata for API read responses. |
| gallery | PastWorkMediaRead[] | optional | — |
| created_by_id | string (nullable) | optional | — |
| updated_by_id | string (nullable) | optional | — |
Example requestcurl -X POST "https://api.webtools.ng/api/v1/storefront/projects/your-project/past-works/{past_work_slug}/duplicate" \
-H "X-Project-Key: wt_pk_your_key"
POST/api/v1/storefront/projects/{project_slug}/posts
Create Post
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
Request body · PostCreate| Field | Type | | Description |
|---|
| title | string | required | — |
| slug | string | required | — |
| excerpt | string (nullable) | optional | — |
| content_html | string | required | — |
| status | PostStatus | optional | Editorial status for CMS posts. |
| category_id | string (nullable) | optional | — |
| featured_image_file_id | integer (nullable) | optional | — |
| seo_title | string (nullable) | optional | — |
| seo_description | string (nullable) | optional | — |
| canonical_url | string (nullable) | optional | — |
| og_image_file_id | integer (nullable) | optional | — |
| is_featured | boolean | optional | — |
| author_ids | string[] | optional | — |
| tag_ids | string[] | optional | — |
Response 201 · PostRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| title | string | required | — |
| slug | string | required | — |
| excerpt | string (nullable) | optional | — |
| status | PostStatus | required | Editorial status for CMS posts. |
| category | PostCategoryRead (nullable) | optional | — |
| featured_image_file | FileOut (nullable) | optional | — |
| is_featured | boolean | required | — |
| published_at | string<date-time> (nullable) | optional | — |
| scheduled_at | string<date-time> (nullable) | optional | — |
| archived_at | string<date-time> (nullable) | optional | — |
| created_by_id | string (nullable) | optional | — |
| updated_by_id | string (nullable) | optional | — |
| authors | PostAuthorRead[] | optional | — |
| tags | PostTagRead[] | optional | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
| content_html | string | required | — |
| seo | SeoRead | required | Nested SEO metadata for API read responses. |
| gallery | PostGalleryImageRead[] | optional | — |
Example requestcurl -X POST "https://api.webtools.ng/api/v1/storefront/projects/your-project/posts" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "title": "…", "slug": "…", "content_html": "…" }'
PATCH/api/v1/storefront/projects/{project_slug}/posts/{post_slug}
Update Post
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
| post_slug | string | path | Required. |
Request body · PostUpdate| Field | Type | | Description |
|---|
| title | string (nullable) | optional | — |
| slug | string (nullable) | optional | — |
| excerpt | string (nullable) | optional | — |
| content_html | string (nullable) | optional | — |
| status | PostStatus (nullable) | optional | — |
| category_id | string (nullable) | optional | — |
| featured_image_file_id | integer (nullable) | optional | — |
| seo_title | string (nullable) | optional | — |
| seo_description | string (nullable) | optional | — |
| canonical_url | string (nullable) | optional | — |
| og_image_file_id | integer (nullable) | optional | — |
| is_featured | boolean (nullable) | optional | — |
| author_ids | string[] (nullable) | optional | — |
| tag_ids | string[] (nullable) | optional | — |
Response 200 · PostRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| title | string | required | — |
| slug | string | required | — |
| excerpt | string (nullable) | optional | — |
| status | PostStatus | required | Editorial status for CMS posts. |
| category | PostCategoryRead (nullable) | optional | — |
| featured_image_file | FileOut (nullable) | optional | — |
| is_featured | boolean | required | — |
| published_at | string<date-time> (nullable) | optional | — |
| scheduled_at | string<date-time> (nullable) | optional | — |
| archived_at | string<date-time> (nullable) | optional | — |
| created_by_id | string (nullable) | optional | — |
| updated_by_id | string (nullable) | optional | — |
| authors | PostAuthorRead[] | optional | — |
| tags | PostTagRead[] | optional | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
| content_html | string | required | — |
| seo | SeoRead | required | Nested SEO metadata for API read responses. |
| gallery | PostGalleryImageRead[] | optional | — |
Example requestcurl -X PATCH "https://api.webtools.ng/api/v1/storefront/projects/your-project/posts/{post_slug}" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "title": "…", "slug": "…", "excerpt": "…", "content_html": "…", "status": "…", "category_id": "…" }'
POST/api/v1/storefront/projects/{project_slug}/posts/{post_slug}/duplicate
Duplicate Post
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
| post_slug | string | path | Required. |
Response 201 · PostRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| title | string | required | — |
| slug | string | required | — |
| excerpt | string (nullable) | optional | — |
| status | PostStatus | required | Editorial status for CMS posts. |
| category | PostCategoryRead (nullable) | optional | — |
| featured_image_file | FileOut (nullable) | optional | — |
| is_featured | boolean | required | — |
| published_at | string<date-time> (nullable) | optional | — |
| scheduled_at | string<date-time> (nullable) | optional | — |
| archived_at | string<date-time> (nullable) | optional | — |
| created_by_id | string (nullable) | optional | — |
| updated_by_id | string (nullable) | optional | — |
| authors | PostAuthorRead[] | optional | — |
| tags | PostTagRead[] | optional | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
| content_html | string | required | — |
| seo | SeoRead | required | Nested SEO metadata for API read responses. |
| gallery | PostGalleryImageRead[] | optional | — |
Example requestcurl -X POST "https://api.webtools.ng/api/v1/storefront/projects/your-project/posts/{post_slug}/duplicate" \
-H "X-Project-Key: wt_pk_your_key"
POST/api/v1/storefront/projects/{project_slug}/product-categories
Create Product Category
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
Request body · ProductCategoryCreate| Field | Type | | Description |
|---|
| parent_id | string (nullable) | optional | — |
| name | string | required | — |
| slug | string | required | — |
| description | string (nullable) | optional | — |
| image_file_id | integer (nullable) | optional | — |
| seo_title | string (nullable) | optional | — |
| seo_description | string (nullable) | optional | — |
| canonical_url | string (nullable) | optional | — |
| og_image_file_id | integer (nullable) | optional | — |
| position | integer | optional | — |
| status | CollectionStatus | optional | — |
Response 201 · ProductCategoryRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| parent_id | string (nullable) | optional | — |
| name | string | required | — |
| slug | string | required | — |
| description | string (nullable) | optional | — |
| image_file | FileOut (nullable) | optional | — |
| seo | SeoRead | required | Nested SEO metadata for API read responses. |
| position | integer | required | — |
| status | CollectionStatus | required | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
Example requestcurl -X POST "https://api.webtools.ng/api/v1/storefront/projects/your-project/product-categories" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "name": "…", "slug": "…" }'
PATCH/api/v1/storefront/projects/{project_slug}/product-categories/{category_slug}
Update Product Category
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
| category_slug | string | path | Required. |
Request body · ProductCategoryUpdate| Field | Type | | Description |
|---|
| parent_id | string (nullable) | optional | — |
| name | string (nullable) | optional | — |
| slug | string (nullable) | optional | — |
| description | string (nullable) | optional | — |
| image_file_id | integer (nullable) | optional | — |
| seo_title | string (nullable) | optional | — |
| seo_description | string (nullable) | optional | — |
| canonical_url | string (nullable) | optional | — |
| og_image_file_id | integer (nullable) | optional | — |
| position | integer (nullable) | optional | — |
| status | CollectionStatus (nullable) | optional | — |
Response 200 · ProductCategoryRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| parent_id | string (nullable) | optional | — |
| name | string | required | — |
| slug | string | required | — |
| description | string (nullable) | optional | — |
| image_file | FileOut (nullable) | optional | — |
| seo | SeoRead | required | Nested SEO metadata for API read responses. |
| position | integer | required | — |
| status | CollectionStatus | required | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
Example requestcurl -X PATCH "https://api.webtools.ng/api/v1/storefront/projects/your-project/product-categories/{category_slug}" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "parent_id": "…", "name": "…", "slug": "…", "description": "…", "image_file_id": 0, "seo_title": "…" }'
POST/api/v1/storefront/projects/{project_slug}/products
Create Product
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
Request body · ProductCreate| Field | Type | | Description |
|---|
| name | string | required | — |
| slug | string | required | — |
| status | ProductStatus | optional | — |
| product_type | ProductType | optional | — |
| short_description | string (nullable) | optional | — |
| description_html | string (nullable) | optional | — |
| brand | string (nullable) | optional | — |
| specifications | object | optional | — |
| seo_title | string (nullable) | optional | — |
| seo_description | string (nullable) | optional | — |
| canonical_url | string (nullable) | optional | — |
| og_image_file_id | integer (nullable) | optional | — |
| is_featured | boolean | optional | — |
| category_ids | string[] | optional | — |
| default_variant | ProductVariantCreate | optional | — |
Response 201 · ProductRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| name | string | required | — |
| slug | string | required | — |
| status | ProductStatus | required | — |
| product_type | ProductType | required | — |
| short_description | string (nullable) | optional | — |
| brand | string (nullable) | optional | — |
| specifications | object | required | — |
| is_featured | boolean | required | — |
| published_at | string<date-time> (nullable) | optional | — |
| archived_at | string<date-time> (nullable) | optional | — |
| variants | ProductVariantRead[] | required | — |
| categories | ProductCategoryAssignmentRead[] | required | — |
| media | ProductMediaRead[] | required | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
| description_html | string (nullable) | optional | — |
| seo | SeoRead | required | Nested SEO metadata for API read responses. |
Example requestcurl -X POST "https://api.webtools.ng/api/v1/storefront/projects/your-project/products" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "name": "…", "slug": "…" }'
PATCH/api/v1/storefront/projects/{project_slug}/products/{product_slug}
Update Product
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
| product_slug | string | path | Required. |
Request body · ProductUpdate| Field | Type | | Description |
|---|
| name | string (nullable) | optional | — |
| slug | string (nullable) | optional | — |
| product_type | ProductType (nullable) | optional | — |
| short_description | string (nullable) | optional | — |
| description_html | string (nullable) | optional | — |
| brand | string (nullable) | optional | — |
| specifications | object (nullable) | optional | — |
| seo_title | string (nullable) | optional | — |
| seo_description | string (nullable) | optional | — |
| canonical_url | string (nullable) | optional | — |
| og_image_file_id | integer (nullable) | optional | — |
| is_featured | boolean (nullable) | optional | — |
| category_ids | string[] (nullable) | optional | — |
Response 200 · ProductRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| name | string | required | — |
| slug | string | required | — |
| status | ProductStatus | required | — |
| product_type | ProductType | required | — |
| short_description | string (nullable) | optional | — |
| brand | string (nullable) | optional | — |
| specifications | object | required | — |
| is_featured | boolean | required | — |
| published_at | string<date-time> (nullable) | optional | — |
| archived_at | string<date-time> (nullable) | optional | — |
| variants | ProductVariantRead[] | required | — |
| categories | ProductCategoryAssignmentRead[] | required | — |
| media | ProductMediaRead[] | required | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
| description_html | string (nullable) | optional | — |
| seo | SeoRead | required | Nested SEO metadata for API read responses. |
Example requestcurl -X PATCH "https://api.webtools.ng/api/v1/storefront/projects/your-project/products/{product_slug}" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "name": "…", "slug": "…", "product_type": "…", "short_description": "…", "description_html": "…", "brand": "…" }'
POST/api/v1/storefront/projects/{project_slug}/products/{product_slug}/duplicate
Duplicate Product
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
| product_slug | string | path | Required. |
Response 201 · ProductRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| name | string | required | — |
| slug | string | required | — |
| status | ProductStatus | required | — |
| product_type | ProductType | required | — |
| short_description | string (nullable) | optional | — |
| brand | string (nullable) | optional | — |
| specifications | object | required | — |
| is_featured | boolean | required | — |
| published_at | string<date-time> (nullable) | optional | — |
| archived_at | string<date-time> (nullable) | optional | — |
| variants | ProductVariantRead[] | required | — |
| categories | ProductCategoryAssignmentRead[] | required | — |
| media | ProductMediaRead[] | required | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
| description_html | string (nullable) | optional | — |
| seo | SeoRead | required | Nested SEO metadata for API read responses. |
Example requestcurl -X POST "https://api.webtools.ng/api/v1/storefront/projects/your-project/products/{product_slug}/duplicate" \
-H "X-Project-Key: wt_pk_your_key"
POST/api/v1/storefront/projects/{project_slug}/services
Create Service
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
Request body · ServiceCreate| Field | Type | | Description |
|---|
| name | string | required | — |
| slug | string | required | — |
| excerpt | string (nullable) | optional | — |
| description_html | string | required | — |
| category | string (nullable) | optional | — |
| pricing_type | ServicePricingType | optional | — |
| price_minor | integer (nullable) | optional | — |
| currency | string (nullable) | optional | — |
| duration_text | string (nullable) | optional | — |
| featured_media_id | string (nullable) | optional | — |
| cta_type | ServiceCtaType | optional | — |
| cta_label | string (nullable) | optional | — |
| cta_url | string (nullable) | optional | — |
| is_featured | boolean | optional | — |
| display_order | integer | optional | — |
| seo_title | string (nullable) | optional | — |
| seo_description | string (nullable) | optional | — |
| deliverables | ServiceDeliverableWrite[] | optional | — |
Response 201 · ServiceRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| name | string | required | — |
| slug | string | required | — |
| excerpt | string (nullable) | optional | — |
| category | string (nullable) | optional | — |
| pricing_type | ServicePricingType | required | — |
| price_minor | integer (nullable) | optional | — |
| currency | string (nullable) | optional | — |
| status | ServiceStatus | required | — |
| is_featured | boolean | required | — |
| display_order | integer | required | — |
| featured_media_id | string (nullable) | optional | — |
| featured_media | ServiceMediaRead (nullable) | optional | — |
| views | integer | optional | — |
| enquiries | integer | optional | — |
| published_at | string<date-time> (nullable) | optional | — |
| archived_at | string<date-time> (nullable) | optional | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
| description_html | string | required | — |
| duration_text | string (nullable) | optional | — |
| cta_type | ServiceCtaType | required | — |
| cta_label | string (nullable) | optional | — |
| cta_url | string (nullable) | optional | — |
| seo | SeoRead | required | Nested SEO metadata for API read responses. |
| deliverables | ServiceDeliverableRead[] | optional | — |
| gallery | ServiceMediaRead[] | optional | — |
| created_by_id | string (nullable) | optional | — |
| updated_by_id | string (nullable) | optional | — |
Example requestcurl -X POST "https://api.webtools.ng/api/v1/storefront/projects/your-project/services" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "name": "…", "slug": "…", "description_html": "…" }'
PATCH/api/v1/storefront/projects/{project_slug}/services/{service_slug}
Update Service
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
| service_slug | string | path | Required. |
Request body · ServiceUpdate| Field | Type | | Description |
|---|
| name | string (nullable) | optional | — |
| slug | string (nullable) | optional | — |
| excerpt | string (nullable) | optional | — |
| description_html | string (nullable) | optional | — |
| category | string (nullable) | optional | — |
| pricing_type | ServicePricingType (nullable) | optional | — |
| price_minor | integer (nullable) | optional | — |
| currency | string (nullable) | optional | — |
| duration_text | string (nullable) | optional | — |
| featured_media_id | string (nullable) | optional | — |
| cta_type | ServiceCtaType (nullable) | optional | — |
| cta_label | string (nullable) | optional | — |
| cta_url | string (nullable) | optional | — |
| is_featured | boolean (nullable) | optional | — |
| display_order | integer (nullable) | optional | — |
| seo_title | string (nullable) | optional | — |
| seo_description | string (nullable) | optional | — |
| deliverables | ServiceDeliverableWrite[] (nullable) | optional | — |
Response 200 · ServiceRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| name | string | required | — |
| slug | string | required | — |
| excerpt | string (nullable) | optional | — |
| category | string (nullable) | optional | — |
| pricing_type | ServicePricingType | required | — |
| price_minor | integer (nullable) | optional | — |
| currency | string (nullable) | optional | — |
| status | ServiceStatus | required | — |
| is_featured | boolean | required | — |
| display_order | integer | required | — |
| featured_media_id | string (nullable) | optional | — |
| featured_media | ServiceMediaRead (nullable) | optional | — |
| views | integer | optional | — |
| enquiries | integer | optional | — |
| published_at | string<date-time> (nullable) | optional | — |
| archived_at | string<date-time> (nullable) | optional | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
| description_html | string | required | — |
| duration_text | string (nullable) | optional | — |
| cta_type | ServiceCtaType | required | — |
| cta_label | string (nullable) | optional | — |
| cta_url | string (nullable) | optional | — |
| seo | SeoRead | required | Nested SEO metadata for API read responses. |
| deliverables | ServiceDeliverableRead[] | optional | — |
| gallery | ServiceMediaRead[] | optional | — |
| created_by_id | string (nullable) | optional | — |
| updated_by_id | string (nullable) | optional | — |
Example requestcurl -X PATCH "https://api.webtools.ng/api/v1/storefront/projects/your-project/services/{service_slug}" \
-H "X-Project-Key: wt_pk_your_key" \
-H "Content-Type: application/json" \
-d '{ "name": "…", "slug": "…", "excerpt": "…", "description_html": "…", "category": "…", "pricing_type": "…" }'
POST/api/v1/storefront/projects/{project_slug}/services/{service_slug}/duplicate
Duplicate Service
Parameters| Name | Type | In | Description |
|---|
| project_slug | string | path | Required. |
| service_slug | string | path | Required. |
Response 201 · ServiceRead| Field | Type | | Description |
|---|
| id | string | required | — |
| project_id | string | required | — |
| name | string | required | — |
| slug | string | required | — |
| excerpt | string (nullable) | optional | — |
| category | string (nullable) | optional | — |
| pricing_type | ServicePricingType | required | — |
| price_minor | integer (nullable) | optional | — |
| currency | string (nullable) | optional | — |
| status | ServiceStatus | required | — |
| is_featured | boolean | required | — |
| display_order | integer | required | — |
| featured_media_id | string (nullable) | optional | — |
| featured_media | ServiceMediaRead (nullable) | optional | — |
| views | integer | optional | — |
| enquiries | integer | optional | — |
| published_at | string<date-time> (nullable) | optional | — |
| archived_at | string<date-time> (nullable) | optional | — |
| created_at | string<date-time> | required | — |
| updated_at | string<date-time> | required | — |
| description_html | string | required | — |
| duration_text | string (nullable) | optional | — |
| cta_type | ServiceCtaType | required | — |
| cta_label | string (nullable) | optional | — |
| cta_url | string (nullable) | optional | — |
| seo | SeoRead | required | Nested SEO metadata for API read responses. |
| deliverables | ServiceDeliverableRead[] | optional | — |
| gallery | ServiceMediaRead[] | optional | — |
| created_by_id | string (nullable) | optional | — |
| updated_by_id | string (nullable) | optional | — |
Example requestcurl -X POST "https://api.webtools.ng/api/v1/storefront/projects/your-project/services/{service_slug}/duplicate" \
-H "X-Project-Key: wt_pk_your_key"