API Reference
Complete reference for the Natakahii REST API. All endpoints accept and return JSON. Use the navigation to jump to any endpoint.
Authentication — Endpoints marked with a red AUTH chip require a valid JWT token.
Include it as Authorization: Bearer <token> in every authenticated request.
Media Storage — All uploaded files (images, videos, logos) are stored in Backblaze B2 cloud storage and served via CDN.
File URLs in responses use the format https://cdn.natakahii.com/path/file.ext.
Authentication
Endpoints for user registration, login, token management and password recovery.
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
name
string
Yes
max:255
Full name of the user.
email
string
Yes
email|unique:users
Valid email address. Must be unique.
password
string
Yes
min:8|mixed_case|numbers
Password with uppercase, lowercase and numbers.
phone
string
Optional
max:20
Phone number (optional).
curl -X POST \
"https://up.openjournaltheme.com/api/v1/auth/register" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"name" : "John Doe" ,
"email" : "[email protected] " ,
"password" : "SecurePass123" ,
"phone" : "+255700000000"
}'
200 Success
422 Validation failed
200 OK
{
"message" : "Registration initiated. Please check your email for OTP verification." ,
"email" : "[email protected] "
}
422
Validation failed
{
"message" : "The email has already been taken." ,
"errors" : {
"email" : [
"The email has already been taken."
]
}
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
email
string
Yes
email
Email used during registration.
otp
string
Yes
size:6
Six-digit OTP code received via email.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/auth/verify-registration" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"email" : "[email protected] " ,
"otp" : "123456"
}'
201 Success
400 Invalid or expired OTP
404 Registration data expired
201 OK
{
"message" : "Registration successful." ,
"user" : {
"id" : 1 ,
"name" : "John Doe" ,
"email" : "[email protected] "
} ,
"token" : "eyJ0eXAiOiJKV1QiLCJhbGc..." ,
"token_type" : "bearer" ,
"expires_in" : 3600
}
400
Invalid or expired OTP
{
"message" : "Invalid or expired OTP."
}
404
Registration data expired
{
"message" : "Registration data not found or expired. Please register again."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
email
string
Yes
email
Registered email address.
password
string
Yes
—
Account password.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/auth/login" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"email" : "[email protected] " ,
"password" : "SecurePass123"
}'
200 Success
401 Invalid credentials
403 Account blocked
200 OK
{
"message" : "Login successful." ,
"user" : {
"id" : 1 ,
"name" : "John Doe" ,
"email" : "[email protected] "
} ,
"token" : "eyJ0eXAiOiJKV1QiLCJhbGc..." ,
"token_type" : "bearer" ,
"expires_in" : 3600
}
401
Invalid credentials
{
"message" : "Invalid email or password."
}
403
Account blocked
{
"message" : "Your account has been blocked. Please contact support."
}
POST
curl -X POST \
"https://up.openjournaltheme.com/api/v1/auth/logout" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
401 Unauthenticated
200 OK
{
"message" : "Successfully logged out."
}
401
Unauthenticated
{
"message" : "Unauthenticated."
}
POST
curl -X POST \
"https://up.openjournaltheme.com/api/v1/auth/refresh" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
401 Unauthenticated
200 OK
{
"token" : "eyJ0eXAiOiJKV1QiLCJhbGc..." ,
"token_type" : "bearer" ,
"expires_in" : 3600
}
401
Unauthenticated
{
"message" : "Unauthenticated."
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/auth/me" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
401 Unauthenticated
200 OK
{
"user" : {
"id" : 1 ,
"name" : "John Doe" ,
"email" : "[email protected] " ,
"phone" : "+1234567890" ,
"profile_photo" : "https://cdn.natakahii.com/users/avatars/abc123.jpg" ,
"status" : "active" ,
"roles" : [
{
"id" : 1 ,
"name" : "customer"
}
]
}
}
401
Unauthenticated
{
"message" : "Unauthenticated."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
email
string
Yes
email|exists:users
Registered email address.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/auth/forgot-password" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"email" : "[email protected] "
}'
200 Success
422 Validation failed
200 OK
{
"message" : "Password reset OTP sent to your email."
}
422
Validation failed
{
"message" : "The selected email is invalid." ,
"errors" : {
"email" : [
"The selected email is invalid."
]
}
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
email
string
Yes
email|exists:users
Registered email address.
otp
string
Yes
size:6
Six-digit OTP code from email.
password
string
Yes
min:8|mixed_case|numbers|confirmed
New password.
password_confirmation
string
Yes
—
Must match password field.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/auth/reset-password" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"email" : "[email protected] " ,
"otp" : "123456" ,
"password" : "SecurePass123" ,
"password_confirmation" : "SecurePass123"
}'
200 Success
400 Invalid or expired OTP
200 OK
{
"message" : "Password reset successful. You can now login with your new password."
}
400
Invalid or expired OTP
{
"message" : "Invalid or expired OTP."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
email
string
Yes
email
Email to resend OTP to.
type
string
Yes
in:registration,password_reset,email_verification
OTP purpose type.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/auth/resend-otp" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"email" : "[email protected] " ,
"type" : "value"
}'
200 Success
429 Too many requests
200 OK
{
"message" : "OTP resent successfully."
}
429
Too many requests
{
"message" : "Please wait before requesting a new OTP."
}
User Profile
Manage the authenticated user's profile and profile photo. Photos are stored in Backblaze B2 and served via CDN.
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/vendor-application/status" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
401 Unauthenticated
200 OK
{
"status" : "pending" ,
"application" : {
"id" : 1 ,
"business_name" : "My Store" ,
"status" : "pending" ,
"submitted_at" : "2026-02-08T10: 00 : 00 Z"
}
}
401
Unauthenticated
{
"message" : "Unauthenticated."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
business_name
string
Yes
max:255
Business/shop name.
business_description
string
Yes
—
Description of the business.
business_address
string
Yes
—
Business physical address.
business_phone
string
Yes
max:20
Business contact phone.
business_email
string
Yes
email
Business contact email.
tax_id
string
Optional
max:50
Tax ID number (optional).
documents
array
Optional
—
Array of document file uploads.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/vendor-application" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"business_name" : "John Doe" ,
"business_description" : "value" ,
"business_address" : "value" ,
"business_phone" : "+255700000000" ,
"business_email" : "[email protected] " ,
"tax_id" : "value" ,
"documents" : []
}'
201 Success
422 Validation failed
201 OK
{
"message" : "Vendor application submitted successfully." ,
"application" : {
"id" : 1 ,
"business_name" : "My Store" ,
"status" : "pending"
}
}
422
Validation failed
{
"message" : "The business name field is required."
}
PATCH
Request Body
application/json
Parameter
Type
Required
Rules
Description
name
string
Optional
max:255
Updated display name.
phone
string
Optional
max:20
Updated phone number.
curl -X PATCH \
"https://up.openjournaltheme.com/api/v1/profile" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"name" : "John Doe" ,
"phone" : "+255700000000"
}'
200 Success
401 Unauthenticated
200 OK
{
"message" : "Profile updated." ,
"user" : {
"id" : 1 ,
"name" : "John Doe" ,
"email" : "[email protected] " ,
"phone" : "+255700000000" ,
"profile_photo" : "https://cdn.natakahii.com/users/avatars/abc123.jpg" ,
"status" : "active" ,
"roles" : [
"customer"
]
}
}
401
Unauthenticated
{
"message" : "Unauthenticated."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
photo
file
Yes
image|max:5120
Profile photo image (max 5MB). Accepts JPEG, PNG, GIF, WebP.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/profile/photo" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-F "photo=@/path/to/photo.jpg"
200 Success
422 Validation failed
200 OK
{
"message" : "Profile photo updated." ,
"user" : {
"id" : 1 ,
"name" : "John Doe" ,
"profile_photo" : "https://cdn.natakahii.com/users/avatars/abc123.jpg"
}
}
422
Validation failed
{
"message" : "The photo field must be an image." ,
"errors" : {
"photo" : [
"The photo field must be an image."
]
}
}
DELETE
curl -X DELETE \
"https://up.openjournaltheme.com/api/v1/profile/photo" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
401 Unauthenticated
200 OK
{
"message" : "Profile photo removed." ,
"user" : {
"id" : 1 ,
"name" : "John Doe" ,
"profile_photo" : null
}
}
401
Unauthenticated
{
"message" : "Unauthenticated."
}
Catalog
Public product catalog browsing. No authentication required.
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/categories" \
-H "Content-Type: application/json" \
-H "Accept: application/json"
200 Success
200 OK
{
"categories" : [
{
"id" : 1 ,
"name" : "Electronics" ,
"slug" : "electronics" ,
"children" : [
{
"id" : 2 ,
"name" : "Phones"
}
] ,
"products_count" : 45
}
]
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/categories/{category}/filters" \
-H "Content-Type: application/json" \
-H "Accept: application/json"
200 Success
404 Category not found
200 OK
{
"category" : {
"id" : 1 ,
"name" : "Electronics"
} ,
"filters" : [
{
"id" : 1 ,
"name" : "Color" ,
"values" : [
{
"id" : 1 ,
"value" : "Red"
}
]
}
]
}
404
Category not found
{
"message" : "Not found."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
category_id
integer
Optional
—
Filter by category.
vendor_id
integer
Optional
—
Filter by vendor.
search
string
Optional
—
Search by name or description.
min_price
number
Optional
—
Minimum price filter.
max_price
number
Optional
—
Maximum price filter.
sort_by
string
Optional
in:created_at,price,name
Sort field. Default: created_at.
sort_dir
string
Optional
in:asc,desc
Sort direction. Default: desc.
per_page
integer
Optional
—
Items per page. Default: 15.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/products" \
-H "Content-Type: application/json" \
-H "Accept: application/json"
200 Success
200 OK
{
"products" : [
{
"id" : 1 ,
"name" : "Wireless Earbuds" ,
"price" : "29999.00" ,
"image" : "https://cdn.natakahii.com/products/1/earbuds.jpg" ,
"vendor" : {
"shop_name" : "TechShop" ,
"logo" : "https://cdn.natakahii.com/vendors/logos/techshop.png"
}
}
] ,
"meta" : {
"current_page" : 1 ,
"last_page" : 5 ,
"per_page" : 15 ,
"total" : 68
}
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/products/{product}" \
-H "Content-Type: application/json" \
-H "Accept: application/json"
200 Success
404 Product not found
200 OK
{
"product" : {
"id" : 1 ,
"name" : "Wireless Earbuds" ,
"price" : "29999.00" ,
"images" : [
"https://cdn.natakahii.com/products/1/earbuds.jpg"
] ,
"variants" : [ ] ,
"reviews_count" : 12 ,
"reviews_avg_rating" : "4.50"
} ,
"recent_reviews" : [ ]
}
404
Product not found
{
"message" : "Not found."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
attribute_value_ids
string
Yes
—
Comma-separated attribute value IDs.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/products/{product}/variants/resolve?attribute_value_ids=1,4,7" \
-H "Content-Type: application/json" \
-H "Accept: application/json"
200 Success
404 No matching variant
200 OK
{
"variant" : {
"id" : 1 ,
"sku" : "WE-BLK-M" ,
"price" : "29999.00" ,
"stock" : 50
}
}
404
No matching variant
{
"message" : "No matching variant found for the selected attributes."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
search
string
Optional
—
Search by shop name or description.
per_page
integer
Optional
—
Items per page. Default: 15.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/vendors" \
-H "Content-Type: application/json" \
-H "Accept: application/json"
200 Success
200 OK
{
"vendors" : [
{
"id" : 1 ,
"shop_name" : "TechShop" ,
"logo" : "https://cdn.natakahii.com/vendors/logos/techshop.png" ,
"products_count" : 45
}
] ,
"meta" : {
"current_page" : 1 ,
"last_page" : 2 ,
"per_page" : 15 ,
"total" : 20
}
}
Vendor
Vendor store management. Requires authentication and vendor role.
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
shop_name
string
Yes
max:255
Store display name.
shop_slug
string
Yes
alpha_dash|unique:vendors
URL-friendly store slug.
description
string
Optional
—
Store description.
logo
file
Optional
image|max:2048
Store logo image.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/vendor/profile" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-F "shop_name=value" \
-F "shop_slug=value" \
-F "description=value" \
-F "logo=@/path/to/logo.jpg"
201 Success
422 Validation failed
201 OK
{
"message" : "Vendor profile created. Awaiting approval." ,
"vendor" : {
"id" : 1 ,
"shop_name" : "My Store" ,
"logo" : "https://cdn.natakahii.com/vendors/logos/my-store.png" ,
"status" : "pending"
}
}
422
Validation failed
{
"message" : "The shop slug has already been taken."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
category_id
integer
Yes
exists:categories,id
Product category.
name
string
Yes
max:255
Product name.
description
string
Optional
—
Product description.
price
number
Yes
numeric|min:0
Base price.
discount_price
number
Optional
numeric|min:0
Discounted price.
stock
integer
Yes
integer|min:0
Available stock.
images[]
file
Optional
image|max:2048
Product images (multiple).
variants
array
Optional
—
Array of variant objects with sku, price, stock, attributes.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/vendor/products" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-F "category_id=1" \
-F "name=value" \
-F "description=value" \
-F "price=100.00" \
-F "discount_price=100.00" \
-F "stock=1" \
-F "images[]=@/path/to/images.jpg" \
-F "variants=[]"
201 Success
403 Vendor not approved
201 OK
{
"message" : "Product created successfully." ,
"product" : {
"id" : 1 ,
"name" : "Wireless Earbuds" ,
"slug" : "wireless-earbuds-abc123" ,
"images" : [
"https://cdn.natakahii.com/products/1/earbuds-1.jpg",
"https://cdn.natakahii.com/products/1/earbuds-2.jpg"
]
}
}
403
Vendor not approved
{
"message" : "Your vendor account must be approved before listing products."
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/vendor/dropoffs" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
404 No vendor profile
200 OK
{
"dropoffs" : [
{
"id" : 1 ,
"status" : "pending" ,
"order_id" : 10
}
]
}
404
No vendor profile
{
"message" : "No vendor profile found."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
order_id
integer
Yes
exists:orders,id
Order to drop off.
fulfillment_center_id
integer
Yes
exists:fulfillment_centers,id
Target fulfillment center.
notes
string
Optional
—
Additional notes.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/vendor/dropoffs" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"order_id" : 1,
"fulfillment_center_id" : 1,
"notes" : "value"
}'
201 Success
404 No vendor profile
201 OK
{
"message" : "Dropoff registered." ,
"dropoff" : {
"id" : 1 ,
"status" : "pending"
}
}
404
No vendor profile
{
"message" : "No vendor profile found."
}
Cart, Wishlist & Alerts
Shopping cart management, wishlists and price/stock alerts. Requires authentication.
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/cart" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
401 Unauthenticated
200 OK
{
"cart" : {
"id" : 1 ,
"items" : [
{
"id" : 1 ,
"product_id" : 5 ,
"quantity" : 2 ,
"price" : "29999.00"
}
]
}
}
401
Unauthenticated
{
"message" : "Unauthenticated."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
product_id
integer
Yes
exists:products,id
Product to add.
quantity
integer
Yes
min:1
Quantity to add.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/cart/items" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"product_id" : 1,
"quantity" : 1
}'
200 Success
422 Validation failed
200 OK
{
"message" : "Item added to cart." ,
"cart" : {
"id" : 1 ,
"items" : [ ]
}
}
422
Validation failed
{
"message" : "The selected product id is invalid."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
per_page
integer
Optional
—
Items per page.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/wishlists" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"wishlists" : [
{
"id" : 1 ,
"product_id" : 5 ,
"product" : {
"name" : "Earbuds" ,
"image" : "https://cdn.natakahii.com/products/5/earbuds.jpg"
}
}
] ,
"meta" : {
"total" : 3
}
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
product_id
integer
Yes
exists:products,id
Product to toggle.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/wishlists/toggle" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"product_id" : 1
}'
201 Success
201 OK
{
"message" : "Product added to wishlist." ,
"wishlisted" : true
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
product_id
integer
Yes
exists:products,id
Product to watch.
type
string
Yes
in:price_drop,back_in_stock
Alert type.
target_price
number
Optional
required_if:type,price_drop
Target price for price_drop alerts.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/alerts" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"product_id" : 1,
"type" : "value" ,
"target_price" : 100
}'
201 Success
201 OK
{
"message" : "Alert created." ,
"alert" : {
"id" : 1 ,
"type" : "price_drop" ,
"target_price" : "20000.00"
}
}
Checkout & Payments
Convert carts to orders, process payments, and handle shipping quotes.
POST
curl -X POST \
"https://up.openjournaltheme.com/api/v1/checkout" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
201 Success
422 Empty cart
201 OK
{
"message" : "Order placed successfully." ,
"order" : {
"id" : 1 ,
"order_number" : "NTK-20260208-ABC123" ,
"total_amount" : "59998.00" ,
"status" : "pending"
}
}
422
Empty cart
{
"message" : "Your cart is empty."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
order_id
integer
Yes
exists:orders,id
Order to pay for.
payment_method
string
Yes
in:mpesa,card,bank_transfer
Payment method.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/payments" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"order_id" : 1,
"payment_method" : "value"
}'
201 Success
422 Already paid
201 OK
{
"message" : "Payment initiated." ,
"payment" : {
"id" : 1 ,
"amount" : "59998.00" ,
"status" : "pending"
}
}
422
Already paid
{
"message" : "This order has already been paid."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
transaction_id
string
Yes
—
Provider transaction ID.
status
string
Yes
—
Payment status from provider.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/payments/webhook/{provider}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"transaction_id" : "value" ,
"status" : "value"
}'
200 Success
400 Invalid payload
200 OK
{
"message" : "Webhook processed."
}
400
Invalid payload
{
"message" : "Invalid webhook payload."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
destination_address
string
Yes
—
Delivery destination address.
weight_kg
number
Yes
min:0.1
Total weight in kilograms.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/shipping/quotes" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"destination_address" : "value" ,
"weight_kg" : 100
}'
200 Success
200 OK
{
"message" : "Shipping quotes generated." ,
"quotes" : [
{
"provider" : "NatakaHii Cargo" ,
"service_level" : "standard" ,
"price" : "5000.00" ,
"estimated_days" : 5
}
]
}
POST
curl -X POST \
"https://up.openjournaltheme.com/api/v1/shipping/quotes/{quote}/select" \
-H "Content-Type: application/json" \
-H "Accept: application/json"
200 Success
422 Quote expired
200 OK
{
"message" : "Shipping quote selected."
}
422
Quote expired
{
"message" : "This quote has expired. Please request new quotes."
}
Social Commerce
Social engagement features: likes, shares, follows, views, and not-interested markers.
POST
curl -X POST \
"https://up.openjournaltheme.com/api/v1/products/{product}/view" \
-H "Content-Type: application/json" \
-H "Accept: application/json"
200 Success
200 OK
{
"message" : "View recorded."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
platform
string
Optional
max:50
Share platform (e.g. whatsapp, facebook).
curl -X POST \
"https://up.openjournaltheme.com/api/v1/products/{product}/shares" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{
"platform" : "value"
}'
200 Success
200 OK
{
"message" : "Share recorded." ,
"shares_count" : 15
}
POST
curl -X POST \
"https://up.openjournaltheme.com/api/v1/products/{product}/likes" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"message" : "Product liked." ,
"likes_count" : 42
}
DELETE
curl -X DELETE \
"https://up.openjournaltheme.com/api/v1/products/{product}/likes" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"message" : "Product unliked." ,
"likes_count" : 41
}
POST
curl -X POST \
"https://up.openjournaltheme.com/api/v1/vendors/{vendor}/follow" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"message" : "Now following TechShop." ,
"followers_count" : 150
}
DELETE
curl -X DELETE \
"https://up.openjournaltheme.com/api/v1/vendors/{vendor}/follow" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"message" : "Unfollowed TechShop." ,
"followers_count" : 149
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/me/following/vendors" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"vendors" : [
{
"id" : 1 ,
"shop_name" : "TechShop"
}
] ,
"meta" : {
"total" : 5
}
}
POST
curl -X POST \
"https://up.openjournaltheme.com/api/v1/products/{product}/not-interested" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"message" : "Product marked as not interested."
}
Cargo & Shipping
Fulfillment centers, dropoff management, cargo shipments, delivery runs, and tracking.
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/cargo/fulfillment-centers" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"fulfillment_centers" : [
{
"id" : 1 ,
"name" : "Dar es Salaam Hub" ,
"city" : "Dar es Salaam"
}
]
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Optional
in:pending,received,qc_in_progress,qc_passed,qc_failed
Filter by dropoff status.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/cargo/dropoffs" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"dropoffs" : [
{
"id" : 1 ,
"status" : "pending" ,
"order_id" : 10 ,
"vendor" : {
"shop_name" : "TechShop"
}
}
] ,
"meta" : {
"total" : 25
}
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
fulfillment_center_id
integer
Yes
exists:fulfillment_centers,id
Receiving center.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/cargo/dropoffs/{dropoff}/receive" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"fulfillment_center_id" : 1
}'
200 Success
200 OK
{
"message" : "Dropoff received." ,
"dropoff" : {
"status" : "received"
}
}
PATCH
Request Body
application/json
Parameter
Type
Required
Rules
Description
items
array
Yes
—
Array of items with product_id and quantity.
curl -X PATCH \
"https://up.openjournaltheme.com/api/v1/cargo/dropoffs/{dropoff}/items" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"items" : []
}'
200 Success
422 Invalid items
200 OK
{
"message" : "Dropoff items updated." ,
"dropoff" : {
"id" : 1 ,
"items" : [ ]
}
}
422
Invalid items
{
"message" : "Invalid item data provided."
}
POST
curl -X POST \
"https://up.openjournaltheme.com/api/v1/cargo/dropoffs/{dropoff}/qc/start" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"message" : "QC started." ,
"dropoff" : {
"status" : "qc_in_progress"
}
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
passed
boolean
Yes
—
Whether QC passed.
notes
string
Optional
—
QC notes.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/cargo/dropoffs/{dropoff}/qc/complete" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"passed" : true,
"notes" : "value"
}'
200 Success
200 OK
{
"message" : "QC completed." ,
"dropoff" : {
"status" : "qc_passed"
}
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
order_id
integer
Yes
exists:orders,id
Order to ship.
destination_address
string
Yes
—
Delivery address.
recipient_name
string
Yes
max:255
Recipient name.
recipient_phone
string
Optional
max:20
Recipient phone.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/cargo/shipments" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"order_id" : 1,
"destination_address" : "value" ,
"recipient_name" : "John Doe" ,
"recipient_phone" : "+255700000000"
}'
201 Success
201 OK
{
"message" : "Shipment created." ,
"shipment" : {
"tracking_number" : "NTK-SHP-ABC123" ,
"status" : "pending"
}
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/shipments/{shipment}/tracking" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"shipment" : {
"tracking_number" : "NTK-SHP-ABC123" ,
"status" : "in_transit"
} ,
"tracking_events" : [
{
"event" : "shipped" ,
"location" : "Dar es Salaam"
}
]
}
POST
curl -X POST \
"https://up.openjournaltheme.com/api/v1/cargo/shipments/{shipment}/mark-delivered" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"message" : "Shipment marked as delivered."
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/cargo/my/delivery-runs" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"delivery_runs" : [
{
"id" : 1 ,
"status" : "dispatched" ,
"scheduled_date" : "2026-02-10"
}
]
}
Messaging & Disputes
User-to-user messaging and order dispute management.
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
receiver_id
integer
Yes
exists:users,id
User to message.
subject
string
Optional
max:255
Conversation subject.
message
string
Yes
—
First message content.
order_id
integer
Optional
exists:orders,id
Related order (optional).
curl -X POST \
"https://up.openjournaltheme.com/api/v1/messages/conversations" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"receiver_id" : 1,
"subject" : "value" ,
"message" : "value" ,
"order_id" : 1
}'
201 Success
201 OK
{
"message" : "Conversation started." ,
"conversation" : {
"id" : 1 ,
"subject" : "Order question"
}
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
order_id
integer
Yes
exists:orders,id
Order to dispute.
reason
string
Yes
max:255
Dispute reason.
description
string
Yes
—
Detailed description of the issue.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/disputes" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"order_id" : 1,
"reason" : "value" ,
"description" : "value"
}'
201 Success
422 Active dispute exists
201 OK
{
"message" : "Dispute filed." ,
"dispute" : {
"id" : 1 ,
"status" : "open" ,
"reason" : "Wrong item received"
}
}
422
Active dispute exists
{
"message" : "An active dispute already exists for this order."
}
Analytics & Notifications
Vendor analytics dashboard and user notifications.
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/analytics/vendor/overview" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
404 No vendor profile
200 OK
{
"analytics" : {
"total_products" : 25 ,
"active_products" : 20 ,
"total_orders" : 150 ,
"total_revenue" : 450000
}
}
404
No vendor profile
{
"message" : "No vendor profile found."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
per_page
integer
Optional
—
Items per page.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/notifications" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"notifications" : [ ] ,
"unread_count" : 3 ,
"meta" : {
"total" : 15
}
}
Admin
Administrative endpoints for platform management. Requires admin role.
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/dashboard" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
403 Forbidden
200 OK
{
"message" : "Dashboard statistics retrieved." ,
"data" : {
"total_users" : 150 ,
"active_users" : 142 ,
"total_vendors" : 25 ,
"total_products" : 340 ,
"total_orders" : 1200 ,
"total_revenue" : 58750
}
}
403
Forbidden
{
"message" : "Forbidden. Admin access required."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Optional
in:active,blocked
Filter by status.
role
string
Optional
—
Filter by role name.
search
string
Optional
—
Search by name or email.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/users" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"message" : "Users retrieved." ,
"data" : {
"data" : [
{
"id" : 1 ,
"name" : "John Doe" ,
"status" : "active"
}
] ,
"total" : 150
}
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/users/{user}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
404 User not found
200 OK
{
"user" : {
"id" : 1 ,
"name" : "John Doe" ,
"email" : "[email protected] " ,
"status" : "active" ,
"roles" : [
"customer",
"vendor"
]
}
}
404
User not found
{
"message" : "User not found."
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/roles" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"roles" : [
{
"id" : 1 ,
"name" : "customer"
} ,
{
"id" : 2 ,
"name" : "vendor"
} ,
{
"id" : 3 ,
"name" : "admin"
}
]
}
PATCH
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Yes
in:active,blocked
New status.
curl -X PATCH \
"https://up.openjournaltheme.com/api/v1/admin/users/{user}/status" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"status" : "value"
}'
200 Success
403 Cannot change own status
200 OK
{
"message" : "User status updated to blocked."
}
403
Cannot change own status
{
"message" : "You cannot change your own status."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
role
string
Yes
exists:roles,name
Role name.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/admin/users/{user}/assign-role" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"role" : "value"
}'
200 Success
200 OK
{
"message" : "Role 'vendor' assigned to John Doe."
}
DELETE
Request Body
application/json
Parameter
Type
Required
Rules
Description
role
string
Yes
exists:roles,name
Role name to revoke.
curl -X DELETE \
"https://up.openjournaltheme.com/api/v1/admin/users/{user}/revoke-role" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
403 Cannot revoke own admin role
200 OK
{
"message" : "Role 'vendor' revoked from John Doe."
}
403
Cannot revoke own admin role
{
"message" : "You cannot revoke your own admin role."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Optional
—
Filter by vendor status.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/vendors" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"vendors" : [
{
"id" : 1 ,
"shop_name" : "TechShop" ,
"logo" : "https://cdn.natakahii.com/vendors/logos/techshop.png" ,
"status" : "approved"
}
] ,
"meta" : {
"total" : 25
}
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Yes
in:approved,suspended
New vendor status.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/admin/vendors/{vendor}/verification/review" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"status" : "value"
}'
200 Success
200 OK
{
"message" : "Vendor approved."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Optional
in:pending,approved,rejected
Filter by application status.
search
string
Optional
—
Search by business name or applicant name.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/vendor-applications" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"applications" : [
{
"id" : 1 ,
"business_name" : "My Store" ,
"status" : "pending" ,
"user" : {
"name" : "John Doe"
}
}
] ,
"meta" : {
"total" : 10
}
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/vendor-applications/{application}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
404 Application not found
200 OK
{
"application" : {
"id" : 1 ,
"business_name" : "My Store" ,
"business_description" : "We sell electronics" ,
"status" : "pending" ,
"documents" : [ ]
}
}
404
Application not found
{
"message" : "Application not found."
}
PATCH
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Yes
in:approved,rejected
New status.
notes
string
Optional
—
Admin notes about the decision.
curl -X PATCH \
"https://up.openjournaltheme.com/api/v1/admin/vendor-applications/{application}/status" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"status" : "value" ,
"notes" : "value"
}'
200 Success
422 Invalid status transition
200 OK
{
"message" : "Application approved. Vendor account created." ,
"application" : {
"id" : 1 ,
"status" : "approved"
}
}
422
Invalid status transition
{
"message" : "Cannot change status of processed application."
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/categories" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"categories" : [
{
"id" : 1 ,
"name" : "Electronics" ,
"slug" : "electronics" ,
"is_active" : true ,
"sort_order" : 1 ,
"children" : [ ] ,
"products_count" : 45
}
]
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
name
string
Yes
max:255
Category name.
slug
string
Optional
max:255|unique:categories
URL-friendly slug (auto-generated if not provided).
parent_id
integer
Optional
exists:categories,id
Parent category ID for subcategories.
is_active
boolean
Optional
—
Active status. Default: true.
sort_order
integer
Optional
min:0
Display order. Auto-assigned if not provided.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/admin/categories" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"name" : "John Doe" ,
"slug" : "value" ,
"parent_id" : 1,
"is_active" : true,
"sort_order" : 1
}'
201 Success
422 Validation failed
201 OK
{
"message" : "Category created successfully" ,
"category" : {
"id" : 1 ,
"name" : "Electronics" ,
"slug" : "electronics" ,
"is_active" : true ,
"sort_order" : 1
}
}
422
Validation failed
{
"message" : "The name field is required." ,
"errors" : {
"name" : [
"The name field is required."
]
}
}
PATCH
Request Body
application/json
Parameter
Type
Required
Rules
Description
name
string
Optional
max:255
Updated category name.
slug
string
Optional
max:255|unique:categories
Updated slug.
parent_id
integer
Optional
exists:categories,id
Updated parent category.
is_active
boolean
Optional
—
Updated active status.
sort_order
integer
Optional
min:0
Updated sort order.
curl -X PATCH \
"https://up.openjournaltheme.com/api/v1/admin/categories/{category}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"name" : "John Doe" ,
"slug" : "value" ,
"parent_id" : 1,
"is_active" : true,
"sort_order" : 1
}'
200 Success
404 Category not found
200 OK
{
"message" : "Category updated successfully" ,
"category" : {
"id" : 1 ,
"name" : "Electronics & Gadgets" ,
"slug" : "electronics-gadgets"
}
}
404
Category not found
{
"message" : "Not found."
}
DELETE
curl -X DELETE \
"https://up.openjournaltheme.com/api/v1/admin/categories/{category}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
422 Cannot delete
404 Category not found
200 OK
{
"message" : "Category deleted successfully"
}
422
Cannot delete
{
"message" : "Cannot delete category with existing products"
}
404
Category not found
{
"message" : "Not found."
}
PATCH
curl -X PATCH \
"https://up.openjournaltheme.com/api/v1/admin/categories/{category}/toggle-status" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
404 Category not found
200 OK
{
"message" : "Category status updated successfully" ,
"category" : {
"id" : 1 ,
"is_active" : false
}
}
404
Category not found
{
"message" : "Not found."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Optional
—
Filter by product status.
vendor_id
integer
Optional
—
Filter by vendor.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/products" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"products" : [ ] ,
"meta" : {
"total" : 340
}
}
PATCH
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Yes
in:active,draft,out_of_stock
New product status.
curl -X PATCH \
"https://up.openjournaltheme.com/api/v1/admin/products/{product}/moderation" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"status" : "value"
}'
200 Success
200 OK
{
"message" : "Product status changed to active."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Optional
—
Filter by order status.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/orders" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"orders" : [ ] ,
"meta" : {
"total" : 1200
}
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Optional
—
Filter by payment status.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/payments" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"payments" : [ ] ,
"meta" : {
"total" : 980
}
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/escrow/orders/{order}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
404 Order not found
200 OK
{
"order" : {
"id" : 1 ,
"order_number" : "NTK-20260208-ABC123"
} ,
"escrow" : {
"amount" : "59998.00" ,
"status" : "held" ,
"held_since" : "2026-02-08T10: 00 : 00 Z"
}
}
404
Order not found
{
"message" : "Order not found."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Optional
—
Filter by shipment status.
tracking_number
string
Optional
—
Search by tracking number.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/shipments" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"shipments" : [
{
"id" : 1 ,
"tracking_number" : "NTK-SHP-ABC123" ,
"status" : "in_transit"
}
] ,
"meta" : {
"total" : 50
}
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/cargo/shipments/{shipment}/inspections" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
404 Shipment not found
200 OK
{
"inspections" : [
{
"id" : 1 ,
"status" : "passed" ,
"inspected_at" : "2026-02-08T12: 00 : 00 Z" ,
"notes" : "All items verified"
}
]
}
404
Shipment not found
{
"message" : "Shipment not found."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
order_id
integer
Yes
exists:orders,id
Order to refund.
amount
number
Yes
min:0.01
Refund amount.
reason
string
Yes
—
Refund reason.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/admin/refunds" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"order_id" : 1,
"amount" : 100,
"reason" : "value"
}'
201 Success
201 OK
{
"message" : "Refund processed."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Yes
in:resolved,rejected
Resolution status.
resolution
string
Yes
—
Resolution description.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/admin/disputes/{dispute}/resolve" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"status" : "value" ,
"resolution" : "value"
}'
200 Success
200 OK
{
"message" : "Dispute resolved."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
delivery_agent_id
integer
Yes
exists:users,id
Assigned delivery agent.
scheduled_date
string
Yes
date
Scheduled delivery date (Y-m-d).
vehicle_info
string
Optional
max:255
Vehicle information.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/admin/delivery-runs" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"delivery_agent_id" : 1,
"scheduled_date" : "value" ,
"vehicle_info" : "value"
}'
201 Success
201 OK
{
"message" : "Delivery run created." ,
"delivery_run" : {
"id" : 1 ,
"status" : "scheduled"
}
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
shipment_ids
array
Yes
—
Array of shipment IDs to assign.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/admin/delivery-runs/{run}/shipments" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"shipment_ids" : []
}'
200 Success
422 Invalid shipments
200 OK
{
"message" : "Shipments assigned to delivery run." ,
"assigned_count" : 3
}
422
Invalid shipments
{
"message" : "Some shipments are not available for assignment."
}
POST
curl -X POST \
"https://up.openjournaltheme.com/api/v1/admin/delivery-runs/{run}/dispatch" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
422 Already dispatched
200 OK
{
"message" : "Delivery run dispatched." ,
"delivery_run" : {
"id" : 1 ,
"status" : "dispatched"
}
}
422
Already dispatched
{
"message" : "Delivery run is already dispatched."
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Optional
in:open,pending,resolved,closed
Filter by ticket status.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/support/tickets" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"tickets" : [
{
"id" : 1 ,
"subject" : "Order Issue" ,
"status" : "open"
}
] ,
"meta" : {
"total" : 25
}
}
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/analytics/overview" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"analytics" : {
"users" : 150 ,
"vendors" : 20 ,
"products" : 340 ,
"orders_total" : 1200 ,
"revenue_total" : 58750
}
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
status
string
Optional
in:open,resolved,rejected
Filter by dispute status.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/disputes" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"disputes" : [
{
"id" : 1 ,
"status" : "open" ,
"reason" : "Wrong item"
}
] ,
"meta" : {
"total" : 10
}
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
action
string
Yes
in:warn,suspend,remove,ignore
Action to take on the report.
notes
string
Optional
—
Admin notes about the action.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/admin/reports/{report}/action" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"action" : "value" ,
"notes" : "value"
}'
200 Success
404 Report not found
200 OK
{
"message" : "Report action taken." ,
"action" : "warn"
}
404
Report not found
{
"message" : "Report not found."
}
Super Admin
Super admin only endpoints. Manage admin accounts, settings, fees, plans, and audit logs.
GET
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/super/admins" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
403 Super admin required
403
Super admin required
{
"message" : "Forbidden. Super admin access required."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
name
string
Yes
max:255
Admin name.
email
string
Yes
email|unique:users
Admin email.
password
string
Yes
min:8
Admin password.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/admin/super/admins" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"name" : "John Doe" ,
"email" : "[email protected] " ,
"password" : "SecurePass123"
}'
201 Success
201 OK
{
"message" : "Admin account created." ,
"admin" : {
"id" : 2 ,
"name" : "New Admin"
}
}
PATCH
Request Body
application/json
Parameter
Type
Required
Rules
Description
name
string
Optional
max:255
Updated admin name.
email
string
Optional
email|unique:users
Updated admin email.
password
string
Optional
min:8
New password (if changing).
curl -X PATCH \
"https://up.openjournaltheme.com/api/v1/admin/super/admins/{user}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"name" : "John Doe" ,
"email" : "[email protected] " ,
"password" : "SecurePass123"
}'
200 Success
404 Admin not found
200 OK
{
"message" : "Admin account updated." ,
"admin" : {
"id" : 2 ,
"name" : "Updated Name"
}
}
404
Admin not found
{
"message" : "Admin not found."
}
DELETE
curl -X DELETE \
"https://up.openjournaltheme.com/api/v1/admin/super/admins/{user}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
403 Cannot delete self
200 OK
{
"message" : "Admin account deleted."
}
403
Cannot delete self
{
"message" : "Cannot delete your own account."
}
PUT
Request Body
application/json
Parameter
Type
Required
Rules
Description
settings
array
Yes
—
Array of {key, value, group} objects.
curl -X PUT \
"https://up.openjournaltheme.com/api/v1/admin/super/settings" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"settings" : []
}'
200 Success
200 OK
{
"message" : "Settings updated."
}
POST
Request Body
application/json
Parameter
Type
Required
Rules
Description
name
string
Yes
max:255
Plan name.
price
number
Yes
min:0
Plan price.
billing_cycle
string
Yes
in:monthly,yearly
Billing cycle.
features
array
Optional
—
Array of feature strings.
curl -X POST \
"https://up.openjournaltheme.com/api/v1/admin/super/subscription-plans" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN" \
-d '{
"name" : "John Doe" ,
"price" : 100,
"billing_cycle" : "value" ,
"features" : []
}'
201 Success
201 OK
{
"message" : "Subscription plan created." ,
"plan" : {
"name" : "Premium" ,
"price" : "50000.00"
}
}
GET
Request Body
application/json
Parameter
Type
Required
Rules
Description
action
string
Optional
—
Filter by action type.
user_id
integer
Optional
—
Filter by user.
curl -X GET \
"https://up.openjournaltheme.com/api/v1/admin/super/audit-logs" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-H "Authorization: Bearer YOUR_TOKEN"
200 Success
200 OK
{
"audit_logs" : [
{
"id" : 1 ,
"action" : "user.blocked" ,
"user" : {
"name" : "Admin"
}
}
] ,
"meta" : {
"total" : 500
}
}