v2 · OnePort BPaaS API

Introduction

The OnePort BPaaS (Booking Platform as a Service) API lets partner platforms onboard their customers to OnePort 365 and raise, price and track freight requests on their behalf.

OnePort 365 is a digital freight forwarding platform connecting shippers, exporters and importers to carriers, freight agents and logistics providers across Africa and global trade lanes. BPaaS is a thin layer over the OnePort 365 API: every request is passed to OnePort, and OnePort's answer comes back unchanged. BPaaS stores no customer data of its own.

With v2 your platform can:

  • Onboard customers and their companies in one call, with no email verification step.
  • Raise RFQs for ocean freight (FCL and LCL), air freight, haulage and customs brokerage.
  • Search and select ocean freight rates before sending an RFQ to OnePort.
  • Follow booked shipments and file documents against them.
  • Look up reference data: airports and HS-code commodities.

Base URL

Prefix every endpoint path in these docs with the base URL for your environment.

EnvironmentBase URL
Test / Staginghttps://test-bpass-api.oneport365.com/api/v1
Productionhttps://bpass-api.oneport365.com/api/v1
NoteUse the test environment while you build. It behaves like production but runs on separate data, so test RFQs never reach OnePort's live operations.

Authentication

v2 uses two credentials. Which one a request needs is shown next to each endpoint.

CredentialHeaderUsed on
x-api-key
Your partner key
x-api-key: op365_… Register, Login, Refresh token and the three Password recovery calls. You make these as the partner, on your customer's behalf.
Bearer token
The customer's session
Authorization: Bearer <accessToken> Everything else. Each request acts as the signed-in customer and only sees their company's data.

Your partner key is issued by OnePort. BPaaS does not store it: it passes the key to OnePort, which checks it. Calls that need the key answer 401 without it.

Customer sessions

Login returns an accessToken (valid 24 hours) and a refreshToken (valid 7 days, single use). When the access token expires, call Refresh token for a new pair.

SecurityCall the API from your backend only. Never expose your partner key or a customer's tokens in browser or mobile code.

Getting Started

1.  Register customer     (x-api-key; password emailed to the customer)
        ↓
2.  Login                 (x-api-key → accessToken, refreshToken)
        ↓
3.  Upload RFQ documents  (optional: packing list, proforma invoice)
        ↓
4.  Create RFQ            (status: incomplete)
        ↓
5.  Search rates → Select rate   (ocean freight only)
        ↓
6.  Confirm RFQ           (status: new rfq; sent to OnePort Sales)
        ↓
7.  OnePort books it      → appears under Shipments
        ↓
8.  Upload shipment documents

Use Reference data at any point to look up airport codes and HS-code commodities for the RFQ.

Requests & Responses

Request bodies are JSON (Content-Type: application/json) with snake_case fields. The only exception is refreshToken, a BPaaS field. Document uploads use multipart/form-data. OnePort validates every body and its status codes and messages are returned unchanged.

Envelope
{
  "success": true,
  "message": "Optional human-readable message",
  "data": { … }
}
{
  "success": false,
  "message": "What went wrong"
}

Calls that only change state (logout, password changes, deactivation) answer 204 with no body.

Pagination

List endpoints take page (from 1) and limit, and return the rows in data.data with paging details alongside:

{
  "data": [ … ],
  "total": 42,
  "page": 1,
  "limit": 10,
  "total_pages": 5,
  "has_prev_page": false,
  "has_next_page": true,
  "prev_page": 0,
  "next_page": 2
}

Errors & Rate Limits

StatusMeaning
400Validation failed. message names the field or rule.
401Missing or invalid partner key on an auth call, or a missing, invalid or expired Bearer token.
403The customer's account is suspended or deactivated, or their company was deleted. On auth calls: your partner account is suspended or the call came from an IP outside your allowlist.
404The record doesn't exist or belongs to another company.
429Rate limited. See below.

OnePort limits each customer email address to:

  • 10 failed sign-ins per 15 minutes
  • 5 emailed codes per hour (signup and password recovery)

BPaaS also limits requests per client IP. Past any of these limits the API answers 429.

Health Check

GET/healthPublic

Served at the server root, outside /api/v1: https://test-bpass-api.oneport365.com/health.

Response
{
  "status": "OK",
  "message": "Server is running"
}

Migrating from v1

v1 is deprecated and will be retired soon. Its docs are still available from the version switch at the top of the page. The main changes:

Areav1v2
Base path/api/api/v1
SignupRegister, then verify an emailed OTPRegister with your partner key; no OTP. The password is emailed to the customer.
SessionsOne Bearer token; log in again when it expiresAccess token (24 h) plus single-use refresh token (7 days)
Password resetEmail + OTP + new password in one callRequest code → verify code → reset with reset_token
Rates & bookingsLive Rates (search_id) and BookingsRFQs: create, search rates, select, confirm
ShipmentsCreated by the clientRead-only list and detail; created when OnePort books an RFQ
Documentsshipment_file, document_name, document_typefile, document_category, document_type keys from Document categories
Reference data/daas/commodity-types/reference/commodities, /reference/airports
v2 · Auth

Auth

Create a customer, sign them in and keep their session alive. These calls are made by you, the partner, on the customer's behalf, so they carry your partner key.

Register customer

POST/users/auth/registerx-api-key

Creates the customer and their company on OnePort in one step, recorded against your partner account. No email verification code is needed: as a partner you vouch for the customer's email address.

Returns 201. OnePort emails the customer a password; it is never returned in the response. Sign them in next with Login.

Body

FieldTypeDescription
firstnamestringrequired
lastnamestringrequired
emailstringrequiredThe customer's email. Must be an inbox they can read: their password is sent here.
phonestringrequiredInternational format, e.g. +2348012345678
titlestringrequiredJob title
company.namestringrequiredMust not match an existing company name exactly
company.emailstringrequired
company.industrystringrequired
company.addressstringoptional
Request
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/users/auth/register' \
  --header 'x-api-key: $PARTNER_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "firstname": "Grace",
    "lastname": "Okafor",
    "email": "[email protected]",
    "phone": "+2348012345678",
    "title": "Procurement Manager",
    "company": {
      "name": "ABC Ltd",
      "email": "[email protected]",
      "industry": "Logistics",
      "address": "12 Marina, Lagos"
    }
  }'
{
  "firstname": "Grace",
  "lastname": "Okafor",
  "email": "[email protected]",
  "phone": "+2348012345678",
  "title": "Procurement Manager",
  "company": {
    "name": "ABC Ltd",
    "email": "[email protected]",
    "industry": "Logistics",
    "address": "12 Marina, Lagos"
  }
}
Response
{
  "success": true,
  "message": "Account created. The customer's password has been sent to their email.",
  "data": {
    "user": {
      "id": "6ad04a57c1abf3e526d845d7",
      "created_at": "2026-10-15T03:36:55.825Z",
      "updated_at": "2026-10-15T03:36:55.825Z",
      "firstname": "grace",
      "lastname": "okafor",
      "email": "[email protected]",
      "phone": "+2348012345678",
      "status": "active",
      "role": "admin",
      "company_id": "6ad04a57c1abf3e526d845d5",
      "title": "procurement manager",
      "is_first_login": 0,
      "partner_id": "6ad04994b5accb5031a052c6"
    },
    "company": {
      "id": "6ad04a57c1abf3e526d845d5",
      "name": "bpaas docs test co mv8zm7rw"
    }
  }
}
{
  "success": false,
  "message": "An account with this email already exists. Log in, reset your password, or contact support."
}
{
  "success": false,
  "message": "The title field is required."
}
{
  "success": false,
  "message": "Partner API key required. Send it in the x-api-key header."
}
{
  "success": false,
  "message": "Invalid API key"
}

Errors

StatusWhen
400A field is invalid or missing, the email is already registered, or a company with exactly this name exists.
401x-api-key is missing, unknown, revoked or expired.
403Your partner account is suspended, or the call came from an IP outside your allowlist.

Login

POST/users/auth/loginx-api-key

Signs the customer in and returns their user, company and tokens. Send tokens.accessToken as a Bearer token on every customer request; keep tokens.refreshToken to renew the session.

First sign-inuser.is_first_login is 0 on the customer's first sign-in. Prompt them to replace the emailed password with Change password.

Body

FieldTypeDescription
emailstringrequired
passwordstringrequiredThe emailed password, or the one the customer has since set
Request
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/users/auth/login' \
  --header 'x-api-key: $PARTNER_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "email": "[email protected]",
    "password": "PASTE_PASSWORD_FROM_EMAIL"
  }'
{
  "email": "[email protected]",
  "password": "PASTE_PASSWORD_FROM_EMAIL"
}
Response
{
  "success": true,
  "message": "Login successful",
  "data": {
    "user": {
      "id": "6ad04a57c1abf3e526d845d7",
      "created_at": "2026-10-15T03:36:55.825Z",
      "updated_at": "2026-10-15T03:36:55.825Z",
      "firstname": "grace",
      "lastname": "okafor",
      "email": "[email protected]",
      "phone": "+2348012345678",
      "status": "active",
      "role": "admin",
      "company_id": "6ad04a57c1abf3e526d845d5",
      "title": "procurement manager",
      "is_first_login": 0,
      "partner_id": "6ad04994b5accb5031a052c6"
    },
    "company": {
      "id": "6ad04a57c1abf3e526d845d5",
      "name": "bpaas docs test co mv8zm7rw",
      "email": "[email protected]",
      "industry": "logistics",
      "address": "12 Marina, Lagos"
    },
    "tokens": {
      "accessToken": "<accessToken>",
      "refreshToken": "<refreshToken>",
      "expiresIn": 86400
    }
  }
}
{
  "success": false,
  "message": "Invalid email or password"
}
{
  "success": false,
  "message": "Too many failed sign-in attempts. Try again in 15 minutes."
}
{
  "success": false,
  "message": "Invalid API key"
}

Errors

StatusWhen
400Wrong email or password.
401x-api-key is missing or invalid.
403The account is suspended or deactivated, or the company was deleted.
42910 failed sign-ins for this email within 15 minutes.

Refresh token

POST/users/auth/refreshx-api-key

