Getting Started
The Grasshopper Retailer Integration enables shippers to programmatically create and manage orders inside Grasshopper, with full lifecycle visibility from order creation through final delivery.
Through a combination of REST APIs and event-driven webhooks, your system can:
- Create final-mile orders via Grasshopper's external APIs
- Assign orders to manifests for planning and execution
- Track orders and individual line items across their full lifecycle
- Receive real-time updates via webhook events
- Retrieve POD, signatures, and delivery images once orders reach terminal status
Who this guide is for
Integration Developers
Building the connection between your OMS/ERP and Grasshopper.
Solution Architects
Designing order flow, lifecycle tracking, and asset retrieval.
Product & Operations
Owning the end-to-end retailer-to-delivery workflow.
The Integration Lifecycle
Every retailer integration follows the same six-step path. Each step builds on the last.
Shipper Setup
Carrier configures the shipper inside Grasshopper.
API User
Create a dedicated user for authentication.
Authenticate
Exchange credentials for an access token.
Create Orders
POST new final-mile orders to the API.
Subscribe to Webhooks
Receive lifecycle updates in real-time.
Retrieve Assets
Download POD & images on terminal status.
Step 1: Configure the Shipper in Grasshopper
Before any API integration begins, the shipper must be created and configured inside the Grasshopper UI. This step is performed by the carrier within their Grasshopper environment.
Required Information
- Primary contact first name
- Primary contact last name
- Primary contact email address
- Company name
- Company address
- Any additional retailer configuration fields required by the carrier workflow
This configuration establishes the shipper as an active entity in Grasshopper and binds your integration to the correct business account. The retailer.identifier used in order creation must match this configured shipper.
Step 2: Create an API User
Once the shipper exists in Grasshopper, create a dedicated user under that shipper's users to handle API authentication. A valid user profile is required before any API access can begin.
Required Credentials
email— used as the username for token generationpassword— used as the secret for authentication
The email on this API user will also receive system-generated order-creation confirmations. Use a system or integration mailbox (e.g. api-integration@yourcompany.com) instead of a personal inbox.
What else this user can do
- Log in to the shipper UI when needed
- Validate credentials during testing
- Trigger password resets (sent to the email above)
Step 3: Authenticate
Authentication must be completed before any API access begins. Use the API user credentials created in Step 2 to obtain an access token.
Request
Send credentials as application/x-www-form-urlencoded:
curl --location -g '{{url}}/api/rest/auth' \
--data-urlencode 'user_name={{username}}' \
--data-urlencode 'password={{password}}'
Behavior
- Valid credentials: Grasshopper returns the authentication tokens required for subsequent API requests
- Invalid credentials: the request is rejected and the integration must not proceed
Full schema and examples: Postman Authentication Docs →
Step 4: Create an Order
The Order Creation API allows retailers to create new final-mile orders in Grasshopper for operational planning, manifest assignment, and downstream delivery execution.
Required Headers
Content-Type: application/jsonAuthorization: {{access_token}}
Example Request
curl --location -g '{{url}}/api/orders' \
--header 'Content-Type: application/json' \
--header 'Authorization: {{access_token}}' \
--data-raw '{
"order": {
"retailer": { "identifier": "gh3test" },
"service_level": "WG",
"ref_order_number": "1123456",
"customer": {
"first_name": "Ori",
"last_name": "Anavim",
"address": {
"address1": "123 Main",
"city": "Charlotte",
"state": "NC",
"zip": "28277"
},
"phone1": { "number": "987-858-8558" },
"email": "ori@email.com"
},
"line_items": [
{
"quantity": 1,
"weight": 123,
"cube": 33,
"sku": "item_sku-1",
"name": "item-description-test"
}
]
}
}'
Rely on the order_created webhook event as confirmation that an order was successfully accepted. Subscribe to it and use it to reconcile orders on your side.
The ref_order_number field is not enforced as unique. If you require deduplication, enforce it on your side before submission.
Full schema and live examples: POST Create New Order [Final Mile Only] →
Step 5: Subscribe to Lifecycle Webhooks
Grasshopper tracks status at two levels and emits webhook events at both levels so your system always has an accurate picture of where each order and item is in its lifecycle.
Order vs. Item Status
- Item-level status — each individual line item has its own independent lifecycle
- Order-level status — an aggregated view; the order reflects the least advanced state across its items
If an order has 5 items and 4 are Received but 1 is still Pending Arrival, the order status remains Pending Arrival. Only when all 5 items reach Received does the order transition.
Order-Level Events
| Event | Description |
|---|---|
| order_created | Order created in Grasshopper |
| order_complete_stop | Order completed (Delivered / Rejected / Delivery Failed / Damaged) |
| order_updated | Order information has been updated |
| order_status_changed | Order status was changed |
| tracking_changed | Tracking entry was added |
| notes_added | Note was added to the order |
| notes_updated | Note was updated |
| delivery_changed | Delivery date was changed |
| pickup_date_schedule_changed | Pickup date was changed |
| expected_arrival_changed | Expected arrival was changed |
| order_estimated_arrival_changed | Estimated arrival time changed |
| customer_information_changed | Customer information changed on the order |
| service_level_changed | Service level changed |
| asset_added | Image was added to the order |
| asset_removed | Image was removed from the order |
| arrive_on_site | Driver team arrived at the consignee |
Item-Level Events
| Event | Description |
|---|---|
| item_status_changed | Line item status was changed |
| item_damaged | Individual line item was marked as damaged |
| item_added | Item was added |
| item_removed | Item was removed |
| item_updated | Item was updated |
| item_rejected | Individual line item was rejected |
| item_failed_delux | Item did not pass deluxe process |
Subscribing to Webhooks
To register a webhook subscription, provide:
- Topic name — one of the supported topics above
- Method —
POST,PUT, orPATCH - URL — your endpoint that will receive the event payload
Events are asynchronous, may be retried, and may arrive multiple times for the same lifecycle change. Your receiver must process events idempotently and handle duplicate deliveries safely.
Webhook Resources
Step 6: Retrieve POD & Delivery Assets
Once an order reaches a terminal status, you can retrieve final delivery artifacts including Proof of Delivery (POD), signatures, and delivery images.
Terminal Statuses
Download POD
Returns the POD document as a binary file stream. Use after the order reaches a terminal status (typically DELIVERED).
Download Images & Related Assets
Returns all images and related assets as URLs (7-day expiry). Includes POD photos, signatures, damage photos, inspection photos, and more.
Asset Type Reference
| ID | Type |
|---|---|
| 0 | General |
| 1 | Signature [Accept] |
| 2 | Signature [Reject] |
| 4 | Delivery Location |
| 5 | Damage Product |
| 7 | Accept Product |
| 11 | Item Inspection |
| 13 | Bill of Lading |
| 25 | Arrive on Site |
| 26 | eSignature POD |
Assets may not be available immediately when the terminal status webhook fires. Allow a short delay and implement retry logic. Asset URLs are valid for 7 days. If you need long-term retention, persist the assets on your side.
Trigger asset retrieval when you receive a terminal-status webhook event. Store the POD and images locally for customer service, claims, and billing workflows.
Status Reference
Use this reference when interpreting order_status_changed and item_status_changed webhook events.
Immediate Scheduling Eligible
For the full list of statuses and tracking events, see Types & Statuses →
Resources & Next Steps
Postman Collection →
Live, runnable API documentation with all endpoints
SDKs & Client Libraries →
Ready-to-use libraries for popular languages
Webhooks Reference →
Subscription model and event delivery
Types & Statuses →
Full reference for orders, service levels, and events
Help Center →
Answers, guides, and self-service support
Contact Support →
support@grasshopperlabs.io
Start in staging: staging.grasshopperlabs.io. When you're ready to move to production, reach out to your Grasshopper team.