Plum Guide API - Integration Certification Plan
Overview
This certification plan outlines the requirements for partners integrating with the Plum Guide API v2. The API supports two integration paths depending on your pricing and availability management approach.
| Integration Path | Description |
|---|---|
| LoS Matrix | Combined pricing/availability via CSV matrix upload |
| Standard | Granular control via individual pricing & availability endpoints |
Key Concept: If you use the Length of Stay (LoS) Matrix endpoint, you do NOT need to use the individual pricing and availability endpoints. The matrix handles both comprehensively. Choose one path based on your system's capabilities.
Integration Paths
Path A: LoS Matrix Integration
The LoS Matrix provides a single endpoint to manage both pricing and availability through a CSV-based matrix upload. This is the recommended approach if your system can generate pricing matrices.
What it replaces:
- Custom nightly pricing endpoints
- Seasonal pricing endpoints
- Discount endpoints
- Availability restrictions
What you still need:
- Authentication
- Listings management
- Bookings management
- Webhooks (recommended)
Path B: Standard Integration
Use individual endpoints for granular control over pricing and availability. This path requires implementing multiple endpoints but offers more flexibility.
Required endpoints:
- Authentication
- Listings management
- Availability management (restrictions + blocked dates)
- Custom nightly pricing
- Seasonal pricing
- Discounts
- Fees (cleaning fee if applicable)
- Bookings management
- Webhooks (recommended)
Certification Requirements
Phase 1: Foundation (Required for ALL integrations)
1.1 Authentication
| Test Case | Endpoint | Expected Result |
|---|---|---|
| Obtain access token | POST /authenticate | Receive JWT token with expiry |
| Use valid token | Any authenticated endpoint | 200 OK response |
| Handle expired token | Any authenticated endpoint | 403, then re-authenticate |
| Handle invalid credentials | POST /authenticate | 400 Bad Request |
Acceptance Criteria:
-
Successfully authenticate with valid credentials
-
Store and reuse the token until expiry
-
Implement token refresh before expiry
-
Handle authentication errors gracefully
1.2 Listings Management
| Test Case | Endpoint | Expected Result |
|---|---|---|
| Create a listing | POST /v2/listing | 201 Created with listingId |
| Retrieve listing details | GET /v2/listing/{listingId} | 200 OK with listing data |
| Update listing | PATCH /v2/listing/{listingId} | 200 OK |
| Retrieve all listings | GET /v2/listings | 200 OK with paginated results |
Acceptance Criteria:
- Create a listing with required fields (address, coordinates, currency)
- Map external property IDs (Integration ID, Airbnb ID, PM ID)
- Handle pagination correctly (limit 1-100, offset)
- Update listing configuration as needed
1.3 Bookings Management
| Test Case | Endpoint | Expected Result |
|---|---|---|
| Get bookings by listing | GET /v2/bookings/{listingId} | 200 OK with bookings |
| Get booking by code | GET /v2/bookings/{bookingCode} | 200 OK with booking details |
| Get all host bookings | GET /v2/bookings | 200 OK paginated |
| Get booking activities | GET /v2/bookings/activities | 200 OK with activity log |
| Filter by date range | GET /v2/bookings?startDate=&endDate= | Filtered results |
| Create test booking (sandbox) | POST /testdata/booking | 201 Created |
Booking Statuses to Handle:
Requested- Awaiting host approval (Request to Book)Confirmed- Payment processed, booking active (Instant Book or Host Approved the booking)Declined- Host rejectedCancelled- Booking cancelled
Acceptance Criteria:
- Retrieve and parse all booking fields correctly
- Handle all booking statuses
- Extract the guest proxy email for communication
- Implement pagination for large result sets
- Create test bookings in the sandbox for testing
1.4 Webhooks Configuration (Recommended)
| Test Case | Endpoint | Expected Result |
|---|---|---|
| Create webhook config | POST /v2/webhooks/config | 201 Created |
| Get webhook config | GET /v2/webhooks/config | 200 OK |
| Update webhook config | PUT /v2/webhooks/config | 200 OK |
| Toggle webhook on/off | PATCH /v2/webhooks/config/toggle | 200 OK |
| Delete webhook config | DELETE /v2/webhooks/config | 204 No Content |
Webhook Events to Handle:
- Booking Requested
- Booking Confirmed (Instant Book)
- Booking Approved
- Booking Declined
- Booking Cancelled
Acceptance Criteria:
- Configure webhook endpoint URL
- Receive and process webhook payloads
- Handle webhook delivery retries
- Implement idempotency for duplicate events
- Toggle webhooks without losing configuration
Phase 2A: LoS Matrix Integration Path
Complete this phase ONLY if using the LoS Matrix approach
2A.1 LoS Matrix Upload
| Test Case | Endpoint | Expected Result |
|---|---|---|
| Upload pricing matrix | POST /v2/listings/{listingId}/pricing/matrix | 202 Accepted |
| Upload with breakdown | POST /v2/listings/{listingId}/pricing/matrix/breakdown | 202 Accepted |
| Get matrix metadata | GET /v2/listings/{listingId}/pricing/matrix | 200 OK |
| Delete matrix | DELETE /v2/listings/{listingId}/pricing/matrix | 204 No Content |
Matrix Requirements:
- CSV format with dates and length-of-stay columns
- Idempotency key required (unique per matrix version)
- Optional currency code parameter
- Asynchronous processing (202 response)
Breakdown Matrix (Optional):
- Includes accommodation, fees, and taxes separately
- More detailed pricing breakdown for transparency
Acceptance Criteria:
- Generate a valid CSV matrix format
- Include all required date ranges
- Generate unique idempotency keys per upload
- Handle 202 async response correctly
- Handle 422 validation errors
- Verify matrix applied via the GET endpoint
- Delete and replace the matrix when needed
Phase 2B: Standard Integration Path
Complete this phase ONLY if NOT using the LoS Matrix approach
2B.1 Availability Management
| Test Case | Endpoint | Expected Result |
|---|---|---|
| Set availability restrictions | POST /v2/listings/{listingId}/availability | 200 OK |
| Get availability | GET /v2/listings/{listingId}/availability | 200 OK |
| Delete availability | DELETE /v2/listings/{listingId}/availability | 204 No Content |
| Add blocked dates | POST /v2/listings/{listingId}/availability/blockeddates | 201 Created |
| Get blocked dates | GET /v2/listings/{listingId}/availability/blockeddates | 200 OK |
| Delete blocked dates | DELETE /v2/listings/{listingId}/availability/blockeddates | 204 No Content |
| Bulk delete blocked dates | POST /v2/listings/{listingId}/availability/blockeddates/deletebulk | 200 OK |
Availability Restrictions:
minDaysBeforeCheckin- Minimum advance booking daysseasonalMinimumNights- Minimum night requirementschangeOverDays- Allowed check-in/check-out days
Bulk Operation Limits:
- Maximum 100 date ranges per request
- Maximum 730 individual dates per request
Acceptance Criteria:
- Set seasonal availability restrictions
- Block specific date ranges
- Sync blocked dates from the external calendar
- Handle bulk operations within limits
- Remove availability when the property is delisted
2B.2 Custom Nightly Pricing
| Test Case | Endpoint | Expected Result |
|---|---|---|
| Set custom prices | POST /v2/listings/{listingId}/pricing/custom | 200 OK |
| Get custom prices | GET /v2/listings/{listingId}/pricing/custom | 200 OK paginated |
| Delete custom prices | DELETE /v2/listings/{listingId}/pricing/custom | 204 No Content |
| Bulk delete prices | POST /v2/listings/{listingId}/pricing/custom/deletebulk | 200 OK |
Acceptance Criteria:
- Set nightly prices for specific date ranges
- Override seasonal pricing with custom rates
- Handle pagination for large date ranges
- Bulk delete within limits (100 ranges / 730 dates)
2B.3 Seasonal Pricing
| Test Case | Endpoint | Expected Result |
|---|---|---|
| Set seasonal pricing | POST /v2/listings/{listingId}/pricing/seasonal | 200 OK |
| Get seasonal pricing | GET /v2/listings/{listingId}/pricing/seasonal | 200 OK paginated |
| Delete seasonal pricing | DELETE /v2/listings/{listingId}/pricing/seasonal | 204 No Content |
Seasonal Pricing Features:
- Base nightly rate per season
- Weekend rate differentiation
- Guest fee configuration
Acceptance Criteria:
- Define pricing seasons with date ranges
- Set base rates and weekend rates
- Configure additional guest fees
- Handle overlapping seasons correctly
2B.4 Discounts
| Test Case | Endpoint | Expected Result |
|---|---|---|
| Create discount | POST /v2/listings/{listingId}/pricing/discount | 201 Created |
| Get a discount config | GET /v2/listings/{listingId}/pricing/discount | 200 OK |
| Delete discount | DELETE /v2/listings/{listingId}/pricing/discount | 204 No Content |
Discount Types:
- Length of stay discounts (weekly, monthly)
- Early Bird discounts
- Last Minute discounts
Note: POST overrides any existing discount configuration
Acceptance Criteria:
- Configure length-of-stay discounts
- Set early bird / last minute promotions
- Understand discount override behavior
2B.5 Cleaning Fee
| Test Case | Endpoint | Expected Result |
|---|---|---|
| Set cleaning fee | POST /v2/listings/{listingId}/pricing/fees/cleaningfee | 200 OK |
| Get the cleaning fee | GET /v2/listings/{listingId}/pricing/fees/cleaningfee | 200 OK |
Acceptance Criteria:
- Set the cleaning fee amount
- Update the cleaning fee when changes
Certification Checklist Summary
Path A: LoS Matrix Integration
- Phase 1.1 - Authentication
- Phase 1.2 - Listings Management
- Phase 1.3 - Bookings Management
- Phase 1.4 - Webhooks Configuration
- Phase 2A.1 - LoS Matrix Upload
Path B: Standard Integration
- Phase 1.1 - Authentication
- Phase 1.2 - Listings Management
- Phase 1.3 - Bookings Management
- Phase 1.4 - Webhooks Configuration
- Phase 2B.1 - Availability Management
- Phase 2B.2 - Custom Nightly Pricing
- Phase 2B.3 - Seasonal Pricing
- Phase 2B.4 - Discounts
- Phase 2B.5 - Cleaning Fee
Testing Environment
| Environment | Base URL |
|---|---|
| Sandbox | https://sandbox.api.plumguide.com |
| Production | https://api.plumguide.com |
Sandbox Testing
- Use sandbox credentials for all testing
- Create test bookings via
POST /testdata/booking - Test all endpoints before production deployment
- Verify webhook delivery to your test endpoint
Error Handling Requirements
All integrations must handle these response codes:
| Status Code | Meaning | Required Action |
|---|---|---|
| 200 OK | Success | Process response |
| 201 Created | Resource created | Store returned ID |
| 202 Accepted | Async processing | Poll or await webhook |
| 204 No Content | Deletion successful | Confirm removal |
| 400 Bad Request | Validation error | Parse error details, fix request |
| 401 Unauthorized | Invalid/expired token | Re-authenticate |
| 404 Not Found | Resource missing | Handle gracefully |
| 422 Unprocessable | Invalid data | Review payload format |
Pagination Standards
For endpoints returning lists:
- Default limit: 20 items
- Maximum limit: 100 items
- Use
offsetparameter for navigation - Always check for additional pages
GET /v2/bookings?limit=50&offset=0
GET /v2/bookings?limit=50&offset=50
Support & Resources
- API Documentation: https://docs.api.plumguide.com/reference/getting-started
- Swagger UI: https://sandbox.api.plumguide.com/swagger/index.html
- Technical Support: [email protected]
Certification Process
- Development - Implement against sandbox environment
- Self-Testing - Complete all applicable test cases above
- Review - Submit integration for Plum Guide review
- Certification - Receive approval and production credentials
- Go-Live - Deploy to production