Exchanges a refresh token (valid 7 days) for a new access and refresh token pair. Each refresh token works once: store the new one from the response and discard the old one.

Body

FieldTypeDescription
refreshTokenstringrequiredFrom Login or a previous refresh
Request
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/users/auth/refresh' \
  --header 'x-api-key: $PARTNER_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "refreshToken": "<refreshToken>"
  }'
{
  "refreshToken": "<refreshToken>"
}
Response
{
  "success": true,
  "message": "Token refreshed successfully",
  "data": {
    "tokens": {
      "accessToken": "<accessToken>",
      "refreshToken": "<refreshToken>",
      "expiresIn": 86400
    }
  }
}
{
  "success": false,
  "message": "Invalid or expired refresh token"
}
{
  "success": false,
  "message": "Invalid or expired refresh token"
}

Errors

StatusWhen
401The refresh token was already used, has expired, or is not a refresh token.

Logout

POST/users/auth/logoutBearer token

Revokes the refresh token and returns 204. The access token stays valid until it expires (24 hours), so discard it on your side as well.

Body

FieldTypeDescription
refreshTokenstringoptionalThe refresh token to revoke
Request
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/users/auth/logout' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
    "refreshToken": "<refreshToken>"
  }'
{
  "refreshToken": "<refreshToken>"
}
Response
(no content)
v2 · Password recovery

Password recovery

A three-step flow: request a code, verify it, then set the new password. Every step carries your partner key.

1. Forgot password   → challenge_token   (code emailed, valid 10 min)
2. Verify code       → reset_token       (valid 15 min)
3. Reset password    → 204

Forgot password

POST/users/auth/forgot-passwordx-api-key

Starts recovery and returns a challenge_token. The response is the same whether or not the email has an account; a 6-digit code is emailed only to an active account.

This is also how a contact that OnePort created in its back office, who has never had a password, sets their first one.

Body

FieldTypeDescription
emailstringrequired
Request
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/users/auth/forgot-password' \
  --header 'x-api-key: $PARTNER_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "email": "[email protected]"
  }'
{
  "email": "[email protected]"
}
Response
{
  "success": true,
  "message": "If an account exists for this email, a verification code has been sent",
  "data": {
    "challenge_token": "<challenge_token>"
  }
}

Errors

StatusWhen
429More than 5 emailed codes (signup and recovery) for this email within an hour.

Verify code

POST/users/auth/forgot-password/verifyx-api-key

Checks the 6-digit code from the email (valid 10 minutes, 5 attempts) and returns a reset_token valid for 15 minutes.

Body

FieldTypeDescription
challenge_tokenstringrequiredFrom Forgot password
codestringrequiredThe 6-digit code from the email
Request
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/users/auth/forgot-password/verify' \
  --header 'x-api-key: $PARTNER_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "challenge_token": "<challenge_token>",
    "code": "PASTE_CODE_FROM_EMAIL"
  }'
{
  "challenge_token": "<challenge_token>",
  "code": "PASTE_CODE_FROM_EMAIL"
}
Response
{
  "success": true,
  "data": {
    "reset_token": "<reset_token>"
  }
}
{
  "success": false,
  "message": "Invalid verification code"
}

Errors

StatusWhen
400Wrong or expired code, or too many attempts.

Reset password

POST/users/auth/reset-passwordx-api-key

Sets the new password and returns 204. The reset token works once. A successful reset also clears a failed sign-in lockout.

Body

FieldTypeDescription
reset_tokenstringrequiredFrom Verify code
passwordstringrequiredAt least 8 characters
Request
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/users/auth/reset-password' \
  --header 'x-api-key: $PARTNER_API_KEY' \
  --header 'Content-Type: application/json' \
  --data '{
    "reset_token": "<reset_token>",
    "password": "NewPass#2026"
  }'
{
  "reset_token": "<reset_token>",
  "password": "NewPass#2026"
}
Response
(no content)
v2 · Profile

Profile

The signed-in customer's own account. All requests use the customer's Bearer token.

Get profile

GET/users/auth/meBearer token

Returns { user, company } for the signed-in customer.

Request
curl --request GET 'https://test-bpass-api.oneport365.com/api/v1/users/auth/me' \
  --header 'Authorization: Bearer $ACCESS_TOKEN'
Response
{
  "success": true,
  "data": {
    "user": {
      "id": "6ad04a57c1abf3e526d845d7",
      "created_at": "2026-10-15T03:36:55.825Z",
      "updated_at": "2026-10-15T03:36:58.029Z",
      "firstname": "grace",
      "lastname": "okafor",
      "email": "[email protected]",
      "phone": "+2348012345678",
      "status": "active",
      "role": "admin",
      "company_id": "6ad04a57c1abf3e526d845d5",
      "title": "procurement manager",
      "is_first_login": 1,
      "last_login_date": "2026-10-15T03:36:58.029Z",
      "partner_id": "6ad04994b5accb5031a052c6"
    },
    "company": {
      "id": "6ad04a57c1abf3e526d845d5",
      "name": "bpaas docs test co mv8zm7rw",
      "email": "[email protected]",
      "industry": "logistics",
      "address": "12 Marina, Lagos"
    }
  }
}
{
  "success": false,
  "message": "Access denied. No token provided."
}
{
  "success": false,
  "message": "Invalid token."
}
{
  "success": false,
  "message": "Your account has been deactivated. Please contact support."
}

Errors

StatusWhen
401No token, or the token is invalid or expired.
403The account is suspended or deactivated, or the company was deleted.

Update profile

PUT/users/auth/meBearer token

Send only the fields to change. Other fields are ignored. Returns the updated user.

Body

FieldTypeDescription
firstnamestringoptional
lastnamestringoptional
phonestringoptional
titlestringoptional
Request
curl --request PUT 'https://test-bpass-api.oneport365.com/api/v1/users/auth/me' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
    "title": "Head of Procurement",
    "phone": "+2348098765432"
  }'
{
  "title": "Head of Procurement",
  "phone": "+2348098765432"
}
Response
{
  "success": true,
  "data": {
    "id": "6ad04a57c1abf3e526d845d7",
    "created_at": "2026-10-15T03:36:55.825Z",
    "updated_at": "2026-10-15T03:36:58.931Z",
    "firstname": "grace",
    "lastname": "okafor",
    "email": "[email protected]",
    "phone": "+2348098765432",
    "status": "active",
    "role": "admin",
    "company_id": "6ad04a57c1abf3e526d845d5",
    "title": "head of procurement",
    "is_first_login": 1,
    "last_login_date": "2026-10-15T03:36:58.029Z",
    "partner_id": "6ad04994b5accb5031a052c6"
  }
}

Change password

POST/users/auth/change-passwordBearer token

Returns 204. new_password must be at least 8 characters and differ from the current one.

Body

FieldTypeDescription
current_passwordstringrequired
new_passwordstringrequiredAt least 8 characters
Request
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/users/auth/change-password' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
    "current_password": "PASTE_CURRENT_PASSWORD",
    "new_password": "MyOwnPass#2026"
  }'
{
  "current_password": "PASTE_CURRENT_PASSWORD",
  "new_password": "MyOwnPass#2026"
}
Response
(no content)
{
  "success": false,
  "message": "Current password is incorrect"
}

Deactivate account

POST/users/auth/deactivateBearer token

Closes the customer's own account and returns 204. Later requests with this session get 403.

Irreversible from the APIOnly OnePort can reactivate a deactivated account.

Body

FieldTypeDescription
passwordstringrequiredThe customer's current password
Request
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/users/auth/deactivate' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
    "password": "PASTE_CURRENT_PASSWORD"
  }'
{
  "password": "PASTE_CURRENT_PASSWORD"
}
Response
(no content)
{
  "success": false,
  "message": "Password is incorrect"
}
v2 · RFQs

RFQs

Requests for quote, scoped to the signed-in customer's company. An RFQ is how a customer asks OnePort to move cargo; once OnePort books it, it becomes a shipment.

1. Upload documents  (optional: packing list, proforma invoice)
        ↓
2. Create RFQ        → status: incomplete
        ↓
3. Search rates      (ocean freight only)
        ↓
4. Select rate       (ocean freight only)
        ↓
5. Confirm RFQ       → status: new rfq, sent to OnePort Sales

Ocean freight RFQs need a selected rate before they can be confirmed. Air freight, haulage and customs brokerage RFQs can be confirmed straight after creation; OnePort Sales prices them.

Upload RFQ document

POST/rfqs/documentsBearer token

Uploads a packing list or proforma invoice before you create the RFQ. Send the returned location as packing_list or proforma_invoice in the Create RFQ body. Documents cannot be added to an RFQ after it is created, and only your company's own uploads are accepted.

Form-data fields

FieldTypeDescription
filefilerequiredPDF or image
document_categorystringrequiredpacking_list, proforma_invoice
Request
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/rfqs/documents' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --form 'file=@"./packing-list.pdf"' \
  --form 'document_category=packing_list'
Response
{
  "success": true,
  "data": {
    "location": "https://one-port-365-assets-dev-env.s3.eu-west-2.amazonaws.com/uploads/customer/6ad04a57c1abf3e526d845d5/packing_list/1792035420981-955cc36c5fac8af8.pdf",
    "original_file_name": "packing-list.pdf"
  }
}
{
  "success": false,
  "message": "Send the document as multipart/form-data in a 'file' field"
}

Create RFQ

POST/rfqsBearer token

Creates an RFQ for the customer's company. It starts as incomplete. The fields you send depend on the service: shipment_transport_type plus its load type (ocean_freight_type, cb_type) or direction (shipment_type for haulage).

Unknown fields are rejectedA field that does not apply to the chosen service returns 400 instead of being ignored. Never send company_id or user_id: they come from the session.

Common fields

FieldTypeDescription
shipment_transport_typestringrequiredocean_freight, air_freight, haulage, customs_brokerage
shipment_typestringrequiredimport, export
ocean_freight_typestringOcean freight only, required: fcl, lcl
cb_typestringCustoms brokerage only, required: fcl, lcl
air_freight_typestringAir freight only, required: port_to_port, port_to_door, door_to_port, door_to_door
containersarrayrequiredCargo lines, at least one. See Cargo lines.
packing_liststring (URL)optionallocation from Upload RFQ document
proforma_invoicestring (URL)optionallocation from Upload RFQ document
additional_commentsstringoptionalNotes for OnePort Sales

Fields by service

● required   ○ optional   ◐ required depending on haulage_type   – not accepted

FieldOcean FCLOcean LCLAirHaulage importHaulage exportCustoms FCLCustoms LCL
origin_port
Port name, e.g. Barcelona (ESBCN) Spain
●●○○●●●
origin_port_code
UN/LOCODE; IATA code for air
●●●○●●●
destination_port●●○●○●●
destination_port_code●●●●○●●
incoterms
EXW, FOB, CIF, CFR, FAS, DAP, DDP, DPU, CPT, CIP, FCA
●–●●●––
goods_value
string
●●–●●●●
goods_value_currency
USD, EUR, GBP, NGN, CNY, AED, INR, ZAR …
●●–●●●●
goods_weight
number, total weight
––●––––
cargo_ready_date
date
––○○○––
shipment_target_date
date
––●●●––
bl_number
string
○○–○○○○
with_haulage
boolean, add haulage
○○○––––
haulage_type
With with_haulage: origin, destination, both
◐◐◐○○––
pickup_location
Origin address
◐◐◐○○––
destination_address
Delivery address
◐◐◐●–––
customs_brokerage
boolean, add customs clearance
○○○○○––
origin_address
Inland pickup address
––––●––
stuffing_location
string
–––○●––
stuffing_date
date
–––○○––
tdo_written_date
Terminal Delivery Order date
–––●–––
tdo_expiry_date
date
–––●–––
with_tracker
boolean
–––○○––
with_escort
boolean
–––○○––
brokerage_type
fast_track, physical_examination, bond, scan
–––––●○
senders_name
string
–––––●●
senders_address
string
–––––●●
transport_mode
ocean, air
–––––○○
port_eta
date
–––––○○

With with_haulage: true, haulage_type is required, and so is the address for each side it covers: pickup_location for origin, destination_address for destination, both for both. Air freight also needs pickup_location for door_to_* and destination_address for *_to_door.

Cargo lines

Each entry in containers is one cargo line. A request can mix lines with different sizes or commodities. Pick commodity_chapter, commodity_category, commodity_description and commodity_hs_code from Commodities.

FieldFCL lines
Ocean FCL, haulage, customs FCL
LCL lines
Ocean LCL, customs LCL
Air lines
commodity_type
Cargo class: FAK, DG
●●●
commodity_description
What the cargo is
●●●
commodity_chapter○○○
commodity_category
From Commodities
○○○
commodity_hs_code
From Commodities
○○○
container_count
string; boxes, packages or pallets
●○●
container_size
20FT, 40FT, 40HC …
●––
container_type
FCL: dry, reefer; LCL: package type, e.g. pallet
●○–
container_weight
string
●●–
weight_unit
kg, pounds, tons
●●–
container_length
string
–●●
container_width
string
–●●
container_height
string
–●●
dimension_unit
cm, mm, in
–●●
volumetric_weight
string
–○○

Examples by service

Request
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/rfqs' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Content-Type: application/json' \
  --data @rfq.json  # one of the bodies in the other tabs
{
  "shipment_transport_type": "ocean_freight",
  "ocean_freight_type": "fcl",
  "shipment_type": "import",
  "origin_port_code": "ESBCN",
  "origin_port": "Barcelona (ESBCN) Spain",
  "destination_port_code": "NGAPP",
  "destination_port": "Apapa (NGAPP) Nigeria",
  "incoterms": "FOB",
  "goods_value": "45000",
  "goods_value_currency": "USD",
  "with_haulage": true,
  "haulage_type": "destination",
  "destination_address": "12 Ikorodu Road, Lagos",
  "customs_brokerage": true,
  "additional_comments": "Please include destination clearance.",
  "packing_list": "https://…/packing_list/1792035420981-955cc36c5fac8af8.pdf",
  "proforma_invoice": "https://…/proforma_invoice/1792035421910-6da129b940fbed7f.pdf",
  "containers": [
    {
      "commodity_type": "FAK",
      "container_size": "20FT",
      "container_type": "dry",
      "container_count": "1",
      "container_weight": "23000",
      "weight_unit": "kg",
      "commodity_chapter": "Agro Commodities",
      "commodity_category": "Livestock & Animals",
      "commodity_description": "Live Purebred breeding cattle",
      "commodity_hs_code": "102210000"
    },
    {
      "commodity_type": "FAK",
      "container_size": "40HC",
      "container_type": "dry",
      "container_count": "2",
      "container_weight": "18000",
      "weight_unit": "kg",
      "commodity_description": "Assorted kitchen utensils"
    }
  ]
}
{
  "shipment_type": "import",
  "shipment_transport_type": "ocean_freight",
  "ocean_freight_type": "lcl",
  "origin_port": "Shanghai (CNSHA) China",
  "origin_port_code": "CNSHA",
  "destination_port": "Apapa (NGAPP) Nigeria",
  "destination_port_code": "NGAPP",
  "goods_value": "8000",
  "goods_value_currency": "USD",
  "containers": [
    {
      "container_type": "pallet",
      "container_count": "4",
      "container_length": "120",
      "container_width": "100",
      "container_height": "150",
      "container_weight": "800",
      "weight_unit": "kg",
      "dimension_unit": "cm",
      "commodity_type": "FAK",
      "commodity_description": "Machine spare parts"
    }
  ]
}
{
  "shipment_type": "import",
  "shipment_transport_type": "air_freight",
  "air_freight_type": "port_to_port",
  "origin_port_code": "LHR",
  "destination_port_code": "LOS",
  "incoterms": "EXW",
  "cargo_ready_date": "2026-11-05",
  "shipment_target_date": "2026-11-20",
  "goods_weight": "350",
  "containers": [
    {
      "container_count": "3",
      "container_length": "80",
      "container_width": "60",
      "container_height": "50",
      "dimension_unit": "cm",
      "commodity_type": "FAK",
      "commodity_description": "Laptop computers"
    }
  ]
}
{
  "shipment_type": "import",
  "shipment_transport_type": "haulage",
  "destination_port": "Apapa (NGAPP) Nigeria",
  "destination_port_code": "NGAPP",
  "destination_address": "22 Kudirat Abiola Way, Ikeja, Lagos",
  "stuffing_location": "Apapa terminal",
  "tdo_written_date": "2026-11-02",
  "tdo_expiry_date": "2026-11-16",
  "shipment_target_date": "2026-11-10",
  "incoterms": "CIF",
  "goods_value": "30000",
  "goods_value_currency": "USD",
  "with_tracker": true,
  "with_escort": false,
  "containers": [
    {
      "commodity_type": "FAK",
      "container_size": "40FT",
      "container_type": "dry",
      "container_count": "1",
      "container_weight": "20000",
      "weight_unit": "kg",
      "commodity_description": "Building materials"
    }
  ]
}
{
  "shipment_type": "export",
  "shipment_transport_type": "haulage",
  "origin_address": "Km 38 Lagos-Ibadan Expressway, Ogun",
  "origin_port": "Apapa (NGAPP) Nigeria",
  "origin_port_code": "NGAPP",
  "stuffing_location": "Factory warehouse, Ogun",
  "stuffing_date": "2026-11-04",
  "shipment_target_date": "2026-11-08",
  "incoterms": "FOB",
  "goods_value": "55000",
  "goods_value_currency": "USD",
  "containers": [
    {
      "commodity_type": "FAK",
      "container_size": "20FT",
      "container_type": "dry",
      "container_count": "1",
      "container_weight": "18000",
      "weight_unit": "kg",
      "commodity_description": "Sesame seeds"
    }
  ]
}
{
  "shipment_type": "import",
  "shipment_transport_type": "customs_brokerage",
  "cb_type": "fcl",
  "origin_port": "Antwerp (BEANR) Belgium",
  "origin_port_code": "BEANR",
  "destination_port": "Tin Can Island (NGTIN) Nigeria",
  "destination_port_code": "NGTIN",
  "brokerage_type": "fast_track",
  "senders_name": "Euro Parts BV",
  "senders_address": "Haven 1100, 2030 Antwerp, Belgium",
  "transport_mode": "ocean",
  "port_eta": "2026-11-18",
  "goods_value": "60000",
  "goods_value_currency": "EUR",
  "containers": [
    {
      "commodity_type": "FAK",
      "container_size": "40FT",
      "container_type": "dry",
      "container_count": "1",
      "container_weight": "20000",
      "weight_unit": "kg",
      "commodity_description": "Used vehicle parts"
    }
  ]
}
{
  "shipment_type": "import",
  "shipment_transport_type": "customs_brokerage",
  "cb_type": "lcl",
  "origin_port": "Antwerp (BEANR) Belgium",
  "origin_port_code": "BEANR",
  "destination_port": "Tin Can Island (NGTIN) Nigeria",
  "destination_port_code": "NGTIN",
  "brokerage_type": "bond",
  "senders_name": "Euro Parts BV",
  "senders_address": "Haven 1100, 2030 Antwerp, Belgium",
  "transport_mode": "ocean",
  "port_eta": "2026-11-18",
  "goods_value": "12000",
  "goods_value_currency": "EUR",
  "containers": [
    {
      "container_count": "2",
      "container_length": "120",
      "container_width": "80",
      "container_height": "100",
      "dimension_unit": "cm",
      "container_weight": "450",
      "weight_unit": "kg",
      "commodity_type": "FAK",
      "commodity_description": "Used vehicle parts"
    }
  ]
}
Response
{
  "success": true,
  "message": "Your request for quote has been received.",
  "data": {
    "id": "6ad04a5ec1abf3e526d84603",
    "rfq_number": "RFQ-26-10-032",
    "shipment_status": "incomplete",
    "shipment_type": "import",
    "shipment_transport_type": "ocean_freight",
    "additional_comments": "Please include destination clearance.",
    "created_at": "2026-10-15T03:37:02.985Z",
    "updated_at": "2026-10-15T03:37:02.985Z",
    "origin_port": "Barcelona (ESBCN) Spain",
    "origin_port_code": "ESBCN",
    "destination_port": "Apapa (NGAPP) Nigeria",
    "destination_port_code": "NGAPP",
    "ocean_freight_type": "fcl",
    "incoterms": "FOB",
    "goods_value": "45000",
    "goods_value_currency": "USD",
    "with_haulage": true,
    "customs_brokerage": true,
    "haulage_type": "destination",
    "destination_address": "12 Ikorodu Road, Lagos",
    "with_tracker": false,
    "raised_by": {
      "id": "6ad04a57c1abf3e526d845d7",
      "full_name": "grace okafor"
    },
    "selected_rate": null,
    "containers": [
      {
        "id": "6ad04a5fc1abf3e526d84605",
        "commodity_type": "fak",
        "commodity_hs_code": "102210000",
        "commodity_description": "live purebred breeding cattle",
        "commodity_chapter": "agro commodities",
        "commodity_category": "livestock & animals",
        "container_size": "20FT",
        "container_type": "dry",
        "container_count": "1",
        "container_weight": "23000",
        "weight_unit": "kg"
      },
      {
        "id": "6ad04a5fc1abf3e526d84607",
        "commodity_type": "fak",
        "commodity_description": "assorted kitchen utensils",
        "container_size": "40HC",
        "container_type": "dry",
        "container_count": "2",
        "container_weight": "18000",
        "weight_unit": "kg"
      }
    ],
    "documents": [
      {
        "id": "6ad04a5fc1abf3e526d84609",
        "document_category": "commercial_shipping",
        "document_name": "Packing List",
        "original_file_name": "1792035420981-955cc36c5fac8af8.pdf",
        "document_location": "https://one-port-365-assets-dev-env.s3.eu-west-2.amazonaws.com/uploads/customer/6ad04a57c1abf3e526d845d5/packing_list/1792035420981-955cc36c5fac8af8.pdf",
        "created_at": "2026-10-15T03:37:03.423Z"
      },
      {
        "id": "6ad04a5fc1abf3e526d8460c",
        "document_category": "commercial_shipping",
        "document_name": "Proforma Invoice",
        "original_file_name": "1792035421910-6da129b940fbed7f.pdf",
        "document_location": "https://one-port-365-assets-dev-env.s3.eu-west-2.amazonaws.com/uploads/customer/6ad04a57c1abf3e526d845d5/proforma_invoice/1792035421910-6da129b940fbed7f.pdf",
        "created_at": "2026-10-15T03:37:03.939Z"
      }
    ]
  }
}
{
  "success": false,
  "message": "origin_port, destination_port, incoterms, goods_value, goods_value_currency are required for ocean_freight (fcl)"
}
{
  "success": false,
  "message": "company_id (taken from your account) cannot be sent on an RFQ"
}

Errors

StatusWhen
400A required field is missing, a field does not apply to the service, a cargo field was sent outside containers, or a server-set field (company_id, user_id) was sent.

Search rates

GET/rfqs/:id/ratesBearer token

Ocean freight rates for the RFQ's lane and container sizes, unexpired, closest match first. Only rates for the RFQ's own ports are returned, so a lane with none returns an empty list.

Each rate has prices: [{ container_size, price }]. These are catalogue prices; OnePort adds its margin on the quote. The page also carries match_level (exact or similar) and selected_rate_id.

Query parameters

ParamTypeDescription
pageintegeroptionalDefault 1
limitintegeroptionalDefault 10
carrier_namestringoptionalFilter by carrier, e.g. MSC
Request
curl --request GET 'https://test-bpass-api.oneport365.com/api/v1/rfqs/6ad04a5ec1abf3e526d84603/rates?page=1&limit=10' \
  --header 'Authorization: Bearer $ACCESS_TOKEN'
Response
{
  "success": true,
  "data": {
    "data": [
      {
        "id": "6ab10d88b97056455ee0dd57",
        "carrier_name": "cma cgm",
        "origin": "Spain",
        "destination": "Nigeria",
        "origin_port_code": "ESBCN",
        "destination_port_code": "NGAPP",
        "currency": "USD",
        "prices": [
          {
            "container_size": "20FT",
            "price": 300
          },
          {
            "container_size": "40HC",
            "price": 550
          }
        ],
        "transit_time": "5",
        "free_time": "0",
        "valid_to": "2026-10-24T00:00:00.000Z",
        "commodity_type": "FAK",
        "match_level": "exact"
      }
    ],
    "total": 1,
    "page": 1,
    "limit": 10,
    "total_pages": 1,
    "paging_counter": 0,
    "has_prev_page": false,
    "has_next_page": false,
    "prev_page": 0,
    "next_page": 0,
    "match_level": "similar",
    "selected_rate_id": null
  }
}
{
  "success": false,
  "message": "Online rates are only available for ocean freight for now"
}

Errors

StatusWhen
400The RFQ is not ocean freight, or it has already been confirmed.

Select rate

PUT/rfqs/:id/selected-rateBearer token

Picks a rate from the search results. Selecting again replaces the previous choice.

Body

FieldTypeDescription
rate_idstringrequiredid of a rate from Search rates
Request
curl --request PUT 'https://test-bpass-api.oneport365.com/api/v1/rfqs/6ad04a5ec1abf3e526d84603/selected-rate' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --header 'Content-Type: application/json' \
  --data '{
    "rate_id": "6ab10d88b97056455ee0dd57"
  }'
{
  "rate_id": "6ab10d88b97056455ee0dd57"
}
Response
{
  "success": true,
  "message": "Rate selected.",
  "data": {
    "rate_id": "6ab10d88b97056455ee0dd57",
    "category": "ocean_freight",
    "carrier_name": "cma cgm",
    "origin": "Spain",
    "destination": "Nigeria",
    "origin_port_code": "ESBCN",
    "destination_port_code": "NGAPP",
    "currency": "USD",
    "transit_time": "5",
    "free_time": "0",
    "valid_to": "2026-10-24T00:00:00.000Z",
    "match_level": "exact",
    "prices": [
      {
        "container_size": "20FT",
        "price": 300
      },
      {
        "container_size": "40HC",
        "price": 550
      }
    ],
    "selected_at": "2026-10-15T03:37:16.639Z"
  }
}
{
  "success": false,
  "message": "This rate is not available for this RFQ. Search again and pick one from the results."
}

Errors

StatusWhen
400The rate isn't in this RFQ's search results (expired, another lane, or no price for its containers), or the RFQ is already confirmed.

Confirm RFQ

POST/rfqs/:id/confirmBearer token

Moves the RFQ from incomplete to new rfq and sends it to OnePort Sales. Ocean freight needs a selected rate that hasn't expired. After confirming, search, select and confirm all return 400.

Request
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/rfqs/6ad04a5ec1abf3e526d84603/confirm' \
  --header 'Authorization: Bearer $ACCESS_TOKEN'
Response
{
  "success": true,
  "message": "Your request for quote has been sent to OnePort.",
  "data": {
    "id": "6ad04a5ec1abf3e526d84603",
    "rfq_number": "RFQ-26-10-032",
    "shipment_status": "new rfq",
    "shipment_type": "import",
    "shipment_transport_type": "ocean_freight",
    "additional_comments": "Please include destination clearance.",
    "created_at": "2026-10-15T03:37:02.985Z",
    "updated_at": "2026-10-15T03:37:17.614Z",
    "origin_port": "Barcelona (ESBCN) Spain",
    "origin_port_code": "ESBCN",
    "destination_port": "Apapa (NGAPP) Nigeria",
    "destination_port_code": "NGAPP",
    "ocean_freight_type": "fcl",
    "incoterms": "FOB",
    "goods_value": "45000",
    "goods_value_currency": "USD",
    "with_haulage": true,
    "customs_brokerage": true,
    "haulage_type": "destination",
    "destination_address": "12 Ikorodu Road, Lagos",
    "with_tracker": false,
    "raised_by": {
      "id": "6ad04a57c1abf3e526d845d7",
      "full_name": "grace okafor"
    },
    "selected_rate": {
      "rate_id": "6ab10d88b97056455ee0dd57",
      "category": "ocean_freight",
      "carrier_name": "cma cgm",
      "origin": "Spain",
      "destination": "Nigeria",
      "origin_port_code": "ESBCN",
      "destination_port_code": "NGAPP",
      "currency": "USD",
      "transit_time": "5",
      "free_time": "0",
      "valid_to": "2026-10-24T00:00:00.000Z",
      "match_level": "exact",
      "prices": [
        {
          "container_size": "20FT",
          "price": 300
        },
        {
          "container_size": "40HC",
          "price": 550
        }
      ],
      "selected_at": "2026-10-15T03:37:16.639Z"
    },
    "containers": [
      {
        "id": "6ad04a5fc1abf3e526d84605",
        "commodity_type": "fak",
        "commodity_hs_code": "102210000",
        "commodity_description": "live purebred breeding cattle",
        "commodity_chapter": "agro commodities",
        "commodity_category": "livestock & animals",
        "container_size": "20FT",
        "container_type": "dry",
        "container_count": "1",
        "container_weight": "23000",
        "weight_unit": "kg"
      },
      {
        "id": "6ad04a5fc1abf3e526d84607",
        "commodity_type": "fak",
        "commodity_description": "assorted kitchen utensils",
        "container_size": "40HC",
        "container_type": "dry",
        "container_count": "2",
        "container_weight": "18000",
        "weight_unit": "kg"
      }
    ],
    "documents": [
      {
        "id": "6ad04a5fc1abf3e526d84609",
        "document_category": "commercial_shipping",
        "document_name": "Packing List",
        "original_file_name": "1792035420981-955cc36c5fac8af8.pdf",
        "document_location": "https://one-port-365-assets-dev-env.s3.eu-west-2.amazonaws.com/uploads/customer/6ad04a57c1abf3e526d845d5/packing_list/1792035420981-955cc36c5fac8af8.pdf",
        "created_at": "2026-10-15T03:37:03.423Z"
      },
      {
        "id": "6ad04a5fc1abf3e526d8460c",
        "document_category": "commercial_shipping",
        "document_name": "Proforma Invoice",
        "original_file_name": "1792035421910-6da129b940fbed7f.pdf",
        "document_location": "https://one-port-365-assets-dev-env.s3.eu-west-2.amazonaws.com/uploads/customer/6ad04a57c1abf3e526d845d5/proforma_invoice/1792035421910-6da129b940fbed7f.pdf",
        "created_at": "2026-10-15T03:37:03.939Z"
      }
    ]
  }
}
{
  "success": false,
  "message": "Select a rate before confirming this RFQ"
}
{
  "success": false,
  "message": "This RFQ has already been confirmed"
}

List RFQs

GET/rfqsBearer token

The company's RFQs, newest first, including incomplete ones.

Query parameters

ParamTypeDescription
pageintegeroptionalDefault 1
limitintegeroptionalDefault 10
Request
curl --request GET 'https://test-bpass-api.oneport365.com/api/v1/rfqs?page=1&limit=10' \
  --header 'Authorization: Bearer $ACCESS_TOKEN'
Response
{
  "success": true,
  "data": {
    "total": 7,
    "page": 1,
    "paging_counter": 0,
    "limit": 3,
    "total_pages": 3,
    "data": [
      {
        "id": "6ad04a68c1abf3e526d8464f",
        "rfq_number": "RFQ-26-10-038",
        "shipment_status": "incomplete",
        "shipment_type": "import",
        "shipment_transport_type": "customs_brokerage",
        "created_at": "2026-10-15T03:37:12.494Z",
        "updated_at": "2026-10-15T03:37:12.494Z",
        "origin_port": "Antwerp (BEANR) Belgium",
        "origin_port_code": "BEANR",
        "destination_port": "Tin Can Island (NGTIN) Nigeria",
        "destination_port_code": "NGTIN",
        "raised_by": {
          "id": "6ad04a57c1abf3e526d845d7",
          "full_name": "grace okafor"
        },
        "selected_rate": null
      },
      {
        "id": "6ad04a67c1abf3e526d84644",
        "rfq_number": "RFQ-26-10-037",
        "shipment_status": "incomplete",
        "shipment_type": "import",
        "shipment_transport_type": "customs_brokerage",
        "created_at": "2026-10-15T03:37:11.177Z",
        "updated_at": "2026-10-15T03:37:11.177Z",
        "origin_port": "Antwerp (BEANR) Belgium",
        "origin_port_code": "BEANR",
        "destination_port": "Tin Can Island (NGTIN) Nigeria",
        "destination_port_code": "NGTIN",
        "raised_by": {
          "id": "6ad04a57c1abf3e526d845d7",
          "full_name": "grace okafor"
        },
        "selected_rate": null
      },
      {
        "id": "6ad04a66c1abf3e526d84639",
        "rfq_number": "RFQ-26-10-036",
        "shipment_status": "incomplete",
        "shipment_type": "export",
        "shipment_transport_type": "haulage",
        "created_at": "2026-10-15T03:37:10.005Z",
        "updated_at": "2026-10-15T03:37:10.005Z",
        "origin_port": "Apapa (NGAPP) Nigeria",
        "origin_port_code": "NGAPP",
        "raised_by": {
          "id": "6ad04a57c1abf3e526d845d7",
          "full_name": "grace okafor"
        },
        "selected_rate": null
      }
    ],
    "has_prev_page": false,
    "has_next_page": true,
    "prev_page": 0,
    "next_page": 2
  }
}

Get RFQ

GET/rfqs/:idBearer token

One of the company's RFQs, with its cargo lines, documents and selected rate.

Request
curl --request GET 'https://test-bpass-api.oneport365.com/api/v1/rfqs/6ad04a5ec1abf3e526d84603' \
  --header 'Authorization: Bearer $ACCESS_TOKEN'
Response
{
  "success": true,
  "data": {
    "id": "6ad04a5ec1abf3e526d84603",
    "rfq_number": "RFQ-26-10-032",
    "shipment_status": "new rfq",
    "shipment_type": "import",
    "shipment_transport_type": "ocean_freight",
    "additional_comments": "Please include destination clearance.",
    "created_at": "2026-10-15T03:37:02.985Z",
    "updated_at": "2026-10-15T03:37:17.614Z",
    "origin_port": "Barcelona (ESBCN) Spain",
    "origin_port_code": "ESBCN",
    "destination_port": "Apapa (NGAPP) Nigeria",
    "destination_port_code": "NGAPP",
    "ocean_freight_type": "fcl",
    "incoterms": "FOB",
    "goods_value": "45000",
    "goods_value_currency": "USD",
    "with_haulage": true,
    "customs_brokerage": true,
    "haulage_type": "destination",
    "destination_address": "12 Ikorodu Road, Lagos",
    "with_tracker": false,
    "raised_by": {
      "id": "6ad04a57c1abf3e526d845d7",
      "full_name": "grace okafor"
    },
    "selected_rate": {
      "rate_id": "6ab10d88b97056455ee0dd57",
      "category": "ocean_freight",
      "carrier_name": "cma cgm",
      "origin": "Spain",
      "destination": "Nigeria",
      "origin_port_code": "ESBCN",
      "destination_port_code": "NGAPP",
      "currency": "USD",
      "transit_time": "5",
      "free_time": "0",
      "valid_to": "2026-10-24T00:00:00.000Z",
      "match_level": "exact",
      "prices": [
        {
          "container_size": "20FT",
          "price": 300
        },
        {
          "container_size": "40HC",
          "price": 550
        }
      ],
      "selected_at": "2026-10-15T03:37:16.639Z"
    },
    "containers": [
      {
        "id": "6ad04a5fc1abf3e526d84605",
        "commodity_type": "fak",
        "commodity_hs_code": "102210000",
        "commodity_description": "live purebred breeding cattle",
        "commodity_chapter": "agro commodities",
        "commodity_category": "livestock & animals",
        "container_size": "20FT",
        "container_type": "dry",
        "container_count": "1",
        "container_weight": "23000",
        "weight_unit": "kg"
      },
      {
        "id": "6ad04a5fc1abf3e526d84607",
        "commodity_type": "fak",
        "commodity_description": "assorted kitchen utensils",
        "container_size": "40HC",
        "container_type": "dry",
        "container_count": "2",
        "container_weight": "18000",
        "weight_unit": "kg"
      }
    ],
    "documents": [
      {
        "id": "6ad04a5fc1abf3e526d84609",
        "document_category": "commercial_shipping",
        "document_name": "Packing List",
        "original_file_name": "1792035420981-955cc36c5fac8af8.pdf",
        "document_location": "https://one-port-365-assets-dev-env.s3.eu-west-2.amazonaws.com/uploads/customer/6ad04a57c1abf3e526d845d5/packing_list/1792035420981-955cc36c5fac8af8.pdf",
        "created_at": "2026-10-15T03:37:03.423Z"
      },
      {
        "id": "6ad04a5fc1abf3e526d8460c",
        "document_category": "commercial_shipping",
        "document_name": "Proforma Invoice",
        "original_file_name": "1792035421910-6da129b940fbed7f.pdf",
        "document_location": "https://one-port-365-assets-dev-env.s3.eu-west-2.amazonaws.com/uploads/customer/6ad04a57c1abf3e526d845d5/proforma_invoice/1792035421910-6da129b940fbed7f.pdf",
        "created_at": "2026-10-15T03:37:03.939Z"
      }
    ]
  }
}
{
  "success": false,
  "message": "RFQ not found"
}
v2 · Shipments

Shipments

Booked shipments, scoped to the signed-in customer's company. An RFQ appears here once OnePort books it; RFQs still being quoted stay under RFQs.

List shipments

GET/shipmentsBearer token

The company's booked shipments, newest first. All filters are optional. A new company's list is empty until OnePort books one of its RFQs.

Query parameters

ParamTypeDescription
pageintegeroptionalDefault 1
limitintegeroptionalDefault 10, max 100
searchstringoptionalJob, BL or RFQ number, or port
shipment_statusstringoptionalpending, active, post shipment, completed, cancelled
shipment_typestringoptionalimport, export
shipment_transport_typestringoptionalocean_freight, air_freight, haulage, customs_brokerage
start_datedateoptionale.g. 2026-01-01
end_datedateoptionale.g. 2026-12-31
Request
curl --request GET 'https://test-bpass-api.oneport365.com/api/v1/shipments?page=1&limit=10&shipment_status=active' \
  --header 'Authorization: Bearer $ACCESS_TOKEN'
Response
{
  "success": true,
  "data": {
    "total": 0,
    "page": 1,
    "paging_counter": 0,
    "limit": 10,
    "total_pages": 0,
    "data": [],
    "has_prev_page": false,
    "has_next_page": false,
    "prev_page": 0,
    "next_page": 0
  }
}
{
  "success": false,
  "message": "The selected shipment status is invalid."
}

Get shipment

GET/shipments/:idBearer token

One shipment with its containers (cargo lines) and documents. Each document has category and type labels and uploaded_by: oneport or customer.

Request
curl --request GET 'https://test-bpass-api.oneport365.com/api/v1/shipments/:id' \
  --header 'Authorization: Bearer $ACCESS_TOKEN'
Response
{
  "success": false,
  "message": "Shipment not found"
}

Errors

StatusWhen
404Unknown id, an RFQ that isn't booked yet, or another company's shipment.

Document categories

GET/shipments/document-categoriesBearer token

The category → document type tree for the upload form. Import and export have different trees, so pass the shipment's shipment_type. Without it, both trees come back keyed by direction.

Query parameters

ParamTypeDescription
shipment_typestringoptionalimport, export; omit for both trees
Request
curl --request GET 'https://test-bpass-api.oneport365.com/api/v1/shipments/document-categories?shipment_type=import' \
  --header 'Authorization: Bearer $ACCESS_TOKEN'
Response
{
  "success": true,
  "data": [
    {
      "key": "commercial_shipping",
      "label": "Commercial & Shipping",
      "types": [
        {
          "key": "commercial_invoice",
          "label": "Commercial Invoice"
        },
        {
          "key": "packing_list",
          "label": "Packing List"
        },
        {
          "key": "bill_of_lading_swb_or_telex",
          "label": "Bill of Lading (SWB or Telex)"
        },
        {
          "key": "certificate_of_origin",
          "label": "Certificate of Origin"
        },
        {
          "key": "air_waybill",
          "label": "Air Waybill"
        },
        {
          "key": "ccvo",
          "label": "CCVO"
        },
        {
          "key": "insurance_certificate",
          "label": "Insurance Certificate"
        },
        {
          "key": "others",
          "label": "Others"
        }
      ]
    },
    {
      "key": "regulatory_customs",
      "label": "Regulatory & Customs",
      "types": [
        {
          "key": "form_m",
          "label": "Form M"
        },
        {
          "key": "paar",
          "label": "PAAR"
        },
        {
          "key": "soncap_son_documents",
          "label": "SONCAP / SON Documents"
        },
        {
          "key": "nafdac_documents",
          "label": "NAFDAC Documents"
        },
        {
          "key": "nesrea_documents",
          "label": "NESREA Documents"
        },
        {
          "key": "ncs_required_permits_approvals",
          "label": "NCS-Required Permits/Approvals"
        },
        {
          "key": "end_user_certificate",
          "label": "End User Certificate"
        },
        {
          "key": "product_specific_regulatory_permits",
          "label": "Product-Specific Regulatory Permits"
        },
        {
          "key": "customs_duty_payment_evidence",
          "label": "Customs Duty Payment Evidence"
        },
        {
          "key": "others",
          "label": "Others"
        }
      ]
    },
    {
      "key": "importer_consignee",
      "label": "Importer/Consignee Documents",
      "types": [
        {
          "key": "importer_authorisation_letter_of_authority",
          "label": "Importer Authorisation / Letter of Authority"
        },
        {
          "key": "shipping_invoice",
          "label": "Shipping Invoice"
        },
        {
          "key": "shipping_receipt",
          "label": "Shipping Receipt"
        },
        {
          "key": "delivery_order",
          "label": "Delivery Order"
        },
        {
          "key": "terminal_invoice",
          "label": "Terminal Invoice"
        },
        {
          "key": "others",
          "label": "Others"
        }
      ]
    },
    {
      "key": "clearing",
      "label": "Clearing Documents",
      "types": [
        {
          "key": "terminal_receipt",
          "label": "Terminal Receipt"
        },
        {
          "key": "final_assessment",
          "label": "Final Assessment"
        },
        {
          "key": "inspection_act",
          "label": "Inspection Act"
        },
        {
          "key": "exit_note_gate",
          "label": "Exit Note/Gate"
        },
        {
          "key": "tdo",
          "label": "TDO"
        },
        {
          "key": "eir",
          "label": "EIR"
        },
        {
          "key": "waybill",
          "label": "Waybill"
        },
        {
          "key": "others",
          "label": "Others"
        }
      ]
    }
  ]
}
{
  "success": true,
  "data": [
    {
      "key": "commercial",
      "label": "Commercial Documents",
      "types": [
        {
          "key": "proforma_invoice",
          "label": "Proforma Invoice"
        },
        {
          "key": "packing_list",
          "label": "Packing List"
        },
        {
          "key": "commercial_invoice",
          "label": "Commercial Invoice"
        },
        {
          "key": "others",
          "label": "Others"
        }
      ]
    },
    {
      "key": "regulatory_export",
      "label": "Regulatory & Export Documents",
      "types": [
        {
          "key": "nxp_form",
          "label": "NXP Form"
        },
        {
          "key": "clean_certificate_of_inspection",
          "label": "Clean Certificate of Inspection"
        },
        {
          "key": "single_goods_declaration_sgd",
          "label": "Single Goods Declaration (SGD)"
        },
        {
          "key": "inspection_act",
          "label": "Inspection Act"
        },
        {
          "key": "shipping_export_docs_acknowledgement",
          "label": "Shipping Export Docs Acknowledgement"
        },
        {
          "key": "vessel_plan_confirmation",
          "label": "Vessel Plan Confirmation"
        },
        {
          "key": "terminal_invoice",
          "label": "Terminal Invoice"
        },
        {
          "key": "terminal_receipt",
          "label": "Terminal Receipt"
        },
        {
          "key": "customs_examination_release_documentation",
          "label": "Customs Examination/Release Documentation"
        },
        {
          "key": "eir_indemnity",
          "label": "EIR / Indemnity"
        },
        {
          "key": "others",
          "label": "Others"
        }
      ]
    },
    {
      "key": "shipping",
      "label": "Shipping Documents",
      "types": [
        {
          "key": "booking_confirmation",
          "label": "Booking Confirmation"
        },
        {
          "key": "shipping_instruction",
          "label": "Shipping Instruction"
        },
        {
          "key": "bill_of_lading_sea_waybill",
          "label": "Bill of Lading / Sea Waybill"
        },
        {
          "key": "shipping_invoice_freight",
          "label": "Shipping Invoice (Freight)"
        },
        {
          "key": "shipping_payment_freight",
          "label": "Shipping Payment (Freight)"
        },
        {
          "key": "shipping_invoice_local",
          "label": "Shipping Invoice (Local)"
        },
        {
          "key": "shipping_receipt_local",
          "label": "Shipping Receipt (Local)"
        },
        {
          "key": "others",
          "label": "Others"
        }
      ]
    },
    {
      "key": "post_shipment",
      "label": "Post Shipment Documents",
      "types": [
        {
          "key": "certificate_of_origin",
          "label": "Certificate of Origin"
        },
        {
          "key": "fumigation_certificate",
          "label": "Fumigation Certificate"
        },
        {
          "key": "phytosanitary_certificate",
          "label": "Phytosanitary Certificate"
        },
        {
          "key": "son_export_regulatory_documents",
          "label": "SON/Export Regulatory Documents"
        },
        {
          "key": "exporter_acknowledged_copy",
          "label": "Exporter Acknowledged Copy"
        },
        {
          "key": "other_commodity_specific_permits",
          "label": "Other Commodity-Specific Permits"
        },
        {
          "key": "others",
          "label": "Others"
        }
      ]
    }
  ]
}

Upload shipment document

POST/shipments/:id/documentsBearer token

Files a document against a booked shipment and returns 201. It is recorded as the customer's (uploaded_by: customer) and never replaces an existing document.

Form-data fields

FieldTypeDescription
filefilerequiredPDF, PNG, JPG, Excel, CSV or Word
document_categorystringrequiredA category key from Document categories
document_typestringrequiredA type key within that category
document_namestringRequired only when document_type is others
Request
curl --request POST 'https://test-bpass-api.oneport365.com/api/v1/shipments/:id/documents' \
  --header 'Authorization: Bearer $ACCESS_TOKEN' \
  --form 'file=@"./commercial-invoice.pdf"' \
  --form 'document_category=commercial_shipping' \
  --form 'document_type=commercial_invoice'
Response
{
  "success": false,
  "message": "Shipment not found"
}
{
  "success": false,
  "message": "The document type field is required."
}

Errors

StatusWhen
400A field is missing, or the category or type isn't valid for the shipment's direction.
404Unknown id or another company's shipment.
v2 · Reference data

Reference data

Lookups for filling in an RFQ.

Airports

GET/reference/airportsBearer token

Airport picker for air freight RFQs. Use port_code as origin_port_code or destination_port_code; OnePort fills in the airport name and details.

Query parameters

ParamTypeDescription
searchstringoptionalName, city or code
limitintegeroptional
Request
curl --request GET 'https://test-bpass-api.oneport365.com/api/v1/reference/airports?search=lagos&limit=20' \
  --header 'Authorization: Bearer $ACCESS_TOKEN'
Response
{
  "success": true,
  "data": {
    "total": 1,
    "page": 1,
    "paging_counter": 0,
    "limit": 5,
    "total_pages": 1,
    "data": [
      {
        "id": "67c7c7b462f127463dec4bd0",
        "name": "Murtala Muhammed International Airport",
        "port_code": "LOS",
        "city": "Lagos",
        "country_code": "NG",
        "country_name": "Nigeria"
      }
    ],
    "has_prev_page": false,
    "has_next_page": false,
    "prev_page": 0,
    "next_page": 0
  }
}
{
  "success": false,
  "message": "Access denied. No token provided."
}

Commodities

GET/reference/commoditiesPublic

HS-code commodity picker, organised as chapter → category → HS code. No sign-in needed. Send one query key at a time; commodity_description and hs_code may be combined.

Copy the picked names onto each RFQ cargo line as commodity_chapter, commodity_category, commodity_description and commodity_hs_code.

NamingThe commodity_type query key here searches HS chapters. On an RFQ cargo line, commodity_type means the cargo class (FAK or DG), which is different.

Query parameters

ParamTypeDescription
commodity_typestringoptionalSearch chapters (empty = all)
commodity_categorystringoptionalSearch categories (empty = all)
commodity_descriptionstringoptionalSearch HS codes by description
hs_codestringoptionalSearch by HS code
Request
curl --request GET 'https://test-bpass-api.oneport365.com/api/v1/reference/commodities?commodity_type=agro'
Response
{
  "success": true,
  "message": "commodities fetched Successfully",
  "data": [
    {
      "_id": "68a439bd3a4912126b6c9412",
      "name": "Agro Commodities",
      "type": "chapter"
    }
  ]
}
{
  "success": true,
  "message": "commodities fetched Successfully",
  "data": [
    {
      "_id": "68a43bc2dc29c613727c985f",
      "name": "Grains & Cereals",
      "type": "category",
      "level1": "68a439bd3a4912126b6c9412"
    }
  ]
}
{
  "success": true,
  "message": "commodities fetched Successfully",
  "data": [
    {
      "_id": "68a442b8c466711783946f3c",
      "name": "Meat of horses, asses, mules or hinnies, fresh, chilled or frozen.",
      "code": "205000000",
      "type": "hsCode",
      "level1": "68a439bd3a4912126b6c9415",
      "level2": "68a43bc3dc29c613727c9868"
    },
    {
      "_id": "68a442e1c466711783947078",
      "name": "Jack and horse mackerel (Trachurus spp.) meat, fresh or chilled.",
      "code": "302450000",
      "type": "hsCode",
      "level1": "68a439bd3a4912126b6c9412",
      "level2": "68a43bc2dc29c613727c9862"
    },
    {
      "_id": "68a442fcc466711783947149",
      "name": "Jack and horse mackerel (Trachurus spp.) meat, frozen.",
      "code": "303550000",
      "type": "hsCode",
      "level1": "68a439bd3a4912126b6c9412",
      "level2": "68a43bc2dc29c613727c9862"
    },
    {
      "_id": "68a44398c4667117839475ff",
      "name": "Seeds of Broad beans and horse beans",
      "code": "713501000",
      "type": "hsCode",
      "level1": "68a439bd3a4912126b6c9412",
      "level2": "68a43bc6dc29c613727c9880"
    },
    {
      "_id": "68a448b5c466711783949ce7",
      "name": "Yarn of coarse animal hair or of horsehair (including gimpe",
      "code": "5110000000",
      "type": "hsCode",
      "level1": "68a439bd3a4912126b6c9412",
      "level2": "68a43bc3dc29c613727c986b"
    },
    {
      "_id": "68a448bac466711783949d13",
      "name": "Woven fabrics of coarse animal hair or of horsehair.",
      "code": "5113000000",
      "type": "hsCode",
      "level1": "68a439bd3a4912126b6c9412",
      "level2": "68a43bc3dc29c613727c986b"
    }
  ]
}
{
  "success": true,
  "message": "commodities fetched Successfully",
  "data": [
    {
      "_id": "68a44785c4667117839493c6",
      "name": "Other plates, sheets, film, foil and strip, of polymers of ethylene Not printed",
      "code": "3920101000",
      "type": "hsCode",
      "level1": "68a439bd3a4912126b6c9412",
      "level2": "68a43bc4dc29c613727c986e"
    },
    {
      "_id": "68a447b7c466711783949557",
      "name": "Reinforced only with metal",
      "code": "4010110000",
      "type": "hsCode",
      "level1": "68a439bd3a4912126b6c9415",
      "level2": "68a43bc6dc29c613727c9883"
    },
    {
      "_id": "68a447b8c46671178394955b",
      "name": "Reinforced only with textile materials",
      "code": "4010120000",
      "type": "hsCode",
      "level1": "68a439bd3a4912126b6c9415",
      "level2": "68a43bc9dc29c613727c989b"
    },
    {
      "_id": "68a447b8c46671178394955f",
      "name": "Conveyor or transmission belts or beltin Other",
      "code": "4010190000",
      "type": "hsCode",
      "level1": "68a439bd3a4912126b6c9417",
      "level2": "68a43bc5dc29c613727c9877"
    },
    {
      "_id": "68a44a4ec46671178394a932",
      "name": "Mutilated rags",
      "code": "6310101000",
      "type": "hsCode",
      "level1": "68a439be3a4912126b6c9419",
      "level2": "68a439be3a4912126b6c9419"
    },
    {
      "_id": "68a44ab1c46671178394ac20",
      "name": "Ampoules of glass",
      "code": "7010100000",
      "type": "hsCode",
      "level1": "68a439bd3a4912126b6c9417",
      "level2": "68a43bc8dc29c613727c9892"
    },
    {
      "_id": "68a44ed9c46671178394cc24",
      "name": "Apparatus and equipment for automatically developing photographic film or paper in rolls",
      "code": "9010100000",
      "type": "hsCode",
      "level1": "68a439bd3a4912126b6c9412",
      "level2": "68a43bc3dc29c613727c9865"
    },
    {
      "_id": "68a44fe8c46671178394d435",
      "name": "Maize (corn) starch excluding Pharmaceutical grade",
      "code": "9901101011",
      "type": "hsCode",
      "level1": "68a439bd3a4912126b6c9412",
      "level2": "68a43bc2dc29c613727c985f"
    },
    {
      "_id": "68a44fe9c46671178394d439",
      "name": "-- Food preparations not elsewhere specified or included: Stock powder",
      "code": "9901101012",
      "type": "hsCode",
      "level1": "68a439be3a4912126b6c9419",
      "level2": "68a439be3a4912126b6c9419"
    },
    {
      "_id": "68a44fe9c46671178394d43d",
      "name": "Petroleum oils and oil obtained from bituminous mineral",
      "code": "9901101013",
      "type": "hsCode",
      "level1": "68a439bd3a4912126b6c9412",
      "level2": "68a43bc4dc29c613727c986e"
    },
    {
      "_id": "68a44feac46671178394d441",
      "name": "Prepared glues and other\tprepared adhesives",
      "code": "9901101014",
      "type": "hsCode",
      "level1": "68a439be3a4912126b6c941b",
      "level2": "68a43bcadc29c613727c989e"
    },
    {
      "_id": "68a44feac46671178394d445",
      "name": "Prepared binders for foundry moulds or cores �- Other",
      "code": "9901101015",
      "type": "hsCode",
      "level1": "68a439be3a4912126b6c9419",
      "level2": "68a439be3a4912126b6c9419"
    },
    {
      "_id": "68a44febc46671178394d449",
      "name": "-- weighing not more than 25g/m 2",
      "code": "9901101016",
      "type": "hsCode",
      "level1": "68a439be3a4912126b6c9419",
      "level2": "68a439be3a4912126b6c9419"
    },
    {
      "_id": "68a44febc46671178394d44d",
      "name": "-- weighing more than 25g/m 2 but not more than 70 g/m2",
      "code": "9901101017",
      "type": "hsCode",
      "level1": "68a439be3a4912126b6c9419",
      "level2": "68a439be3a4912126b6c9419"
    },
    {
      "_id": "68a44fecc46671178394d451",
      "name": "-- weighing more than 25g/m 2 but not more than 70 g/m2",
      "code": "9901101018",
      "type": "hsCode",
      "level1": "68a439be3a4912126b6c9419",
      "level2": "68a439be3a4912126b6c9419"
    },
    {
      "_id": "68a44fecc46671178394d455",
      "name": "-- Other : weighing not more than 25g/m 2",
      "code": "9901101019",
      "type": "hsCode",
      "level1": "68a439be3a4912126b6c9419",
      "level2": "68a439be3a4912126b6c9419"
    },
    {
      "_id": "68a44ffbc46671178394d4c9",
      "name": "--Presented completely knocked down (CKD) or unassembled for the assembly industry; CKD",
      "code": "9903101011",
      "type": "hsCode",
      "level1": "68a439bd3a4912126b6c9412",
      "level2": "68a43bc3dc29c613727c986b"
    }
  ]
}
v1 · OnePort BPAAS Middleware API
DeprecatedYou are reading the v1 docs. v1 will be retired soon; new integrations should use v2. See Migrating from v1.

Introduction

The OnePort BPAAS (Booking Platform as a Service) Middleware API is a RESTful integration layer that gives partner platforms programmatic access to OnePort 365's freight and logistics services.

OnePort 365 is a digital freight forwarding platform that connects shippers, exporters, and importers to carriers, freight agents, and logistics providers across Africa and global trade lanes. The BPAAS Middleware API is the bridge that lets your platform — whether a marketplace, ERP system, trade finance tool, or customs portal — embed OnePort's freight capabilities directly into your own product without building the logistics infrastructure from scratch.

Through this API, your platform can:

  • Onboard users with a secure, OTP-verified registration and login flow.
  • Search live freight rates across multiple carriers and lanes in real time.
  • Create and confirm bookings for ocean freight shipments with full container specification.
  • Manage shipments end-to-end, from creation to document uploads.
  • Access reference data such as commodity types and HS codes to validate and enrich payloads.

Who This API Is For

This documentation is intended for developers integrating OnePort 365's freight services into a third-party platform. You should be comfortable working with REST APIs, JSON payloads, and HTTP Bearer Token authentication.

SecurityIf you are building a front-end integration, all requests should be made from your backend — never expose your bearer token in client-side code.

Base URL

All API endpoints are relative to the base URL for your target environment. Prefix every endpoint path in this documentation with the appropriate base URL.

Environment Base URL
Test / Staging https://test-bpass-api.oneport365.com/api
Production https://bpass-api.oneport365.com/api
NoteDuring development, use the test environment. It is functionally equivalent to production but operates on isolated data so that test bookings and shipments do not affect live operations.

Authentication

The API uses Bearer Token authentication. Every request — except Register and Login — must include a valid token in the Authorization header.

Authorization: Bearer <your_token>

Tokens are obtained by completing the registration and login flow. Follow these steps before making any other API calls:

  1. Register — Create an account with your email, password, name, and phone. An OTP is sent to your email.
  2. Verify OTP — Confirm your email using the OTP. Your account is inactive until this step is completed.
  3. Login — Authenticate with your credentials. The response contains your bearer token.
  4. Store and use the token — Include it in the Authorization header on every subsequent request.

If your token expires, call Login again for a fresh one. For forgotten passwords, use the Forgot Password → Reset Password flow.

Request & Response Format

All request bodies must be sent as JSON (Content-Type: application/json), except for document uploads which use multipart/form-data. All responses are returned as JSON. A successful request returns a 2xx status code. Errors return a corresponding 4xx or 5xx status with a message body.

Resource Groups

The API is organized into five groups, each covering a distinct domain of the freight workflow:

Group What it covers
Auth Account registration, OTP verification, login, and password recovery
Bookings Create, list, view, and confirm freight bookings
Shipments Create and manage shipment records, and upload supporting documents
DaaS Reference data — commodity types, HS codes, categories, and descriptions
Live Rates Fetch real-time freight rates, validate pricing, and lock in a selected rate

Typical Integration Flow

Most integrations follow this end-to-end sequence. Each step depends on data returned by the previous one.

1.  Register
        ↓
2.  Verify OTP         (activates the account)
        ↓
3.  Login              →  receive bearer token
        ↓
4.  Get Live Rates     (pass search_id to next steps)
        ↓
5.  Confirm Live Rates (validate pricing in your chosen currency)
        ↓
6.  Select Rate        (locks the rate for a booking)
        ↓
7.  Create Booking     (origin, destination, container spec, cargo-ready date)
        ↓
8.  Confirm Booking    (links shipment_id and finalizes container details)
        ↓
9.  Upload Documents   (bill of lading, NXP, packing list, etc.)

Use the DaaS — Commodity Types endpoint at any point in the flow to look up valid HS codes, commodity categories, or descriptions to populate booking and shipment payloads correctly.

Key Concepts

search_id

A search_id ties together the three Live Rates calls — Get, Confirm, and Select. It represents a single rate-search session and must be passed as a path variable in all three endpoints.

booking_id vs shipment_id

A booking is a freight reservation — the intent to ship. A shipment is the operational record that tracks the cargo from origin to destination. They are linked: when you confirm a booking, you provide a shipment_id to tie them together.

Port Codes

Origin and destination ports are identified using UN/LOCODE — the United Nations Code for Trade and Transport Locations. For example, NGAPP is Apapa (Lagos, Nigeria) and DEHAM is Hamburg, Germany.

Container Sizes & Types

Container sizes follow the standard format: 20FT, 40FT, 40HC. Container types include dry (standard), reefer (refrigerated), and others depending on carrier availability.

v1 · Auth
DeprecatedYou are reading the v1 docs. v1 will be retired soon; new integrations should use v2. See Migrating from v1.

Auth

Registration, OTP verification, login and password recovery. Login returns the bearer token used across the rest of the API.

Register

POST/api/auth/register

Create a new account. Triggers a one-time code sent to the email for verification.

Body

Field Type
firstname string required
lastname string required
company_name string required
company_address string required
email string required
phone string required
password string required
is_agent boolean required
country_code string required — ISO 3166-1 alpha-2 (e.g. NG)
whatsapp_no string optional
registration_channel string optional — e.g. website
Request
curl --location 'https://test-bpass-api.oneport365.com/api/auth/register' \
  --header 'Content-Type: application/json' \
  --data '{
    "firstname": "Prajjwal",
    "lastname": "Soni",
    "company_name": "Oneport365",
    "company_address": "12 Admiralty Way, Lekki, Lagos",
    "email": "[email protected]",
    "phone": "+2348012345678",
    "password": "Secret@123",
    "is_agent": false,
    "country_code": "NG",
    "whatsapp_no": "+2348012345678",
    "registration_channel": "website"
  }'
{
  "firstname": "Prajjwal",
  "lastname": "Soni",
  "company_name": "Oneport365",
  "company_address": "12 Admiralty Way, Lekki, Lagos",
  "email": "[email protected]",
  "phone": "+2348012345678",
  "password": "Secret@123",
  "is_agent": false,
  "country_code": "NG",
  "whatsapp_no": "+2348012345678",
  "registration_channel": "website"
}

Login

POST/api/auth/login

Authenticate with email and password to obtain the bearer token.

Body

Field Type
email string required
password string required
{
  "email": "[email protected]",
  "password": "P@ssword1"
}

Forgot Password

POST/api/auth/forgot-password

Begin password recovery. Sends a one-time code to the account email.

{ "email": "[email protected]" }

Verify registration OTP

POST/api/auth/verify-registration-otp

Confirm a newly registered account with the OTP sent to the email.

Body

Field Type
email string required
otp string required
verify_token string required
{
  "email": "[email protected]",
  "otp": "123456",
  "verify_token": "a3f8c2d1e74b9056f2a1c8d3e5b7f901"
}

Reset Password

POST/api/auth/reset-password

Set a new password using the reset token from Forgot Password.

Body

Field Type
email string required
password string required
reset_token string required
{
  "email": "[email protected]",
  "password": "12344",
  "reset_token": "Vk93xR2mTpL8qZjN"
}
v1 · Bookings
DeprecatedYou are reading the v1 docs. v1 will be retired soon; new integrations should use v2. See Migrating from v1.

Bookings

List, view, create and confirm freight bookings for the authenticated account.

My Bookings

GET/api/bookings/my-bookings

List bookings for the authenticated account, paginated.

Query parameters

Param Type Default
page integer 0
count integer 15
curl --location 'https://test-bpass-api.oneport365.com/api/bookings/my-bookings?page=0&count=15' \
  --header 'Authorization: Bearer $TOKEN'

Booking Details

GET/api/bookings/details/:booking_id

Retrieve the full record for a single booking.

Path variables

Variable Type
booking_id string required

Booking Summary

GET/api/bookings/summary/:booking_id

Retrieve a condensed summary of a single booking.

Path variables

Variable Type
booking_id string required

Create Booking

POST/api/shipments/create

Create a booking for a lane with container and cargo-readiness details.

Body

Field Type
shipment_type string required
shipment_transport_type string required
origin_port_code string required
destination_port_code string required
cargo_pickup_date string (ISO 8601) required
cargo_ready_date string (ISO 8601) required
container_details array<object> required
goods_value string required
goods_value_currency string required — ISO 4217 (e.g. NGN)
goods_type string required
is_product_hazardous boolean required
with_haulage boolean required
ocean_freight_type string required — when shipment_transport_type is ocean_freight

Each item in container_details carries: commodity_hs_code, commodity_type, commodity_category, commodity_description, container_count, container_size, container_type, container_weight, ocean_freight_type.

{
  "shipment_type": "export",
  "shipment_transport_type": "ocean_freight",
  "origin_port_code": "NGAPP",
  "destination_port_code": "ESLEI",
  "cargo_pickup_date": "2026-11-22T11:43:28.165Z",
  "cargo_ready_date": "2026-11-22T11:43:28.165Z",
  "container_details": [
    {
      "commodity_hs_code": "101900000",
      "commodity_type": "Agro Commodities",
      "commodity_category": "Livestock & Animals",
      "commodity_description": "Live Mules and hinnies",
      "container_count": 1,
      "container_size": "20FT",
      "container_type": "dry",
      "container_weight": 500,
      "ocean_freight_type": "FCL"
    }
  ],
  "goods_value": "1000",
  "goods_value_currency": "NGN",
  "goods_type": "Sesame Seeds",
  "is_product_hazardous": false,
  "with_haulage": false,
  "ocean_freight_type": "FCL"
}

Confirm Booking

POST/api/bookings/confirm

Confirm a booking against a shipment and its container details.

Body

Field Type
shipment_id string required
shipment_transport_type string required
ocean_freight_type string required — when shipment_transport_type is ocean_freight
container_details array<object> required
incoterms array<string> required — e.g. ["FOB"]
cargo_ready_date string (YYYY-MM-DD) required
with_haulage boolean required
with_tracker boolean required
goods_type string required
goods_value string required
goods_value_currency string required — ISO 4217 (e.g. USD)

Each item in container_details carries: container_count, container_type, container_size, container_weight, commodity_type, commodity_category, commodity_description.

{
  "shipment_id": "665f1c9a2b4d8e0012ab34cd",
  "shipment_transport_type": "ocean_freight",
  "ocean_freight_type": "FCL",
  "container_details": [
    {
      "container_count": 2,
      "container_type": "dry",
      "container_size": "40FT",
      "container_weight": 18,
      "commodity_type": "general_cargo",
      "commodity_category": "general",
      "commodity_description": "Ceramic tiles"
    }
  ],
  "incoterms": ["FOB"],
  "cargo_ready_date": "2026-08-10",
  "with_haulage": false,
  "with_tracker": false
}
v1 · Shipments
DeprecatedYou are reading the v1 docs. v1 will be retired soon; new integrations should use v2. See Migrating from v1.

Shipments

List and view shipments, create them, and upload supporting documents.

My Shipments

GET/api/shipments/my-shipments

List shipments for the authenticated account, paginated.

Query parameters

Param Type Default
page integer 0
count integer 10
curl --location 'https://test-bpass-api.oneport365.com/api/shipments/my-shipments?page=0&count=10' \
  --header 'Authorization: Bearer $TOKEN'

Shipment Details

GET/api/shipments/details/:shipment_id

Retrieve the full record for a single shipment.

Path variables

Variable Type
shipment_id string required

Upload Document

POST/api/shipments/upload-document/:shipment_id

Attach a document to a shipment. Sent as multipart/form-data.

Path variables

Variable Type
shipment_id string required

Form-data fields

Field Type Example
shipment_file file @/path/to/file
document_name string nxp_document
document_type string main
curl --location 'https://test-bpass-api.oneport365.com/api/shipments/upload-document/:shipment_id' \
  --header 'Authorization: Bearer $TOKEN' \
  --form 'shipment_file=@"/path/to/file"' \
  --form 'document_name="nxp_document"' \
  --form 'document_type="main"'
v1 · DaaS
DeprecatedYou are reading the v1 docs. v1 will be retired soon; new integrations should use v2. See Migrating from v1.

DaaS

Reference data used when building bookings and shipments.

Commodity Types

GET/api/daas/commodity-types

Look up commodity reference data, filtered by HS code, type, category and description.

Query parameters

Param Type Example
hs_code string 104201
commodity_type string Agro Commodities
commodity_category string Rice
commodity_description string oilcake
curl --location 'https://test-bpass-api.oneport365.com/api/daas/commodity-types?hs_code=104201&commodity_type=Agro%20Commodities&commodity_category=Rice&commodity_description=oilcake' \
  --header 'Authorization: Bearer $TOKEN'
v1 · Live Rates
DeprecatedYou are reading the v1 docs. v1 will be retired soon; new integrations should use v2. See Migrating from v1.

Live Rates

Retrieve live rate results for a search, confirm them, and select one to carry into a booking.

Get Live Rates

GET/api/live-rates/get/:shipment_id

Retrieve live rate results for a prior rate search.

Path variables

Variable Type
shipment_id string required

Query parameters

Param Type Example
type string lowest_prices
is_agent boolean true
curl --location 'https://test-bpass-api.oneport365.com/api/live-rates/get/:shipment_id?type=lowest_prices&is_agent=true' \
  --header 'Authorization: Bearer $TOKEN'

Confirm Live Rates

POST/api/live-rates/confirm/:search_id

Confirm a rate result for a search before selecting it.

Path variables

Variable Type
search_id string required

Body

Field Type
instant_result_id string required
rates_currency string required
{
  "instant_result_id": "63b53f593e411699769e59b4",
  "rates_currency": "NGN"
}

Select Rate

POST/api/live-rates/select/:search_id

Select a specific rate result to carry into a booking.

Path variables

Variable Type
search_id string required

Body

Field Type
rate_result_id string required
currency string required
{
  "rate_result_id": "65bcfad4552ad0567483d199",
  "currency": "NGN"
}